From 7fa2e37607917112670c93b617cf9a0269ab6836 Mon Sep 17 00:00:00 2001 From: Mario Trangoni Date: Tue, 4 Dec 2018 16:10:28 +0100 Subject: [PATCH 1/4] postfix_exporter.go: Fix some gosec issues. See, $ gometalinter --vendor ./... postfix_exporter.go:249::warning: Potential file inclusion via variable,MEDIUM,HIGH (gosec) postfix_exporter.go:80::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:121::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:296::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:298::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:300::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:302::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:309::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:311::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:313::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:315::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:322::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:324::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:333::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:335::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:337::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:339::warning: Errors unhandled.,LOW,HIGH (gosec) postfix_exporter.go:650::warning: Errors unhandled.,LOW,HIGH (gosec) --- postfix_exporter.go | 86 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 69 insertions(+), 17 deletions(-) diff --git a/postfix_exporter.go b/postfix_exporter.go index d7b56fe..78f8d28 100644 --- a/postfix_exporter.go +++ b/postfix_exporter.go @@ -77,7 +77,10 @@ type PostfixExporter struct { // for null bytes in the first 128 bytes of output. func CollectShowqFromReader(file io.Reader, ch chan<- prometheus.Metric) error { reader := bufio.NewReader(file) - buf, _ := reader.Peek(128) + buf, err := reader.Peek(128) + if err != nil { + log.Printf("Could not read postfix output, %v", err) + } if bytes.IndexByte(buf, 0) >= 0 { return CollectBinaryShowqFromReader(reader, ch) } @@ -118,7 +121,11 @@ func CollectTextualShowqFromReader(file io.Reader, ch chan<- prometheus.Metric) } now := time.Now() - location, _ := time.LoadLocation("Local") + location, err := time.LoadLocation("Local") + if err != nil { + log.Println(err) + } + for scanner.Scan() { matches := messageLine.FindStringSubmatch(scanner.Text()) if matches != nil { @@ -293,35 +300,65 @@ func (e *PostfixExporter) CollectFromLogline(line string) { } } else if logMatches[1] == "lmtp" { if lmtpMatches := lmtpPipeSMTPLine.FindStringSubmatch(logMatches[2]); lmtpMatches != nil { - pdelay, _ := strconv.ParseFloat(lmtpMatches[2], 64) + pdelay, err := strconv.ParseFloat(lmtpMatches[2], 64) + if err != nil { + log.Printf("Couldn't convert LMTP pdelay: %v", err) + } e.lmtpDelays.WithLabelValues("before_queue_manager").Observe(pdelay) - adelay, _ := strconv.ParseFloat(lmtpMatches[3], 64) + adelay, err := strconv.ParseFloat(lmtpMatches[3], 64) + if err != nil { + log.Printf("Couldn't convert LMTP adelay: %v", err) + } e.lmtpDelays.WithLabelValues("queue_manager").Observe(adelay) - sdelay, _ := strconv.ParseFloat(lmtpMatches[4], 64) + sdelay, err := strconv.ParseFloat(lmtpMatches[4], 64) + if err != nil { + log.Printf("Couldn't convert LMTP adelay: %v", err) + } e.lmtpDelays.WithLabelValues("connection_setup").Observe(sdelay) - xdelay, _ := strconv.ParseFloat(lmtpMatches[5], 64) + xdelay, err := strconv.ParseFloat(lmtpMatches[5], 64) + if err != nil { + log.Printf("Couldn't convert LMTP xdelay: %v", err) + } e.lmtpDelays.WithLabelValues("transmission").Observe(xdelay) } else { e.unsupportedLogEntries.WithLabelValues(logMatches[1]).Inc() } } else if logMatches[1] == "pipe" { if pipeMatches := lmtpPipeSMTPLine.FindStringSubmatch(logMatches[2]); pipeMatches != nil { - pdelay, _ := strconv.ParseFloat(pipeMatches[2], 64) + pdelay, err := strconv.ParseFloat(pipeMatches[2], 64) + if err != nil { + log.Printf("Couldn't convert PIPE pdelay: %v", err) + } e.pipeDelays.WithLabelValues(pipeMatches[1], "before_queue_manager").Observe(pdelay) - adelay, _ := strconv.ParseFloat(pipeMatches[3], 64) + adelay, err := strconv.ParseFloat(pipeMatches[3], 64) + if err != nil { + log.Printf("Couldn't convert PIPE adelay: %v", err) + } e.pipeDelays.WithLabelValues(pipeMatches[1], "queue_manager").Observe(adelay) - sdelay, _ := strconv.ParseFloat(pipeMatches[4], 64) + sdelay, err := strconv.ParseFloat(pipeMatches[4], 64) + if err != nil { + log.Printf("Couldn't convert PIPE sdelay: %v", err) + } e.pipeDelays.WithLabelValues(pipeMatches[1], "connection_setup").Observe(sdelay) - xdelay, _ := strconv.ParseFloat(pipeMatches[5], 64) + xdelay, err := strconv.ParseFloat(pipeMatches[5], 64) + if err != nil { + log.Printf("Couldn't convert PIPE xdelay: %v", err) + } e.pipeDelays.WithLabelValues(pipeMatches[1], "transmission").Observe(xdelay) } else { e.unsupportedLogEntries.WithLabelValues(logMatches[1]).Inc() } } else if logMatches[1] == "qmgr" { if qmgrInsertMatches := qmgrInsertLine.FindStringSubmatch(logMatches[2]); qmgrInsertMatches != nil { - size, _ := strconv.ParseFloat(qmgrInsertMatches[1], 64) + size, err := strconv.ParseFloat(qmgrInsertMatches[1], 64) + if err != nil { + log.Printf("Couldn't convert QMGR size: %v", err) + } e.qmgrInsertsSize.Observe(size) - nrcpt, _ := strconv.ParseFloat(qmgrInsertMatches[2], 64) + nrcpt, err := strconv.ParseFloat(qmgrInsertMatches[2], 64) + if err != nil { + log.Printf("Couldn't convert QMGR nrcpt: %v", err) + } e.qmgrInsertsNrcpt.Observe(nrcpt) } else if strings.HasSuffix(logMatches[2], ": removed") { e.qmgrRemoves.Inc() @@ -330,13 +367,25 @@ func (e *PostfixExporter) CollectFromLogline(line string) { } } else if logMatches[1] == "smtp" { if smtpMatches := lmtpPipeSMTPLine.FindStringSubmatch(logMatches[2]); smtpMatches != nil { - pdelay, _ := strconv.ParseFloat(smtpMatches[2], 64) + pdelay, err := strconv.ParseFloat(smtpMatches[2], 64) + if err != nil { + log.Printf("Couldn't convert SMTP pdelay: %v", err) + } e.smtpDelays.WithLabelValues("before_queue_manager").Observe(pdelay) - adelay, _ := strconv.ParseFloat(smtpMatches[3], 64) + adelay, err := strconv.ParseFloat(smtpMatches[3], 64) + if err != nil { + log.Printf("Couldn't convert SMTP adelay: %v", err) + } e.smtpDelays.WithLabelValues("queue_manager").Observe(adelay) - sdelay, _ := strconv.ParseFloat(smtpMatches[4], 64) + sdelay, err := strconv.ParseFloat(smtpMatches[4], 64) + if err != nil { + log.Printf("Couldn't convert SMTP sdelay: %v", err) + } e.smtpDelays.WithLabelValues("connection_setup").Observe(sdelay) - xdelay, _ := strconv.ParseFloat(smtpMatches[5], 64) + xdelay, err := strconv.ParseFloat(smtpMatches[5], 64) + if err != nil { + log.Printf("Couldn't convert SMTP xdelay: %v", err) + } e.smtpDelays.WithLabelValues("transmission").Observe(xdelay) } else if smtpTLSMatches := smtpTLSLine.FindStringSubmatch(logMatches[2]); smtpTLSMatches != nil { e.smtpTLSConnects.WithLabelValues(smtpTLSMatches[1:]...).Inc() @@ -647,7 +696,7 @@ func main() { http.Handle(*metricsPath, prometheus.Handler()) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte(` + _, err = w.Write([]byte(` Postfix Exporter @@ -655,6 +704,9 @@ func main() {

Metrics

`)) + if err != nil { + panic(err) + } }) log.Print("Listening on ", *listenAddress) From b22b536722a568455ab45ebbd5202c3458976a58 Mon Sep 17 00:00:00 2001 From: Mario Trangoni Date: Tue, 4 Dec 2018 16:15:33 +0100 Subject: [PATCH 2/4] .gitignore: Exclude binary and vim editor temporary files. --- .gitignore | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 27626c8..f238da4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,9 @@ +# Editor files +*~ +-.idea/ + +# Test binary, build with `go test -c` +*.test + +# Binaries postfix_exporter -.idea/ From 76f8dd448baf910ddcccab643ecc316fbedba5a8 Mon Sep 17 00:00:00 2001 From: Mario Trangoni Date: Tue, 4 Dec 2018 16:50:01 +0100 Subject: [PATCH 3/4] postfix_exporter.go: Comment out unused `CollectShowqFromFile` function See, $ gometalinter --vendor ./... postfix_exporter.go:256:1:warning: CollectShowqFromFile is unused (deadcode) --- postfix_exporter.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/postfix_exporter.go b/postfix_exporter.go index 78f8d28..795c5d9 100644 --- a/postfix_exporter.go +++ b/postfix_exporter.go @@ -252,14 +252,14 @@ func CollectBinaryShowqFromReader(file io.Reader, ch chan<- prometheus.Metric) e } // CollectShowqFromFile collects Postfix queue statistics from a file. -func CollectShowqFromFile(path string, ch chan<- prometheus.Metric) error { - fd, err := os.Open(path) - if err != nil { - return err - } - defer fd.Close() - return CollectShowqFromReader(fd, ch) -} +//func CollectShowqFromFile(path string, ch chan<- prometheus.Metric) error { +// fd, err := os.Open(path) +// if err != nil { +// return err +// } +// defer fd.Close() +// return CollectShowqFromReader(fd, ch) +//} // CollectShowqFromSocket collects Postfix queue statistics from a socket. func CollectShowqFromSocket(path string, ch chan<- prometheus.Metric) error { From a0059f793e69166d4ce3280891eb1b7f61cc1772 Mon Sep 17 00:00:00 2001 From: Mario Trangoni Date: Tue, 4 Dec 2018 17:13:17 +0100 Subject: [PATCH 4/4] systemd.go: Fix gosec issue. See, $ gometalinter --vendor ./... systemd.go:49::warning: Errors unhandled.,LOW,HIGH (gosec) --- systemd.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/systemd.go b/systemd.go index c263e35..9a78ff8 100644 --- a/systemd.go +++ b/systemd.go @@ -46,8 +46,10 @@ func NewJournal(unit, slice, path string) (j *Journal, err error) { } // Start at end of journal - j.SeekRealtimeUsec(uint64(time.Now().UnixNano() / 1000)) - + err = j.SeekRealtimeUsec(uint64(time.Now().UnixNano() / 1000)) + if err != nil { + log.Printf("%v", err) + } return }