mirror of
https://github.com/crowdsecurity/crowdsec.git
synced 2025-05-11 20:36:12 +02:00
Add ParseKV helper and rework UnmarshalJSON as a proper helper (#2184)
This commit is contained in:
parent
e1f5ed41df
commit
424215f228
7 changed files with 198 additions and 5 deletions
|
@ -51,6 +51,8 @@ var dbClient *database.Client
|
|||
|
||||
var exprFunctionOptions []expr.Option
|
||||
|
||||
var keyValuePattern = regexp.MustCompile(`\s*(?P<key>[^=\s]+)\s*=\s*(?:"(?P<quoted_value>[^"\\]*(?:\\.[^"\\]*)*)"|(?P<value>[^=\s]+))`)
|
||||
|
||||
func GetExprOptions(ctx map[string]interface{}) []expr.Option {
|
||||
ret := []expr.Option{}
|
||||
ret = append(ret, exprFunctionOptions...)
|
||||
|
@ -596,6 +598,44 @@ func B64Decode(params ...any) (any, error) {
|
|||
return string(decoded), nil
|
||||
}
|
||||
|
||||
func ParseKV(params ...any) (any, error) {
|
||||
|
||||
blob := params[0].(string)
|
||||
target := params[1].(map[string]interface{})
|
||||
prefix := params[2].(string)
|
||||
|
||||
matches := keyValuePattern.FindAllStringSubmatch(blob, -1)
|
||||
if matches == nil {
|
||||
log.Errorf("could not find any key/value pair in line")
|
||||
return nil, fmt.Errorf("invalid input format")
|
||||
}
|
||||
if _, ok := target[prefix]; !ok {
|
||||
target[prefix] = make(map[string]string)
|
||||
} else {
|
||||
_, ok := target[prefix].(map[string]string)
|
||||
if !ok {
|
||||
log.Errorf("ParseKV: target is not a map[string]string")
|
||||
return nil, fmt.Errorf("target is not a map[string]string")
|
||||
}
|
||||
}
|
||||
for _, match := range matches {
|
||||
key := ""
|
||||
value := ""
|
||||
for i, name := range keyValuePattern.SubexpNames() {
|
||||
if name == "key" {
|
||||
key = match[i]
|
||||
} else if name == "quoted_value" && match[i] != "" {
|
||||
value = match[i]
|
||||
} else if name == "value" && match[i] != "" {
|
||||
value = match[i]
|
||||
}
|
||||
}
|
||||
target[prefix].(map[string]string)[key] = value
|
||||
}
|
||||
log.Tracef("unmarshaled KV: %+v", target[prefix])
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func Hostname(params ...any) (any, error) {
|
||||
hostname, err := os.Hostname()
|
||||
if err != nil {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue