crowdsec/pkg/models/helpers.go

166 lines
2.9 KiB
Go

package models
import (
"fmt"
"github.com/davecgh/go-spew/spew"
log "github.com/sirupsen/logrus"
)
const (
// these are duplicated from pkg/types
// TODO XXX: de-duplicate
Ip = "Ip"
Range = "Range"
CscliImportOrigin = "cscli-import"
)
func (a *Alert) GetScope() string {
return a.Source.GetScope()
}
func (a *Alert) GetValue() string {
return a.Source.GetValue()
}
func (a *Alert) GetScenario() string {
if a.Scenario == nil {
return ""
}
return *a.Scenario
}
func (a *Alert) GetEventsCount() int32 {
if a.EventsCount == nil {
return 0
}
return *a.EventsCount
}
func (e *Event) GetMeta(key string) string {
for _, meta := range e.Meta {
if meta.Key == key {
return meta.Value
}
}
return ""
}
func (a *Alert) GetMeta(key string) string {
for _, meta := range a.Meta {
if meta.Key == key {
return meta.Value
}
}
return ""
}
func (s Source) GetValue() string {
if s.Value == nil {
return ""
}
return *s.Value
}
func (s Source) GetScope() string {
if s.Scope == nil {
return ""
}
return *s.Scope
}
func (s Source) GetAsNumberName() string {
ret := ""
if s.AsNumber != "0" {
ret += s.AsNumber
}
if s.AsName != "" {
ret += " " + s.AsName
}
return ret
}
func (s *Source) String() string {
if s == nil || s.Scope == nil || *s.Scope == "" {
return "empty source"
}
cn := s.Cn
if s.AsNumber != "" {
cn += "/" + s.AsNumber
}
if cn != "" {
cn = " (" + cn + ")"
}
switch *s.Scope {
case Ip:
return "ip " + *s.Value + cn
case Range:
return "range " + *s.Value + cn
default:
return *s.Scope + " " + *s.Value
}
}
func (a *Alert) FormatAsStrings(machineID string, logger *log.Logger) []string {
src := a.Source.String()
msg := "empty scenario"
if a.Scenario != nil && *a.Scenario != "" {
msg = *a.Scenario
} else if a.Message != nil && *a.Message != "" {
msg = *a.Message
}
reason := fmt.Sprintf("%s by %s", msg, src)
if len(a.Decisions) == 0 {
return []string{fmt.Sprintf("(%s) alert : %s", machineID, reason)}
}
var retStr []string
if a.Decisions[0].Origin != nil && *a.Decisions[0].Origin == CscliImportOrigin {
return []string{fmt.Sprintf("(%s) alert : %s", machineID, reason)}
}
for i, decisionItem := range a.Decisions {
decision := ""
if a.Simulated != nil && *a.Simulated {
decision = "(simulated alert)"
} else if decisionItem.Simulated != nil && *decisionItem.Simulated {
decision = "(simulated decision)"
}
if logger.IsLevelEnabled(log.DebugLevel) {
logger.Debug(spew.Sdump(decisionItem))
}
if len(a.Decisions) > 1 {
reason = fmt.Sprintf("%s for %d/%d decisions", msg, i+1, len(a.Decisions))
}
origin := *decisionItem.Origin
if machineID != "" {
origin = machineID + "/" + origin
}
decision += fmt.Sprintf("%s %s on %s %s", *decisionItem.Duration,
*decisionItem.Type, *decisionItem.Scope, *decisionItem.Value)
retStr = append(retStr,
fmt.Sprintf("(%s) %s : %s", origin, reason, decision))
}
return retStr
}