overflow_filter.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package leakybucket
  2. import (
  3. "fmt"
  4. "github.com/antonmedv/expr"
  5. "github.com/antonmedv/expr/vm"
  6. "github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
  7. "github.com/crowdsecurity/crowdsec/pkg/types"
  8. )
  9. // Uniq creates three new functions that share the same initialisation and the same scope.
  10. // They are triggered respectively:
  11. // on pour
  12. // on overflow
  13. // on leak
  14. type OverflowFilter struct {
  15. Filter string
  16. FilterRuntime *vm.Program
  17. DumbProcessor
  18. }
  19. func NewOverflowFilter(g *BucketFactory) (*OverflowFilter, error) {
  20. var err error
  21. u := OverflowFilter{}
  22. u.Filter = g.OverflowFilter
  23. u.FilterRuntime, err = expr.Compile(u.Filter, expr.Env(exprhelpers.GetExprEnv(map[string]interface{}{
  24. "queue": &Queue{}, "signal": &types.RuntimeAlert{}, "leaky": &Leaky{}})))
  25. if err != nil {
  26. g.logger.Errorf("Unable to compile filter : %v", err)
  27. return nil, fmt.Errorf("unable to compile filter : %v", err)
  28. }
  29. return &u, nil
  30. }
  31. func (u *OverflowFilter) OnBucketOverflow(Bucket *BucketFactory) func(*Leaky, types.RuntimeAlert, *Queue) (types.RuntimeAlert, *Queue) {
  32. return func(l *Leaky, s types.RuntimeAlert, q *Queue) (types.RuntimeAlert, *Queue) {
  33. el, err := expr.Run(u.FilterRuntime, exprhelpers.GetExprEnv(map[string]interface{}{
  34. "queue": q, "signal": s, "leaky": l}))
  35. if err != nil {
  36. l.logger.Errorf("Failed running overflow filter: %s", err)
  37. return s, q
  38. }
  39. element, ok := el.(bool)
  40. if !ok {
  41. l.logger.Errorf("Overflow filter didn't return bool: %s", err)
  42. return s, q
  43. }
  44. /*filter returned false, event is blackholded*/
  45. if !element {
  46. l.logger.Infof("Event is discarded by overflow filter (%s)", u.Filter)
  47. return types.RuntimeAlert{
  48. Mapkey: l.Mapkey,
  49. }, nil
  50. }
  51. l.logger.Tracef("Event is not discarded by overflow filter (%s)", u.Filter)
  52. return s, q
  53. }
  54. }