mirror of
https://github.com/evilsocket/arc.git
synced 2024-05-26 22:37:37 +03:00
90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
/*
|
|
* Arc - Copyleft of Simone 'evilsocket' Margaritelli.
|
|
* evilsocket at protonmail dot com
|
|
* https://www.evilsocket.net/
|
|
*
|
|
* See LICENSE.
|
|
*/
|
|
package events
|
|
|
|
import (
|
|
"github.com/evilsocket/arc/config"
|
|
"github.com/evilsocket/arc/pgp"
|
|
"github.com/evilsocket/arc/utils"
|
|
"github.com/evilsocket/islazy/log"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
lock = &sync.Mutex{}
|
|
Pool = make([]Event, 0)
|
|
pgpConf = &config.Conf.Scheduler.Reports.PGP
|
|
repStats = make(map[string]time.Time, 0)
|
|
statsLock = &sync.Mutex{}
|
|
)
|
|
|
|
func Setup() error {
|
|
reports := config.Conf.Scheduler.Reports
|
|
if config.Conf.Scheduler.Enabled && reports.Enabled && pgpConf.Enabled {
|
|
if err := pgp.Setup(pgpConf); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func rateLimit(event Event) bool {
|
|
statsLock.Lock()
|
|
defer statsLock.Unlock()
|
|
|
|
dropEvent := false
|
|
lastSeen := time.Now()
|
|
|
|
if last, found := repStats[event.Name]; found == true {
|
|
elapsed := time.Since(last)
|
|
if elapsed.Seconds() < float64(config.Conf.Scheduler.Reports.RateLimit) {
|
|
dropEvent = true
|
|
}
|
|
}
|
|
|
|
repStats[event.Name] = lastSeen
|
|
|
|
return dropEvent
|
|
}
|
|
|
|
func Report(event Event) {
|
|
if rateLimit(event) == true {
|
|
log.Warning("Dropping event '%s' because of rate limiting.", event.Title)
|
|
return
|
|
}
|
|
|
|
if err := doEmailReport(event); err != nil {
|
|
log.Error("%v", err)
|
|
}
|
|
}
|
|
|
|
func Add(event Event) {
|
|
lock.Lock()
|
|
defer lock.Unlock()
|
|
Pool = append([]Event{event}, Pool...)
|
|
log.Info("New event (Pool size is %d): %s.", len(Pool), event)
|
|
|
|
if config.Conf.Scheduler.Reports.Enabled && utils.InSlice(event.Name, config.Conf.Scheduler.Reports.Filter) == true {
|
|
go Report(event)
|
|
}
|
|
}
|
|
|
|
func Clear() {
|
|
lock.Lock()
|
|
defer lock.Unlock()
|
|
Pool = make([]Event, 0)
|
|
log.Debug("Events Pool has been cleared.")
|
|
}
|
|
|
|
func AddNew(name, title, description string) Event {
|
|
event := New(name, title, description)
|
|
Add(event)
|
|
return event
|
|
}
|