add: [sshd] Years / Months in template
parent
0b40c4e4a3
commit
31b255fda5
|
|
@ -335,6 +335,11 @@ func (s *SshdParser) Compile() error {
|
||||||
<span>
|
<span>
|
||||||
<label for="statsday">Statistics for: </label>
|
<label for="statsday">Statistics for: </label>
|
||||||
<input id="statsday" type="date" value="{{.MaxDate}}" min="{{.MinDate}}" max="{{.MaxDate}}" onchange="currentDay = this.value.replace(/-/g, ''); loadImage(currentDay, currentType)"/>
|
<input id="statsday" type="date" value="{{.MaxDate}}" min="{{.MinDate}}" max="{{.MaxDate}}" onchange="currentDay = this.value.replace(/-/g, ''); loadImage(currentDay, currentType)"/>
|
||||||
|
<select>
|
||||||
|
{{range .YearList}}
|
||||||
|
<option value="{{.}}">{{.}}</option>
|
||||||
|
{{end}}
|
||||||
|
</select>
|
||||||
</span>
|
</span>
|
||||||
<span>
|
<span>
|
||||||
<label for="statstype">Type: </label>
|
<label for="statstype">Type: </label>
|
||||||
|
|
@ -364,29 +369,92 @@ func (s *SshdParser) Compile() error {
|
||||||
parsedOldestStr := parsedOldest.Format("2006-01-02")
|
parsedOldestStr := parsedOldest.Format("2006-01-02")
|
||||||
parsedNewestStr := parsedNewest.Format("2006-01-02")
|
parsedNewestStr := parsedNewest.Format("2006-01-02")
|
||||||
|
|
||||||
check := func(err error) {
|
// Gettings list of years for which we have statistics
|
||||||
if err != nil {
|
reply, err := redis.Values(r.Do("SCAN", "0", "MATCH", "????:*", "COUNT", 1000))
|
||||||
log.Fatal(err)
|
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)
|
t, err := template.New("webpage").Parse(tpl)
|
||||||
check(err)
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
data := struct {
|
data := struct {
|
||||||
Title string
|
Title string
|
||||||
Current string
|
Current string
|
||||||
MinDate string
|
MinDate string
|
||||||
MaxDate string
|
MaxDate string
|
||||||
|
YearList []string
|
||||||
|
MonthList map[string][]string
|
||||||
}{
|
}{
|
||||||
Title: "sshd failed logins statistics",
|
Title: "sshd failed logins statistics",
|
||||||
MinDate: parsedOldestStr,
|
MinDate: parsedOldestStr,
|
||||||
MaxDate: parsedNewestStr,
|
MaxDate: parsedNewestStr,
|
||||||
Current: newest,
|
Current: newest,
|
||||||
|
YearList: years,
|
||||||
|
MonthList: months,
|
||||||
}
|
}
|
||||||
f, err := os.OpenFile("statistics.html", os.O_RDWR|os.O_CREATE, 0666)
|
f, err := os.OpenFile("statistics.html", os.O_RDWR|os.O_CREATE, 0666)
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
err = t.Execute(f, data)
|
err = t.Execute(f, data)
|
||||||
check(err)
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -416,7 +484,8 @@ func plotStats(s *SshdParser, v string) error {
|
||||||
|
|
||||||
p, err := plot.New()
|
p, err := plot.New()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
r.Close()
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
stype := strings.Split(v, ":")
|
stype := strings.Split(v, ":")
|
||||||
|
|
@ -449,6 +518,7 @@ func plotStats(s *SshdParser, v string) error {
|
||||||
if _, err := os.Stat("data"); os.IsNotExist(err) {
|
if _, err := os.Stat("data"); os.IsNotExist(err) {
|
||||||
err := os.Mkdir("data", 0700)
|
err := os.Mkdir("data", 0700)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -456,6 +526,7 @@ func plotStats(s *SshdParser, v string) error {
|
||||||
if _, err := os.Stat(filepath.Join("data", "sshd")); os.IsNotExist(err) {
|
if _, err := os.Stat(filepath.Join("data", "sshd")); os.IsNotExist(err) {
|
||||||
err := os.Mkdir(filepath.Join("data", "sshd"), 0700)
|
err := os.Mkdir(filepath.Join("data", "sshd"), 0700)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
return err
|
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) {
|
if _, err := os.Stat(filepath.Join("data", "sshd", stype[0])); os.IsNotExist(err) {
|
||||||
err := os.Mkdir(filepath.Join("data", "sshd", stype[0]), 0700)
|
err := os.Mkdir(filepath.Join("data", "sshd", stype[0]), 0700)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xsize := 3 + vg.Length(math.Round(float64(len(keys)/2)))
|
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 {
|
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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue