diff --git a/main.go b/main.go new file mode 100644 index 0000000..94aeb92 --- /dev/null +++ b/main.go @@ -0,0 +1,74 @@ +// vi:ts=4:sts=4:sw=4:noet:tw=72 +// +// logforward +// +// Copyright (c) 2018 Andreas Neue + +package main + +import ( + "bufio" + "bytes" + "compress/gzip" + "flag" + "fmt" + "os" + "time" + + "git.dnix.de/an/xlog" + goscp "github.com/bramvdbogaerde/go-scp" + "github.com/bramvdbogaerde/go-scp/auth" + "golang.org/x/crypto/ssh" +) + +var ( + bufferLimit = flag.Int("b", 1024*1024*1024, "Buffer size limit") + scpUser = flag.String("u", "", "User") + scpHost = flag.String("h", "localhost:22", "Host:Port") + scpKey = flag.String("k", "", "Key") + filePrefix = flag.String("p", "log-", "Filename prefix") +) + +func init() { + flag.Parse() +} + +func main() { + log := "" + reader := bufio.NewReader(os.Stdin) + for { + time.Sleep(1 * time.Microsecond) + line, err := reader.ReadString('\n') + if err != nil { + xlog.Error(err.Error()) + } else { + log += line + fmt.Printf("%d\r", len(log)) + if len(log) >= *bufferLimit { + l := []byte(log) + go gzipAndSend(l) + log = "" + } + } + } +} + +func gzipAndSend(l []byte) { + var b bytes.Buffer + fmt.Printf("\nSending buffer ...\n") + w := gzip.NewWriter(&b) + w.Write(l) + w.Close() + r := bufio.NewReader(&b) + clientConfig, _ := auth.PrivateKey(*scpUser, *scpKey, ssh.InsecureIgnoreHostKey()) + client := goscp.NewClient(*scpHost, &clientConfig) + err := client.Connect() + if err != nil { + fmt.Printf(err.Error() + "\n") + return + } + t := time.Now() + date := t.Format("20060102150405") + client.CopyFile(r, *filePrefix+date+".gz", "0644") + fmt.Printf("Buffer sent\n") +}