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, exprhelpers.GetExprOptions(map[string]interface{}{"queue": &types.Queue{}, "signal": &types.RuntimeAlert{}, "leaky": &Leaky{}})...)
  24. if err != nil {
  25. g.logger.Errorf("Unable to compile filter : %v", err)
  26. return nil, fmt.Errorf("unable to compile filter : %v", err)
  27. }
  28. return &u, nil
  29. }
  30. func (u *OverflowFilter) OnBucketOverflow(Bucket *BucketFactory) func(*Leaky, types.RuntimeAlert, *types.Queue) (types.RuntimeAlert, *types.Queue) {
  31. return func(l *Leaky, s types.RuntimeAlert, q *types.Queue) (types.RuntimeAlert, *types.Queue) {
  32. el, err := exprhelpers.Run(u.FilterRuntime, map[string]interface{}{
  33. "queue": q, "signal": s, "leaky": l}, l.logger, Bucket.Debug)
  34. if err != nil {
  35. l.logger.Errorf("Failed running overflow filter: %s", err)
  36. return s, q
  37. }
  38. element, ok := el.(bool)
  39. if !ok {
  40. l.logger.Errorf("Overflow filter didn't return bool: %s", err)
  41. return s, q
  42. }
  43. /*filter returned false, event is blackholded*/
  44. if !element {
  45. l.logger.Infof("Event is discarded by overflow filter (%s)", u.Filter)
  46. return types.RuntimeAlert{
  47. Mapkey: l.Mapkey,
  48. }, nil
  49. }
  50. l.logger.Tracef("Event is not discarded by overflow filter (%s)", u.Filter)
  51. return s, q
  52. }
  53. }