chg: [sshd] daily, monthly and yearly statistics and plots
parent
688ca7123d
commit
182b8c103a
|
@ -68,34 +68,63 @@ func (s *SshdParser) Parse(logline string) error {
|
||||||
r.Close()
|
r.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = redis.String(r.Do("ZINCRBY", fmt.Sprintf("%v%v%v:statssrc", parsedTime.Year(), int(parsedTime.Month()), parsedTime.Day()), 1, md["src"]))
|
|
||||||
if err != nil {
|
// Daily
|
||||||
r.Close()
|
dstr := fmt.Sprintf("%v%v%v", parsedTime.Year(), int(parsedTime.Month()), parsedTime.Day())
|
||||||
return err
|
err = compileStats(s, dstr, "daily", md["src"], md["username"], md["host"])
|
||||||
}
|
|
||||||
_, err = redis.String(r.Do("ZINCRBY", fmt.Sprintf("%v%v%v:statsusername", parsedTime.Year(), int(parsedTime.Month()), parsedTime.Day()), 1, md["username"]))
|
|
||||||
if err != nil {
|
|
||||||
r.Close()
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = redis.String(r.Do("ZINCRBY", fmt.Sprintf("%v%v%v:statshost", parsedTime.Year(), int(parsedTime.Month()), parsedTime.Day()), 1, md["host"]))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.Close()
|
r.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keeping track of which days we updated statistics for
|
// Monthly
|
||||||
_, err = redis.Int(r.Do("SADD", "toupdate", fmt.Sprintf("%v%v%v:statssrc", parsedTime.Year(), int(parsedTime.Month()), parsedTime.Day())))
|
mstr := fmt.Sprintf("%v%v", parsedTime.Year(), int(parsedTime.Month()))
|
||||||
|
err = compileStats(s, mstr, "daily", md["src"], md["username"], md["host"])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.Close()
|
r.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = redis.Int(r.Do("SADD", "toupdate", fmt.Sprintf("%v%v%v:statsusername", parsedTime.Year(), int(parsedTime.Month()), parsedTime.Day())))
|
|
||||||
|
// Yearly
|
||||||
|
ystr := fmt.Sprintf("%v", parsedTime.Year())
|
||||||
|
err = compileStats(s, ystr, "daily", md["src"], md["username"], md["host"])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.Close()
|
r.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = redis.Int(r.Do("SADD", "toupdate", fmt.Sprintf("%v%v%v:statshost", parsedTime.Year(), int(parsedTime.Month()), parsedTime.Day())))
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func compileStats(s *SshdParser, datestr string, mode string, src string, username string, host string) error {
|
||||||
|
r := *s.r1
|
||||||
|
_, err := redis.String(r.Do("ZINCRBY", fmt.Sprintf("%v:%v", datestr, "statssrc"), 1, src))
|
||||||
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = redis.String(r.Do("ZINCRBY", fmt.Sprintf("%v:%v", datestr, "statsusername"), 1, username))
|
||||||
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = redis.String(r.Do("ZINCRBY", fmt.Sprintf("%v:%v", datestr, "statshost"), 1, host))
|
||||||
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = redis.Int(r.Do("SADD", fmt.Sprintf("toupdate:%v", mode), fmt.Sprintf("%v:%v", datestr, "statssrc")))
|
||||||
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = redis.Int(r.Do("SADD", fmt.Sprintf("toupdate:%v", mode), fmt.Sprintf("%v:%v", datestr, "statsusername")))
|
||||||
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = redis.Int(r.Do("SADD", fmt.Sprintf("toupdate:%v", mode), fmt.Sprintf("%v:%v", datestr, "statshost")))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.Close()
|
r.Close()
|
||||||
return err
|
return err
|
||||||
|
@ -114,15 +143,59 @@ func (s *SshdParser) Compile() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// List days for which we need to update statistic
|
// List days for which we need to update statistics
|
||||||
toupdate, err := redis.Strings(r.Do("SMEMBERS", "toupdate"))
|
toupdateD, err := redis.Strings(r.Do("SMEMBERS", "toupdate:daily"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.Close()
|
r.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Query statistics dor each day to update
|
// Plot statistics for each day to update
|
||||||
for _, v := range toupdate {
|
for _, v := range toupdateD {
|
||||||
|
err = plotStats(s, v)
|
||||||
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// List months for which we need to update statistics
|
||||||
|
toupdateM, err := redis.Strings(r.Do("SMEMBERS", "toupdate:monthly"))
|
||||||
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Plot statistics for each month to update
|
||||||
|
for _, v := range toupdateM {
|
||||||
|
err = plotStats(s, v)
|
||||||
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// List years for which we need to update statistics
|
||||||
|
toupdateY, err := redis.Strings(r.Do("SMEMBERS", "toupdate:yearly"))
|
||||||
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Plot statistics for each year to update
|
||||||
|
for _, v := range toupdateY {
|
||||||
|
err = plotStats(s, v)
|
||||||
|
if err != nil {
|
||||||
|
r.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func plotStats(s *SshdParser, v string) error {
|
||||||
|
r := *s.r2
|
||||||
zrank, err := redis.Strings(r.Do("ZRANGEBYSCORE", v, "-inf", "+inf", "WITHSCORES"))
|
zrank, err := redis.Strings(r.Do("ZRANGEBYSCORE", v, "-inf", "+inf", "WITHSCORES"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.Close()
|
r.Close()
|
||||||
|
@ -150,6 +223,8 @@ func (s *SshdParser) Compile() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
stype := strings.Split(v, ":")
|
stype := strings.Split(v, ":")
|
||||||
|
fmt.Println(stype[0])
|
||||||
|
fmt.Println(stype[1])
|
||||||
switch stype[1] {
|
switch stype[1] {
|
||||||
case "statsusername":
|
case "statsusername":
|
||||||
p.Title.Text = "Usernames"
|
p.Title.Text = "Usernames"
|
||||||
|
@ -196,7 +271,5 @@ func (s *SshdParser) Compile() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
2
main.go
2
main.go
|
@ -50,7 +50,7 @@ var (
|
||||||
redisD4 redis.Conn
|
redisD4 redis.Conn
|
||||||
redisParsers *redis.Pool
|
redisParsers *redis.Pool
|
||||||
parsers = [1]string{"sshd"}
|
parsers = [1]string{"sshd"}
|
||||||
compilationTrigger = 200
|
compilationTrigger = 20
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
compiling comutex
|
compiling comutex
|
||||||
torun = []logparser.Parser{}
|
torun = []logparser.Parser{}
|
||||||
|
|
Loading…
Reference in New Issue