-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrules.go
More file actions
103 lines (95 loc) · 2.45 KB
/
rules.go
File metadata and controls
103 lines (95 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package main
import (
"errors"
"fmt"
"io/ioutil"
"os"
"strings"
"github.com/rs/zerolog/log"
)
func contains(s []string, str string) bool {
for _, v := range s {
if v == str {
return true
}
}
return false
}
func getDefaultRules() (string, error) {
defaultRules, err := getRuleFile("_default")
if err != nil {
log.Error().Msg("couldn't load default rules file!")
return "", err
}
return defaultRules, nil
}
func getRuleFile(rulefile string) (string, error) {
extensions := []string{"yaml", "yml"}
for _, ext := range extensions {
path := fmt.Sprintf("./rules/%s.%s", rulefile, ext)
fileBytes, err := os.ReadFile(path)
if err != nil {
continue
}
fileString := string(fileBytes)
return fileString, nil
}
log.Error().Str("rulefile", rulefile).Msg("couldn't read rule file with yaml or yml extension")
return "", errors.New("rule file not found")
}
func getRuleSets() ([]string, error) {
files, err := ioutil.ReadDir("./rules/")
if err != nil {
log.Error().Err(err).Msg("Couldn't iterate rules directory")
return nil, err
}
rulesets := make([]string, 0)
for _, file := range files {
// NOTE: no subdirectories right now
if file.IsDir() {
continue
}
// skip the default config
if strings.ToLower(file.Name()) == "_default.yml" {
continue
}
lowerName := strings.ToLower(file.Name())
lowerName = strings.TrimSuffix(lowerName, ".yml")
lowerName = strings.TrimSuffix(lowerName, ".yaml")
rulesets = append(rulesets, lowerName)
}
return rulesets, nil
}
func BuildRules(rulesets []string) (string, error) {
defaultRules, err := getDefaultRules()
if err != nil {
// logged in prev func
return "", err
}
availableRulesets, err := getRuleSets()
if err != nil {
// logged in prev func
return "", err
}
// make sure that rulesets is lower and then try and
// match, returning if we find one. otherwise return the default
// rules and log
for _, ruleset := range rulesets {
ruleset = strings.ToLower(ruleset)
if ruleset == "default" {
log.Debug().Msg("skipping default ruleset")
continue
}
if !contains(availableRulesets, ruleset) {
log.Warn().Str("ruleset", ruleset).Msg("tried to request a non-existant ruleset, continuing")
continue
}
appendRules, err := getRuleFile(ruleset)
if err != nil {
log.Warn().Err(err).Str("ruleset", ruleset).Msg("failed to get ruleset, continuing")
continue
}
defaultRules = fmt.Sprintf("%s\n\n%s\n", defaultRules, appendRules)
}
return defaultRules, nil
}