@@ -335,6 +335,11 @@ func (s *SshdParser) Compile() error {
335
335
<span>
336
336
<label for="statsday">Statistics for: </label>
337
337
<input id="statsday" type="date" value="{{.MaxDate}}" min="{{.MinDate}}" max="{{.MaxDate}}" onchange="currentDay = this.value.replace(/-/g, ''); loadImage(currentDay, currentType)"/>
338
+ <select>
339
+ {{range .YearList}}
340
+ <option value="{{.}}">{{.}}</option>
341
+ {{end}}
342
+ </select>
338
343
</span>
339
344
<span>
340
345
<label for="statstype">Type: </label>
@@ -364,29 +369,92 @@ func (s *SshdParser) Compile() error {
364
369
parsedOldestStr := parsedOldest .Format ("2006-01-02" )
365
370
parsedNewestStr := parsedNewest .Format ("2006-01-02" )
366
371
367
- check := func (err error ) {
372
+ // Gettings list of years for which we have statistics
373
+ reply , err := redis .Values (r .Do ("SCAN" , "0" , "MATCH" , "????:*" , "COUNT" , 1000 ))
374
+ if err != nil {
375
+ r .Close ()
376
+ return err
377
+ }
378
+ var cursor int64
379
+ var items []string
380
+ _ , err = redis .Scan (reply , & cursor , & items )
381
+ if err != nil {
382
+ r .Close ()
383
+ return err
384
+ }
385
+
386
+ var years []string
387
+ for _ , v := range items {
388
+ yearSplit := strings .Split (v , ":" )
389
+ found := false
390
+ for _ , y := range years {
391
+ if y == yearSplit [0 ] {
392
+ found = true
393
+ }
394
+ }
395
+ if ! found {
396
+ years = append (years , yearSplit [0 ])
397
+ }
398
+ }
399
+
400
+ // Gettings list of months for which we have statistics
401
+ months := make (map [string ][]string )
402
+ for _ , v := range years {
403
+ var mraw []string
404
+ reply , err = redis .Values (r .Do ("SCAN" , "0" , "MATCH" , v + "??:*" , "COUNT" , 1000 ))
368
405
if err != nil {
369
- log .Fatal (err )
406
+ r .Close ()
407
+ return err
408
+ }
409
+
410
+ _ , err = redis .Scan (reply , & cursor , & mraw )
411
+ if err != nil {
412
+ r .Close ()
413
+ return err
414
+ }
415
+ for _ , m := range mraw {
416
+ m = strings .TrimPrefix (m , v )
417
+ monthSplit := strings .Split (m , ":" )
418
+ found := false
419
+ for _ , y := range months [v ] {
420
+ if y == monthSplit [0 ] {
421
+ found = true
422
+ }
423
+ }
424
+ if ! found {
425
+ months [v ] = append (months [v ], monthSplit [0 ])
426
+ }
370
427
}
371
428
}
429
+
372
430
t , err := template .New ("webpage" ).Parse (tpl )
373
- check (err )
431
+ if err != nil {
432
+ r .Close ()
433
+ return err
434
+ }
374
435
375
436
data := struct {
376
- Title string
377
- Current string
378
- MinDate string
379
- MaxDate string
437
+ Title string
438
+ Current string
439
+ MinDate string
440
+ MaxDate string
441
+ YearList []string
442
+ MonthList map [string ][]string
380
443
}{
381
- Title : "sshd failed logins statistics" ,
382
- MinDate : parsedOldestStr ,
383
- MaxDate : parsedNewestStr ,
384
- Current : newest ,
444
+ Title : "sshd failed logins statistics" ,
445
+ MinDate : parsedOldestStr ,
446
+ MaxDate : parsedNewestStr ,
447
+ Current : newest ,
448
+ YearList : years ,
449
+ MonthList : months ,
385
450
}
386
451
f , err := os .OpenFile ("statistics.html" , os .O_RDWR | os .O_CREATE , 0666 )
387
452
defer f .Close ()
388
453
err = t .Execute (f , data )
389
- check (err )
454
+ if err != nil {
455
+ r .Close ()
456
+ return err
457
+ }
390
458
391
459
return nil
392
460
}
@@ -416,7 +484,8 @@ func plotStats(s *SshdParser, v string) error {
416
484
417
485
p , err := plot .New ()
418
486
if err != nil {
419
- panic (err )
487
+ r .Close ()
488
+ return err
420
489
}
421
490
422
491
stype := strings .Split (v , ":" )
@@ -449,26 +518,30 @@ func plotStats(s *SshdParser, v string) error {
449
518
if _ , err := os .Stat ("data" ); os .IsNotExist (err ) {
450
519
err := os .Mkdir ("data" , 0700 )
451
520
if err != nil {
521
+ r .Close ()
452
522
return err
453
523
}
454
524
}
455
525
456
526
if _ , err := os .Stat (filepath .Join ("data" , "sshd" )); os .IsNotExist (err ) {
457
527
err := os .Mkdir (filepath .Join ("data" , "sshd" ), 0700 )
458
528
if err != nil {
529
+ r .Close ()
459
530
return err
460
531
}
461
532
}
462
533
463
534
if _ , err := os .Stat (filepath .Join ("data" , "sshd" , stype [0 ])); os .IsNotExist (err ) {
464
535
err := os .Mkdir (filepath .Join ("data" , "sshd" , stype [0 ]), 0700 )
465
536
if err != nil {
537
+ r .Close ()
466
538
return err
467
539
}
468
540
}
469
541
470
542
xsize := 3 + vg .Length (math .Round (float64 (len (keys )/ 2 )))
471
543
if err := p .Save (15 * vg .Centimeter , xsize * vg .Centimeter , filepath .Join ("data" , "sshd" , stype [0 ], fmt .Sprintf ("%v.svg" , v ))); err != nil {
544
+ r .Close ()
472
545
return err
473
546
}
474
547
0 commit comments