mirror of
https://github.com/crowdsecurity/crowdsec.git
synced 2025-05-10 20:05:55 +02:00
166 lines
2.9 KiB
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
|
|
}
|