diff --git a/logparser/sshd.go b/logparser/sshd.go
index 09e4c8d..8d253c0 100644
--- a/logparser/sshd.go
+++ b/logparser/sshd.go
@@ -335,6 +335,11 @@ func (s *SshdParser) Compile() error {
+
@@ -364,29 +369,92 @@ func (s *SshdParser) Compile() error {
parsedOldestStr := parsedOldest.Format("2006-01-02")
parsedNewestStr := parsedNewest.Format("2006-01-02")
- check := func(err error) {
- if err != nil {
- log.Fatal(err)
+ // Gettings list of years for which we have statistics
+ reply, err := redis.Values(r.Do("SCAN", "0", "MATCH", "????:*", "COUNT", 1000))
+ if err != nil {
+ r.Close()
+ return err
+ }
+ var cursor int64
+ var items []string
+ _, err = redis.Scan(reply, &cursor, &items)
+ if err != nil {
+ r.Close()
+ return err
+ }
+
+ var years []string
+ for _, v := range items {
+ yearSplit := strings.Split(v, ":")
+ found := false
+ for _, y := range years {
+ if y == yearSplit[0] {
+ found = true
+ }
+ }
+ if !found {
+ years = append(years, yearSplit[0])
}
}
+
+ // Gettings list of months for which we have statistics
+ months := make(map[string][]string)
+ for _, v := range years {
+ var mraw []string
+ reply, err = redis.Values(r.Do("SCAN", "0", "MATCH", v+"??:*", "COUNT", 1000))
+ if err != nil {
+ r.Close()
+ return err
+ }
+
+ _, err = redis.Scan(reply, &cursor, &mraw)
+ if err != nil {
+ r.Close()
+ return err
+ }
+ for _, m := range mraw {
+ m = strings.TrimPrefix(m, v)
+ monthSplit := strings.Split(m, ":")
+ found := false
+ for _, y := range months[v] {
+ if y == monthSplit[0] {
+ found = true
+ }
+ }
+ if !found {
+ months[v] = append(months[v], monthSplit[0])
+ }
+ }
+ }
+
t, err := template.New("webpage").Parse(tpl)
- check(err)
+ if err != nil {
+ r.Close()
+ return err
+ }
data := struct {
- Title string
- Current string
- MinDate string
- MaxDate string
+ Title string
+ Current string
+ MinDate string
+ MaxDate string
+ YearList []string
+ MonthList map[string][]string
}{
- Title: "sshd failed logins statistics",
- MinDate: parsedOldestStr,
- MaxDate: parsedNewestStr,
- Current: newest,
+ Title: "sshd failed logins statistics",
+ MinDate: parsedOldestStr,
+ MaxDate: parsedNewestStr,
+ Current: newest,
+ YearList: years,
+ MonthList: months,
}
f, err := os.OpenFile("statistics.html", os.O_RDWR|os.O_CREATE, 0666)
defer f.Close()
err = t.Execute(f, data)
- check(err)
+ if err != nil {
+ r.Close()
+ return err
+ }
return nil
}
@@ -416,7 +484,8 @@ func plotStats(s *SshdParser, v string) error {
p, err := plot.New()
if err != nil {
- panic(err)
+ r.Close()
+ return err
}
stype := strings.Split(v, ":")
@@ -449,6 +518,7 @@ func plotStats(s *SshdParser, v string) error {
if _, err := os.Stat("data"); os.IsNotExist(err) {
err := os.Mkdir("data", 0700)
if err != nil {
+ r.Close()
return err
}
}
@@ -456,6 +526,7 @@ func plotStats(s *SshdParser, v string) error {
if _, err := os.Stat(filepath.Join("data", "sshd")); os.IsNotExist(err) {
err := os.Mkdir(filepath.Join("data", "sshd"), 0700)
if err != nil {
+ r.Close()
return err
}
}
@@ -463,12 +534,14 @@ func plotStats(s *SshdParser, v string) error {
if _, err := os.Stat(filepath.Join("data", "sshd", stype[0])); os.IsNotExist(err) {
err := os.Mkdir(filepath.Join("data", "sshd", stype[0]), 0700)
if err != nil {
+ r.Close()
return err
}
}
xsize := 3 + vg.Length(math.Round(float64(len(keys)/2)))
if err := p.Save(15*vg.Centimeter, xsize*vg.Centimeter, filepath.Join("data", "sshd", stype[0], fmt.Sprintf("%v.svg", v))); err != nil {
+ r.Close()
return err
}
diff --git a/main.go b/main.go
index b1610bc..4447481 100644
--- a/main.go
+++ b/main.go
@@ -189,6 +189,7 @@ func main() {
if err != nil {
log.Fatal(err)
}
+ compile()
}
// Parsing loop
} else if *fromfile != "" {