bitbucket.org/Aishee/synsec@v0.0.0-20210414005726-236fc01a153d/cmd/synsec/pour.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"bitbucket.org/Aishee/synsec/pkg/csconfig"
     8  	leaky "bitbucket.org/Aishee/synsec/pkg/leakybucket"
     9  	"bitbucket.org/Aishee/synsec/pkg/types"
    10  	log "github.com/sirupsen/logrus"
    11  )
    12  
    13  func runPour(input chan types.Event, holders []leaky.BucketFactory, buckets *leaky.Buckets, cConfig *csconfig.Config) error {
    14  	var (
    15  		count int
    16  	)
    17  	for {
    18  		//bucket is now ready
    19  		select {
    20  		case <-bucketsTomb.Dying():
    21  			log.Infof("Bucket routine exiting")
    22  			return nil
    23  		case parsed := <-input:
    24  			count++
    25  			if count%5000 == 0 {
    26  				log.Warningf("%d existing LeakyRoutine", leaky.LeakyRoutineCount)
    27  				//when in forensics mode, garbage collect buckets
    28  				if cConfig.Synsec.BucketsGCEnabled {
    29  					if parsed.MarshaledTime != "" {
    30  						var z *time.Time = &time.Time{}
    31  						if err := z.UnmarshalText([]byte(parsed.MarshaledTime)); err != nil {
    32  							log.Warningf("Failed to unmarshal time from event '%s' : %s", parsed.MarshaledTime, err)
    33  						} else {
    34  							log.Warningf("Starting buckets garbage collection ...")
    35  							if err = leaky.GarbageCollectBuckets(*z, buckets); err != nil {
    36  								return fmt.Errorf("failed to start bucket GC : %s", err)
    37  							}
    38  						}
    39  					}
    40  				}
    41  			}
    42  			//here we can bucketify with parsed
    43  			poured, err := leaky.PourItemToHolders(parsed, holders, buckets)
    44  			if err != nil {
    45  				log.Fatalf("bucketify failed for: %v", parsed)
    46  				return fmt.Errorf("process of event failed : %v", err)
    47  			}
    48  			if poured {
    49  				globalBucketPourOk.Inc()
    50  			} else {
    51  				globalBucketPourKo.Inc()
    52  			}
    53  			if len(parsed.MarshaledTime) != 0 {
    54  				if err := lastProcessedItem.UnmarshalText([]byte(parsed.MarshaledTime)); err != nil {
    55  					log.Warningf("failed to unmarshal time from event : %s", err)
    56  				}
    57  			}
    58  		}
    59  	}
    60  }