unix_parser.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package parser
  2. import (
  3. "fmt"
  4. "os"
  5. "path"
  6. "strings"
  7. "github.com/crowdsecurity/crowdsec/pkg/csconfig"
  8. "github.com/crowdsecurity/grokky"
  9. log "github.com/sirupsen/logrus"
  10. )
  11. type UnixParserCtx struct {
  12. Grok grokky.Host
  13. Stages []string
  14. Profiling bool
  15. DataFolder string
  16. }
  17. type Parsers struct {
  18. Ctx *UnixParserCtx
  19. Povfwctx *UnixParserCtx
  20. StageFiles []Stagefile
  21. PovfwStageFiles []Stagefile
  22. Nodes []Node
  23. Povfwnodes []Node
  24. EnricherCtx EnricherCtx
  25. }
  26. func Init(c map[string]interface{}) (*UnixParserCtx, error) {
  27. r := UnixParserCtx{}
  28. r.Grok = grokky.NewBase()
  29. files, err := os.ReadDir(c["patterns"].(string))
  30. if err != nil {
  31. return nil, err
  32. }
  33. r.DataFolder = c["data"].(string)
  34. for _, f := range files {
  35. if strings.Contains(f.Name(), ".") {
  36. continue
  37. }
  38. if err := r.Grok.AddFromFile(path.Join(c["patterns"].(string), f.Name())); err != nil {
  39. log.Errorf("failed to load pattern %s : %v", f.Name(), err)
  40. return nil, err
  41. }
  42. }
  43. log.Debugf("Loaded %d pattern files", len(files))
  44. return &r, nil
  45. }
  46. func LoadParsers(cConfig *csconfig.Config, parsers *Parsers) (*Parsers, error) {
  47. var err error
  48. patternsDir := path.Join(cConfig.Crowdsec.ConfigDir, "patterns/")
  49. log.Infof("Loading grok library %s", patternsDir)
  50. /* load base regexps for two grok parsers */
  51. parsers.Ctx, err = Init(map[string]interface{}{"patterns": patternsDir,
  52. "data": cConfig.Crowdsec.DataDir})
  53. if err != nil {
  54. return parsers, fmt.Errorf("failed to load parser patterns : %v", err)
  55. }
  56. parsers.Povfwctx, err = Init(map[string]interface{}{"patterns": patternsDir,
  57. "data": cConfig.Crowdsec.DataDir})
  58. if err != nil {
  59. return parsers, fmt.Errorf("failed to load postovflw parser patterns : %v", err)
  60. }
  61. /*
  62. Load enrichers
  63. */
  64. log.Infof("Loading enrich plugins")
  65. parsers.EnricherCtx, err = Loadplugin(cConfig.Crowdsec.DataDir)
  66. if err != nil {
  67. return parsers, fmt.Errorf("Failed to load enrich plugin : %v", err)
  68. }
  69. /*
  70. Load the actual parsers
  71. */
  72. log.Infof("Loading parsers from %d files", len(parsers.StageFiles))
  73. parsers.Nodes, err = LoadStages(parsers.StageFiles, parsers.Ctx, parsers.EnricherCtx)
  74. if err != nil {
  75. return parsers, fmt.Errorf("failed to load parser config : %v", err)
  76. }
  77. if len(parsers.PovfwStageFiles) > 0 {
  78. log.Infof("Loading postoverflow parsers")
  79. parsers.Povfwnodes, err = LoadStages(parsers.PovfwStageFiles, parsers.Povfwctx, parsers.EnricherCtx)
  80. } else {
  81. parsers.Povfwnodes = []Node{}
  82. log.Infof("No postoverflow parsers to load")
  83. }
  84. if err != nil {
  85. return parsers, fmt.Errorf("failed to load postoverflow config : %v", err)
  86. }
  87. if cConfig.Prometheus != nil && cConfig.Prometheus.Enabled {
  88. parsers.Ctx.Profiling = true
  89. parsers.Povfwctx.Profiling = true
  90. }
  91. return parsers, nil
  92. }