From b98b107581b2683a2526ba8a9f6a8b3a5b240fc7 Mon Sep 17 00:00:00 2001 From: Parnic Date: Fri, 28 Dec 2018 09:29:36 -0600 Subject: [PATCH] Initial code commit --- .gitignore | 3 ++ main.go | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 main.go diff --git a/.gitignore b/.gitignore index f1c181e..cb7679d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out + +go-journald-monitor +lastCursor* diff --git a/main.go b/main.go new file mode 100644 index 0000000..69c3c0c --- /dev/null +++ b/main.go @@ -0,0 +1,82 @@ +package main + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "io/ioutil" + "os/exec" + "strings" +) + +var ( + unit = flag.String("unit", "", "specifies a unit to filter the journald output for") +) + +const ( + cursorPrefix = "-- cursor: " + cursorFilenameBase = "lastCursor" +) + +func main() { + flag.Parse() + + parseJournalData(getJournalData()) +} + +func getJournalData() (cursorFilename, lastCursor string, output []byte) { + cursorFilename, lastCursor = getLastCursor() + + var err error + if output, err = getCmd(lastCursor).Output(); err != nil { + panic(err) + } + + return +} + +func getLastCursor() (cursorFilename, lastCursor string) { + cursorFilename = cursorFilenameBase + if len(*unit) > 0 { + cursorFilename = fmt.Sprintf("%s-%s", cursorFilenameBase, *unit) + } + + lastCursorBytes, _ := ioutil.ReadFile(cursorFilename) + lastCursor = string(lastCursorBytes) + + return +} + +func getCmd(lastCursor string) (cmd *exec.Cmd) { + cmd = exec.Command("journalctl", "--quiet", "--show-cursor", "--no-pager") + if len(*unit) > 0 { + cmd.Args = append(cmd.Args, []string{ + "-u", + *unit, + }...) + } + if len(lastCursor) > 0 { + cmd.Args = append(cmd.Args, fmt.Sprintf("--after-cursor=%s", lastCursor)) + } + + return +} + +func parseJournalData(cursorFilename, lastCursor string, output []byte) { + buf := bytes.NewBuffer(output) + scanner := bufio.NewScanner(buf) + + for hasData := true; hasData; hasData = scanner.Scan() { + handleLine(scanner.Text(), lastCursor, cursorFilename) + } +} + +func handleLine(line, lastCursor, cursorFilename string) { + if strings.HasPrefix(line, cursorPrefix) { + lastCursor = line[len(cursorPrefix):] + ioutil.WriteFile(cursorFilename, []byte(lastCursor), 0664) + } else if len(lastCursor) > 0 && len(line) > 0 { + fmt.Println(line) + } +}