overflow_filter.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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.SignalOccurence{}, "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.SignalOccurence, *Queue) (types.SignalOccurence, *Queue) {
  32. return func(l *Leaky, s types.SignalOccurence, q *Queue) (types.SignalOccurence, *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 discard by overflow filter (%s)", u.Filter)
  47. return types.SignalOccurence{
  48. MapKey: l.Mapkey,
  49. // BucketConfiguration: bcfg,
  50. }, nil
  51. } else {
  52. l.logger.Debugf("Event is not discard by overflow filter (%s)", u.Filter)
  53. }
  54. return s, q
  55. }
  56. }