logmania/database/main.go

88 lines
2.3 KiB
Go
Raw Normal View History

package database
import (
"regexp"
"time"
2017-10-25 00:36:16 +02:00
log "github.com/sirupsen/logrus"
)
2017-08-13 12:12:46 +02:00
const AlertMsg = "alert service from logmania, device did not send new message for a while"
type DB struct {
2018-04-15 01:52:08 +02:00
Hostname map[string]string `json:"hostname,omitempty"`
HostTo map[string]map[string]bool `json:"host_to,omitempty"`
MaxPrioIn map[string]log.Level `json:"maxLevel,omitempty"`
RegexIn map[string]map[string]*regexp.Regexp `json:"regexIn,omitempty"`
Lastseen map[string]time.Time `json:"lastseen,omitempty"`
2017-08-13 12:12:46 +02:00
LastseenNotify map[string]time.Time `json:"-"`
2018-04-15 01:52:08 +02:00
// new format
Hosts []*Host `json:"hosts"`
HostsByAddress map[string]*Host `json:"-"`
HostsByName map[string]*Host `json:"-"`
Notifies []*Notify `json:"notifies"`
NotifiesByAddress map[string]*Notify `json:"-"`
}
2018-04-15 01:52:08 +02:00
func (db *DB) SendTo(e *log.Entry) (*log.Entry, *Host, []*Notify) {
addr, ok := e.Data["hostname"].(string)
2017-10-25 00:36:16 +02:00
if !ok {
2018-04-15 01:52:08 +02:00
return e, nil, nil
2017-10-25 00:36:16 +02:00
}
2018-04-15 01:52:08 +02:00
var host *Host
if host, ok := db.HostsByAddress[addr]; ok {
if e.Message != AlertMsg {
host.Lastseen = time.Now()
2017-08-13 12:12:46 +02:00
}
2018-04-15 01:52:08 +02:00
var toList []*Notify
for _, notify := range host.NotifiesByAddress {
if lvl := notify.MaxPrioIn; e.Level >= lvl {
continue
}
2018-04-15 01:52:08 +02:00
stopForTo := false
for _, expr := range notify.RegexIn {
if expr.MatchString(e.Message) {
stopForTo = true
continue
}
}
2018-04-15 01:52:08 +02:00
if stopForTo {
continue
}
toList = append(toList, notify)
}
2018-04-15 01:52:08 +02:00
if host.Name != "" {
entry := e.WithField("hostname", host.Name)
2017-11-05 17:23:10 +01:00
entry.Level = e.Level
entry.Message = e.Message
2018-04-15 01:52:08 +02:00
return entry, host, toList
}
2018-04-15 01:52:08 +02:00
return e, host, toList
} else {
2018-04-15 01:52:08 +02:00
host = db.NewHost(addr)
}
2018-04-15 01:52:08 +02:00
return e, host, nil
}
func (db *DB) Alert(expired time.Duration, send func(e *log.Entry) error) {
2017-08-13 12:12:46 +02:00
c := time.Tick(time.Minute)
for range c {
now := time.Now()
2018-04-15 01:52:08 +02:00
for _, h := range db.Hosts {
if !h.Lastseen.Before(now.Add(expired * -2)) {
continue
}
if h.LastseenNotify.Year() <= 1 && h.Lastseen.Before(h.LastseenNotify) {
continue
2017-08-13 12:12:46 +02:00
}
2018-04-15 01:52:08 +02:00
h.LastseenNotify = now
entry := log.NewEntry(log.New())
entry.Level = log.ErrorLevel
entry.Message = AlertMsg
entry.WithField("hostname", h.Address)
send(entry)
2017-08-13 12:12:46 +02:00
}
}
}