* pkg/csconfig: use yaml.v3; deprecate yaml.v2 for new code * yaml.v3: handle empty files * Lint whitespace, errors
74 lines
1.4 KiB
Go
74 lines
1.4 KiB
Go
package csconfig
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"path/filepath"
|
|
|
|
"gopkg.in/yaml.v3"
|
|
|
|
"github.com/crowdsecurity/go-cs-lib/yamlpatch"
|
|
)
|
|
|
|
type SimulationConfig struct {
|
|
Simulation *bool `yaml:"simulation"`
|
|
Exclusions []string `yaml:"exclusions,omitempty"`
|
|
}
|
|
|
|
func (s *SimulationConfig) IsSimulated(scenario string) bool {
|
|
var simulated bool
|
|
|
|
if s.Simulation != nil && *s.Simulation {
|
|
simulated = true
|
|
}
|
|
|
|
for _, excluded := range s.Exclusions {
|
|
if excluded == scenario {
|
|
simulated = !simulated
|
|
break
|
|
}
|
|
}
|
|
|
|
return simulated
|
|
}
|
|
|
|
func (c *Config) LoadSimulation() error {
|
|
simCfg := SimulationConfig{}
|
|
|
|
if c.ConfigPaths.SimulationFilePath == "" {
|
|
c.ConfigPaths.SimulationFilePath = filepath.Clean(c.ConfigPaths.ConfigDir + "/simulation.yaml")
|
|
}
|
|
|
|
patcher := yamlpatch.NewPatcher(c.ConfigPaths.SimulationFilePath, ".local")
|
|
|
|
rcfg, err := patcher.MergedPatchContent()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
dec := yaml.NewDecoder(bytes.NewReader(rcfg))
|
|
dec.KnownFields(true)
|
|
|
|
if err := dec.Decode(&simCfg); err != nil {
|
|
if !errors.Is(err, io.EOF) {
|
|
return fmt.Errorf("while unmarshaling simulation file '%s': %w", c.ConfigPaths.SimulationFilePath, err)
|
|
}
|
|
}
|
|
|
|
if simCfg.Simulation == nil {
|
|
simCfg.Simulation = new(bool)
|
|
}
|
|
|
|
if c.Crowdsec != nil {
|
|
c.Crowdsec.SimulationConfig = &simCfg
|
|
}
|
|
|
|
if c.Cscli != nil {
|
|
c.Cscli.SimulationConfig = &simCfg
|
|
}
|
|
|
|
return nil
|
|
}
|