From 3e01f4e2b3102114a269067a39ff9c6cf72d1ea7 Mon Sep 17 00:00:00 2001 From: Konstantin Zangerle Date: Thu, 6 Jul 2023 16:28:09 +0200 Subject: [PATCH 01/18] fixes WaitGroup Wait --- segments/output/lumberjack/lumberjack.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/segments/output/lumberjack/lumberjack.go b/segments/output/lumberjack/lumberjack.go index 50a8f45..f999fe3 100644 --- a/segments/output/lumberjack/lumberjack.go +++ b/segments/output/lumberjack/lumberjack.go @@ -204,6 +204,7 @@ func (segment *Lumberjack) Run(wg *sync.WaitGroup) { defer func() { close(segment.Out) + writerWG.Wait() wg.Done() log.Println("[info] Lumberjack: All writer functions have stopped, exiting…") }() @@ -225,6 +226,7 @@ func (segment *Lumberjack) Run(wg *sync.WaitGroup) { writerWG.Add(1) options := options go func(server string) { + defer writerWG.Done() // connect to lumberjack server client := NewResilientClient(server, options, segment.ReconnectWait) defer client.Close() @@ -251,7 +253,6 @@ func (segment *Lumberjack) Run(wg *sync.WaitGroup) { } else { segment.BatchDebugPrintf("[debug] Lumberjack: %s Sent final batch (%d)", server, count) } - wg.Done() return } @@ -305,6 +306,7 @@ func (segment *Lumberjack) Run(wg *sync.WaitGroup) { segment.LumberjackOut <- msg segment.Out <- msg } + close(segment.LumberjackOut) } // register segment From 4c7444960643ad1682f9b8625a7fd58b07342805 Mon Sep 17 00:00:00 2001 From: Konstantin Zangerle Date: Wed, 5 Jul 2023 16:10:34 +0200 Subject: [PATCH 02/18] Add diskbuffer segment. Allows to buffer flows in memory and (additionally) on disk in zstd compressed files. Add a small segment (filegate) for testing purposes to pause the pipeline when a file exists. --- CONFIGURATION.md | 26 ++ main.go | 3 + segments/dev/filegate/filegate.go | 62 +++ segments/input/diskbuffer/diskbuffer.go | 554 ++++++++++++++++++++++++ 4 files changed, 645 insertions(+) create mode 100644 segments/dev/filegate/filegate.go create mode 100644 segments/input/diskbuffer/diskbuffer.go diff --git a/CONFIGURATION.md b/CONFIGURATION.md index 7b937b1..015cac7 100644 --- a/CONFIGURATION.md +++ b/CONFIGURATION.md @@ -468,6 +468,32 @@ The `eofcloses` parameter can therefore be used to gracefully terminate the pipe [godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/input/stdin) [examples using this segment](https://github.com/search?q=%22segment%3A+stdin%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) +#### diskbuffer + +The `diskbuffer` segment buffers flows in memory and on-demand on disk. +Writing to disk is done in the JSON representation of the flows, compressed using `zstd`. +The flows are written to disk, when the MemoryBuffer reaches the percentual fill level HighMemoryMark, +until the LowMemoryMark is reached again. +Files are read from disk if the fill level reaches ReadingMemoryMark. +The maximum file size and the maximum size on disk are configurable via the `filesize` and `maxcachesize` +parameter. +If QueueStatusInterval is greater 0s, the fill level is printed. +BatchSize specifies how many flows will be at least written to disk + +```yaml +- segment: diskbuffer + config: + bufferdir: "" # must be specified, rest is optional + batchsize: 128 + queuestatusinterval: 0s + filesize: 50 MB + highmemorymark: 70 + lowmemorymark: 30 + readingmemorymark: 5 + maxcachesize: 1 GB + queuesize: 65536 +``` + ### Modify Group Segments in this group modify flows in some way. Generally, these segments do not drop flows unless specifically instructed and only change fields within diff --git a/main.go b/main.go index 9da6133..a163970 100644 --- a/main.go +++ b/main.go @@ -35,6 +35,7 @@ import ( _ "github.com/bwNetFlow/flowpipeline/segments/input/kafkaconsumer" _ "github.com/bwNetFlow/flowpipeline/segments/input/packet" _ "github.com/bwNetFlow/flowpipeline/segments/input/stdin" + _ "github.com/bwNetFlow/flowpipeline/segments/input/diskbuffer" _ "github.com/bwNetFlow/flowpipeline/segments/modify/addcid" _ "github.com/bwNetFlow/flowpipeline/segments/modify/addrstrings" @@ -63,6 +64,8 @@ import ( _ "github.com/bwNetFlow/flowpipeline/segments/print/toptalkers" _ "github.com/bwNetFlow/flowpipeline/segments/analysis/toptalkers_metrics" + + _ "github.com/bwNetFlow/flowpipeline/segments/dev/filegate" ) var Version string diff --git a/segments/dev/filegate/filegate.go b/segments/dev/filegate/filegate.go new file mode 100644 index 0000000..715d6e2 --- /dev/null +++ b/segments/dev/filegate/filegate.go @@ -0,0 +1,62 @@ +// Serves as a template for new segments and forwards flows, otherwise does +// nothing. +package filegate + +import ( + "sync" + "log" + "errors" + "os" + "time" + "github.com/bwNetFlow/flowpipeline/segments" +) + +type Filegate struct { + segments.BaseSegment // always embed this, no need to repeat I/O chan code + filename string +} + +// Every Segment must implement a New method, even if there isn't any config +// it is interested in. +func (segment *Filegate) New(config map[string]string) segments.Segment { + var() + if config["filename"] != "" { + segment.filename = config["filename"] + log.Printf("[info] Filegate: gate file is %s", segment.filename) + } else { + log.Fatalf("[error] Filegate: No filename config option") + } + // do config stuff here, add it to fields maybe + return segment +} + +func checkFileExists(filename string) bool { + log.Printf("[debug] Filegate: check if filename %s exists", filename) + _, err := os.Stat(filename) + if errors.Is(err, os.ErrNotExist) { + return false + } + return true +} + +func (segment *Filegate) Run(wg *sync.WaitGroup) { + defer func() { + // This defer clause is important and needs to be present in + // any Segment.Run method in some form, but with at least the + // following two statements. + close(segment.Out) + wg.Done() + }() + for msg := range segment.In { + for checkFileExists(segment.filename) { + log.Printf("[info] Filegate: gate file %s exists", segment.filename) + time.Sleep(2 * time.Second) + } + segment.Out <- msg + } +} + +func init() { + segment := &Filegate{} + segments.RegisterSegment("filegate", segment) +} diff --git a/segments/input/diskbuffer/diskbuffer.go b/segments/input/diskbuffer/diskbuffer.go new file mode 100644 index 0000000..d2debbf --- /dev/null +++ b/segments/input/diskbuffer/diskbuffer.go @@ -0,0 +1,554 @@ +package diskbuffer + +import ( + "github.com/bwNetFlow/flowpipeline/pb" + "github.com/bwNetFlow/flowpipeline/segments" + "github.com/dustin/go-humanize" + "github.com/klauspost/compress/zstd" + "google.golang.org/protobuf/encoding/protojson" + "github.com/google/uuid" + "golang.org/x/sys/unix" + "log" + "path/filepath" + "strconv" + "sync" + "time" + "fmt" + "os" + "bufio" + "errors" + "io" +) + +const ( + defaultQueueSize = 65536 + defaultBatchSize = 128 + defaultQueueStatusInterval = 0 * time.Second + defaultHighMemoryMark = 70 + defaultLowMemoryMark = 30 + defaultReadingMemoryMark = 5 + defaultFileSize = 50 * humanize.MByte + defaultMaxCacheSize = 1 * humanize.GByte +) + +type DiskBuffer struct { + segments.BaseSegment + BatchSize int + BatchDebugPrintf func(format string, v ...any) + QueueStatusInterval time.Duration + MemoryBuffer chan *pb.EnrichedFlow + FileSize uint64 + BufferDir string + HighMemoryMark int + LowMemoryMark int + ReadingMemoryMark int + MaxCacheSize uint64 +} + +func NoDebugPrintf(format string, v ...any) {} +func DoDebugPrintf(format string, v ...any) { + log.Printf(format, v...) +} + +func (segment *DiskBuffer) New(config map[string]string) segments.Segment { + var ( + err error + buflen int + ) + + segment.BufferDir = config["bufferdir"] + if segment.BufferDir != "" { + fi, err := os.Stat(segment.BufferDir) + if err != nil { + log.Fatalf("[error] Diskbuffer: Could not obtain file info for file %s", segment.BufferDir) + } + if !fi.IsDir() { + log.Fatalf("[error] Diskbuffer: bufferdir %s must be a directory", segment.BufferDir) + } + if unix.Access(segment.BufferDir, unix.W_OK) != nil { + log.Fatal("[error] Diskbuffer: bufferdir must be writeable") + } + } else { + log.Fatal("[error] Diskbuffer: bufferdir must exist") + } + // parse HighMemoryMark option + segment.HighMemoryMark = defaultHighMemoryMark + if config["highmemorymark"] != "" { + segment.HighMemoryMark, err = strconv.Atoi(config["highmemorymark"]) + if err != nil { + log.Fatalf("[error] Diskbuffer: Failed to parse highmemorymark config option: %s", err) + } + if segment.HighMemoryMark < 10 || segment.HighMemoryMark > 95 { + log.Fatal("[error] Diskbuffer: HighMemoryMark must be between 10 and 95") + } + } + + segment.ReadingMemoryMark = defaultReadingMemoryMark + if config["readingmemorymark"] != "" { + segment.ReadingMemoryMark, err = strconv.Atoi(config["highmemorymark"]) + if err != nil { + log.Fatalf("[error] Diskbuffer: Failed to parse readingmemorymark config option: %s", err) + } + if segment.ReadingMemoryMark < 1 || segment.ReadingMemoryMark > 50 { + log.Fatal("[error] Diskbuffer: HighMemoryMark must be between 1 and 50") + } + + } + + // parse LowMemoryMark option + segment.LowMemoryMark = defaultLowMemoryMark + if config["lowmemorymark"] != "" { + segment.LowMemoryMark, err = strconv.Atoi(config["lowmemorymark"]) + if err != nil { + log.Fatalf("[error] Diskbuffer: Failed to parse lowmemorymark config option: %s", err) + } + if segment.LowMemoryMark < 5 || segment.LowMemoryMark > 70 { + log.Fatal("[error] Diskbuffer: HighMemoryMark must be between 5 and 70") + } + } + + //sanity check: lowmemorymark < highmemorymark + if segment.LowMemoryMark > segment.HighMemoryMark { + log.Fatal("[error] Diskbuffer: HighMemoryMark must be greater than LowMemoryMark") + } + if segment.ReadingMemoryMark > segment.LowMemoryMark { + log.Fatal("[error] Diskbuffer: LowMemoryMark must be greater than ReadingMemoryMark") + } + + segment.MaxCacheSize = defaultMaxCacheSize + if config["maxcachesize"] != "" { + segment.FileSize, err = humanize.ParseBytes(config["maxcachesize"]) + if err != nil { + log.Fatalf("[error] Diskbuffer: Failed to parse maxcachesize config option: %s", err) + } + } + + + // parse filesize option + segment.FileSize = defaultFileSize + if config["filesize"] != "" { + segment.FileSize, err = humanize.ParseBytes(config["filesize"]) + if err != nil { + log.Fatalf("[error] Diskbuffer: Failed to parse filesize config option: %s", err) + } + } + + // parse batchSize option + segment.BatchSize = defaultBatchSize + if config["batchsize"] != "" { + segment.BatchSize, err = strconv.Atoi(config["batchsize"]) + if err != nil { + log.Fatalf("[error] Diskbuffer: Failed to parse batchsize config option: %s", err) + } + } + if segment.BatchSize < 0 { + segment.BatchSize = defaultBatchSize + } + // parse batchdebug option + if config["batchdebug"] != "" { + batchDebug, err := strconv.ParseBool(config["batchdebug"]) + if err != nil { + log.Fatalf("[error] Diskbuffer: Failed to parse batchdebug config option: %s", err) + } + // set proper BatchDebugPrintf function + if batchDebug { + segment.BatchDebugPrintf = DoDebugPrintf + } else { + segment.BatchDebugPrintf = NoDebugPrintf + } + } + + // parse queueStatusInterval option + segment.QueueStatusInterval = defaultQueueStatusInterval + if config["queuestatusinterval"] != "" { + segment.QueueStatusInterval, err = time.ParseDuration(config["queuestatusinterval"]) + if err != nil { + log.Fatalf("[error] Diskbuffer: Failed to parse queuestatussnterval config option: %s", err) + } + } + + // create buffered channel + if config["queuesize"] != "" { + buflen, err = strconv.Atoi(config["queuesize"]) + if err != nil { + log.Fatalf("[error] Diskbuffer: Failed to parse queuesize config option: %s", err) + } + } else { + buflen = defaultQueueSize + } + if buflen < 64 { + log.Printf("[error] Diskbuffer: queuesize too small, using default %d", defaultQueueSize) + buflen = defaultQueueSize + } + segment.MemoryBuffer = make(chan *pb.EnrichedFlow, buflen) + + return segment +} + +func (segment *DiskBuffer) Run(wg *sync.WaitGroup) { + var BufferWG sync.WaitGroup + var ReadWriteWG sync.WaitGroup + var CacheFiles []string + var CacheFilesSize int64 = 0 + capacity := cap(segment.MemoryBuffer) + StopDecider := make(chan struct{}) + + FuncWatchCacheFiles := func(Signal chan struct{}) { + defer BufferWG.Done() + var err error + + for { + pattern := fmt.Sprintf("%s/*.json.zst", segment.BufferDir) + CacheFiles, err = filepath.Glob(pattern) + if err != nil { + log.Fatalf("[error] Diskbuffer: Failed with filepath glob: %s", err) + } + // sum sizes + CacheFilesSize = 0 + for _, filename := range CacheFiles { + fi, err := os.Stat(filename) + if err != nil { + log.Printf("[warning] Diskbuffer: Could not obtain file info for file %s", filename) + } + CacheFilesSize += fi.Size() + } + + select { + case <- Signal: + return + case <- time.After(10 * time.Second): + } + } + } + + + FuncWriteWatchdogLowMemoryMark := func(Signal chan struct{}, StopWritingToDisk chan struct{}) { + defer ReadWriteWG.Done() + for { + select { + case <- Signal: + return + case <- StopDecider: + time.Sleep(100 * time.Millisecond) + default: + length := len(segment.MemoryBuffer) + if length < segment.LowMemoryMark * capacity / 100 { + close(StopWritingToDisk) + return + } + time.Sleep(100 * time.Millisecond) + } + } + } + + + FuncWriteToDisk := func(Signal chan struct{}, Watchdogs chan struct{}) { + defer close(Watchdogs) + defer ReadWriteWG.Done() + + log.Print("[debug] Diskbuffer: Started Writing to Disk") + defer log.Print("[debug] Diskbuffer: Ended Writing to Disk") + + // we need a new filename + filename := fmt.Sprintf("%s/%s.json.zst", segment.BufferDir, uuid.NewString()) + + file, err := os.Create(filename) + if err != nil { + log.Printf("[error] Diskbuffer: File specified in 'filename' is not accessible: %s", err) + } + level := zstd.SpeedFastest + encoder, err := zstd.NewWriter(file, zstd.WithEncoderLevel(level)) + if err != nil { + log.Fatalf("[error] Diskbuffer: error creating zstd encoder: %s", err) + } + writer := bufio.NewWriterSize(encoder, 65536) + + defer file.Close() + defer encoder.Close() + defer writer.Flush() + + for { + select { + case <-Signal: + return + default: + for i := 0; i < segment.BatchSize; i++ { + select { + case msg := <- segment.MemoryBuffer: + data, err := protojson.Marshal(msg) + if err != nil { + log.Printf("[warning] Diskbuffer: Skipping a flow, failed to recode protobuf as JSON: %v", err) + continue + } + + // use Fprintln because it adds an OS specific newline + _, err = fmt.Fprintln(writer, string(data)) + if err != nil { + log.Printf("[warning] Diskbuffer: Skipping a flow, failed to write to file %s: %v", filename, err) + continue + } + default: + // MemoryBuffer is empty -> no need to write anyhing to disk + return + } + } + fi, err := file.Stat() + if err != nil { + log.Printf("[warning] Diskbuffer: Could not obtain file info for file %s", filename) + } + if uint64(fi.Size()) > segment.FileSize { + log.Printf("[debug] Diskbuffer: File %s is bigger than %d, stopping write", filename, segment.FileSize) + break + } + } + } + } + FuncReadWatchdogLowMemoryMark := func(Signal chan struct{}, StopReadingFromDisk chan struct{}) { + defer ReadWriteWG.Done() + for { + select { + case <- Signal: + return + default: + length := len(segment.MemoryBuffer) + if length > segment.LowMemoryMark * capacity / 100 { + close(StopReadingFromDisk) + return + } + time.Sleep(100 * time.Millisecond) + } + } + } + FuncReadWatchdogHighMemoryMark := func(Signal chan struct{}, EmergencyStopReadingFromDisk chan struct{}) { + defer ReadWriteWG.Done() + for { + select { + case <- Signal: + return + case <- StopDecider: + close(EmergencyStopReadingFromDisk) + return + default: + length := len(segment.MemoryBuffer) + if length > segment.HighMemoryMark * capacity / 100 { + close(EmergencyStopReadingFromDisk) + return + } + time.Sleep(100 * time.Millisecond) + } + } + } + FuncReadFromDisk := func(Signal chan struct{}, EmergencySignal chan struct{}, Watchdogs chan struct{}) { + defer close(Watchdogs) + defer ReadWriteWG.Done() + + log.Print("[debug] Diskbuffer: Started Reading from Disk") + defer log.Print("[debug] Diskbuffer: Ended Reading from Disk") + + // the ReadWriteWG ensures, that there are no Read and Write at the same time. + // hence we can read from every file that exists + fromReader := make(chan []byte) + go func() { + for _, filename := range CacheFiles { + file, err := os.Open(filename) + + if err != nil { + log.Printf("[warning] Diskbuffer: Could not open file: %s, with error %s", filename, err) + continue + } + + var decoder, _ = zstd.NewReader(file) + scanner := bufio.NewScanner(decoder) + for { + scan := scanner.Scan() + err := scanner.Err() + if errors.Is(err, io.ErrUnexpectedEOF) { + log.Printf("[warning] Diskbuffer: Unexpected EOF: %v", err) + break + } + if err != nil { + log.Printf("[warning] Diskbuffer: Skipping a flow, could not read line from stdin: %v", err) + continue + } + if !scan && scanner.Err() == nil { + break + } + if len(scanner.Text()) == 0 { + continue + } + fromReader <- []byte(scanner.Text()) + } + // end-of-file: delete it + file.Close() + err = os.Remove(filename) + if err != nil { + log.Printf("[warning] Diskbuffer: Could not remove file %s with error %s", filename, err) + } + // check signal channel, if we have a signal, do not read any new file + select { + case <- Signal: + close(fromReader) + return + case <- EmergencySignal: + close(fromReader) + return + default: + } + } + close(fromReader) + }() + for line := range fromReader { + select { + case <- EmergencySignal: + log.Print("[warning] Diskbuffer: While reading from disk, got into high watermark") + // we are in high watermark again + // write every line in a new file, then stop reading + filename := fmt.Sprintf("%s/rest_%s.json.zst", segment.BufferDir, uuid.NewString()) + file, err := os.Create(filename) + if err != nil { + log.Printf("[error] Diskbuffer: File specified in 'filename' is not accessible: %s", err) + } + level := zstd.SpeedDefault + encoder, err := zstd.NewWriter(file, zstd.WithEncoderLevel(level)) + if err != nil { + log.Fatalf("[error] Diskbuffer: error creating zstd encoder: %s", err) + } + writer := bufio.NewWriter(encoder) + + defer file.Close() + defer encoder.Close() + defer writer.Flush() + + for emerg_line := range fromReader { + // use Fprintln because it adds an OS specific newline + _, err = fmt.Fprintln(writer, emerg_line) + if err != nil { + log.Printf("[warning] Diskbuffer: Skipping a flow, failed to write to file %s: %v", filename, err) + continue + } + } + default: + msg := &pb.EnrichedFlow{} + err := protojson.Unmarshal(line, msg) + if err != nil { + log.Printf("[warning] Diskbuffer: Skipping a flow, failed to recode input to protobuf: %v", err) + continue + } + select { + case segment.Out <- msg: + case <- time.After(10* time.Millisecond): + segment.MemoryBuffer <- msg + } + } + } + } + defer func() { + close(segment.Out) + wg.Done() + log.Println("[info] Diskbuffer: All writer functions have stopped, exiting…") + }() + defer BufferWG.Wait() + + // print queue status information + StopQueueStatusInterval := make(chan struct{}) + if segment.QueueStatusInterval > 0 { + BufferWG.Add(1) + go func() { + defer BufferWG.Done() + length := cap(segment.MemoryBuffer) + for { + select { + case <- StopQueueStatusInterval: + return + case <- time.After(segment.QueueStatusInterval): + fill := len(segment.MemoryBuffer) + log.Printf("[debug] Diskbuffer: Queue is %3.2f%% full (%d/%d)", float64(fill)/float64(length)*100, fill, length) + } + } + }() + } + StopWritingNextSegment := make(chan struct{}) + StopCacheFileWatcher := make(chan struct{}) + // read from input into memory buffer + BufferWG.Add(1) + go func() { + defer BufferWG.Done() + for msg := range segment.In { + segment.MemoryBuffer <- msg + } + close(StopQueueStatusInterval) + close(StopCacheFileWatcher) + close(StopWritingNextSegment) + close(StopDecider) + }() + + // write into next segment + BufferWG.Add(1) + go func() { + defer BufferWG.Done() + for { + select { + case <- StopWritingNextSegment: + return + default: + msg := <-segment.MemoryBuffer + segment.Out <- msg + } + } + }() + + BufferWG.Add(1) + go FuncWatchCacheFiles(StopCacheFileWatcher) + + // decider if we should write into compressed files + BufferWG.Add(1) + go func() { + defer BufferWG.Done() + defer log.Print("[debug] Diskbuffer: Stopping Decider") + log.Print("[debug] Diskbuffer: Starting Decider") + for { + select { + case <- StopDecider: + ReadWriteWG.Add(1) + StopWritingToDisk := make(chan struct{}) + StopWatchdogs := make(chan struct{}) + go FuncWriteToDisk(StopWritingToDisk, StopWatchdogs) + ReadWriteWG.Wait() + return + default: + length := len(segment.MemoryBuffer) + + if length < segment.ReadingMemoryMark * capacity / 100 && len(CacheFiles) > 0 { + ReadWriteWG.Wait() + ReadWriteWG.Add(3) + + StopReadingFromDisk := make(chan struct{}) + EmergencyStopReadingFromDisk := make(chan struct{}) + StopWatchdogs := make(chan struct{}) + go FuncReadWatchdogLowMemoryMark(StopWatchdogs, StopReadingFromDisk) + go FuncReadWatchdogHighMemoryMark(StopWatchdogs, EmergencyStopReadingFromDisk) + go FuncReadFromDisk(StopReadingFromDisk, EmergencyStopReadingFromDisk, StopWatchdogs) + ReadWriteWG.Wait() + } + if length > segment.HighMemoryMark * capacity / 100 && uint64(CacheFilesSize) < segment.MaxCacheSize { + log.Print("[debug] Diskbuffer: Try to buffer to disk") + // start new go routine + ReadWriteWG.Wait() + ReadWriteWG.Add(2) + StopWritingToDisk := make(chan struct{}) + StopWatchdogs := make(chan struct{}) + go FuncWriteWatchdogLowMemoryMark(StopWatchdogs, StopWritingToDisk) + go FuncWriteToDisk(StopWritingToDisk, StopWatchdogs) + ReadWriteWG.Wait() + } + time.Sleep(100 * time.Millisecond) + } + } + }() +} + +// register segment +func init() { + segment := &DiskBuffer{} + segments.RegisterSegment("diskbuffer", segment) +} From d23bde3e5aea477171182bcf7dbda0f43d77a027 Mon Sep 17 00:00:00 2001 From: Konstantin Zangerle Date: Wed, 16 Aug 2023 00:28:37 +0200 Subject: [PATCH 03/18] some refactoring --- segments/input/diskbuffer/diskbuffer.go | 489 ++++++++++++------------ 1 file changed, 255 insertions(+), 234 deletions(-) diff --git a/segments/input/diskbuffer/diskbuffer.go b/segments/input/diskbuffer/diskbuffer.go index d2debbf..1dc6cec 100644 --- a/segments/input/diskbuffer/diskbuffer.go +++ b/segments/input/diskbuffer/diskbuffer.go @@ -42,7 +42,8 @@ type DiskBuffer struct { HighMemoryMark int LowMemoryMark int ReadingMemoryMark int - MaxCacheSize uint64 + MaxCacheSize uint64 + Capacity int } func NoDebugPrintf(format string, v ...any) {} @@ -181,267 +182,298 @@ func (segment *DiskBuffer) New(config map[string]string) segments.Segment { buflen = defaultQueueSize } segment.MemoryBuffer = make(chan *pb.EnrichedFlow, buflen) - + segment.Capacity = cap(segment.MemoryBuffer) return segment } -func (segment *DiskBuffer) Run(wg *sync.WaitGroup) { - var BufferWG sync.WaitGroup - var ReadWriteWG sync.WaitGroup - var CacheFiles []string - var CacheFilesSize int64 = 0 - capacity := cap(segment.MemoryBuffer) - StopDecider := make(chan struct{}) +func WatchCacheFiles(segment *DiskBuffer, BufferWG *sync.WaitGroup, Signal chan struct{}, CacheFiles *[]string) { + defer BufferWG.Done() + var err error - FuncWatchCacheFiles := func(Signal chan struct{}) { - defer BufferWG.Done() - var err error - - for { - pattern := fmt.Sprintf("%s/*.json.zst", segment.BufferDir) - CacheFiles, err = filepath.Glob(pattern) + for { + pattern := fmt.Sprintf("%s/*.json.zst", segment.BufferDir) + *CacheFiles, err = filepath.Glob(pattern) + if err != nil { + log.Fatalf("[error] Diskbuffer: Failed with filepath glob: %s", err) + } + // sum sizes + var CacheFilesSize int64 = 0 + for _, filename := range *CacheFiles { + fi, err := os.Stat(filename) if err != nil { - log.Fatalf("[error] Diskbuffer: Failed with filepath glob: %s", err) - } - // sum sizes - CacheFilesSize = 0 - for _, filename := range CacheFiles { - fi, err := os.Stat(filename) - if err != nil { - log.Printf("[warning] Diskbuffer: Could not obtain file info for file %s", filename) - } - CacheFilesSize += fi.Size() + log.Printf("[warning] Diskbuffer: Could not obtain file info for file %s", filename) } + CacheFilesSize += fi.Size() + } - select { - case <- Signal: - return - case <- time.After(10 * time.Second): - } + select { + case <- Signal: + return + case <- time.After(10 * time.Second): } } +} - - FuncWriteWatchdogLowMemoryMark := func(Signal chan struct{}, StopWritingToDisk chan struct{}) { - defer ReadWriteWG.Done() - for { - select { - case <- Signal: +func WriteWatchdogLowMemoryMark(segment *DiskBuffer, ReadWriteWG *sync.WaitGroup, Signal chan struct{}, StopDecider chan struct{}, StopWritingToDisk chan struct{}) { + defer ReadWriteWG.Done() + for { + select { + case <- Signal: + return + case <- StopDecider: + time.Sleep(100 * time.Millisecond) + default: + length := len(segment.MemoryBuffer) + if length < segment.LowMemoryMark * segment.Capacity / 100 { + close(StopWritingToDisk) return - case <- StopDecider: - time.Sleep(100 * time.Millisecond) - default: - length := len(segment.MemoryBuffer) - if length < segment.LowMemoryMark * capacity / 100 { - close(StopWritingToDisk) - return - } - time.Sleep(100 * time.Millisecond) } + time.Sleep(100 * time.Millisecond) } } +} +func WriteToDisk(segment *DiskBuffer, ReadWriteWG *sync.WaitGroup, Signal chan struct{}, Watchdogs chan struct{}) { + defer close(Watchdogs) + defer ReadWriteWG.Done() + + log.Print("[debug] Diskbuffer: Started Writing to Disk") + defer log.Print("[debug] Diskbuffer: Ended Writing to Disk") + // we need a new filename + filename := fmt.Sprintf("%s/%s.json.zst", segment.BufferDir, uuid.NewString()) - FuncWriteToDisk := func(Signal chan struct{}, Watchdogs chan struct{}) { - defer close(Watchdogs) - defer ReadWriteWG.Done() - - log.Print("[debug] Diskbuffer: Started Writing to Disk") - defer log.Print("[debug] Diskbuffer: Ended Writing to Disk") - - // we need a new filename - filename := fmt.Sprintf("%s/%s.json.zst", segment.BufferDir, uuid.NewString()) - - file, err := os.Create(filename) - if err != nil { - log.Printf("[error] Diskbuffer: File specified in 'filename' is not accessible: %s", err) - } - level := zstd.SpeedFastest - encoder, err := zstd.NewWriter(file, zstd.WithEncoderLevel(level)) - if err != nil { - log.Fatalf("[error] Diskbuffer: error creating zstd encoder: %s", err) - } - writer := bufio.NewWriterSize(encoder, 65536) - - defer file.Close() - defer encoder.Close() - defer writer.Flush() - - for { - select { - case <-Signal: - return - default: - for i := 0; i < segment.BatchSize; i++ { - select { - case msg := <- segment.MemoryBuffer: - data, err := protojson.Marshal(msg) - if err != nil { - log.Printf("[warning] Diskbuffer: Skipping a flow, failed to recode protobuf as JSON: %v", err) - continue - } - - // use Fprintln because it adds an OS specific newline - _, err = fmt.Fprintln(writer, string(data)) - if err != nil { - log.Printf("[warning] Diskbuffer: Skipping a flow, failed to write to file %s: %v", filename, err) - continue - } - default: - // MemoryBuffer is empty -> no need to write anyhing to disk - return + file, err := os.Create(filename) + if err != nil { + log.Printf("[error] Diskbuffer: File specified in 'filename' is not accessible: %s", err) + } + level := zstd.SpeedFastest + encoder, err := zstd.NewWriter(file, zstd.WithEncoderLevel(level)) + if err != nil { + log.Fatalf("[error] Diskbuffer: error creating zstd encoder: %s", err) + } + writer := bufio.NewWriterSize(encoder, 65536) + + defer file.Close() + defer encoder.Close() + defer writer.Flush() + + for { + select { + case <-Signal: + return + default: + for i := 0; i < segment.BatchSize; i++ { + select { + case msg := <- segment.MemoryBuffer: + data, err := protojson.Marshal(msg) + if err != nil { + log.Printf("[warning] Diskbuffer: Skipping a flow, failed to recode protobuf as JSON: %v", err) + continue } + + // use Fprintln because it adds an OS specific newline + _, err = fmt.Fprintln(writer, string(data)) + if err != nil { + log.Printf("[warning] Diskbuffer: Skipping a flow, failed to write to file %s: %v", filename, err) + continue + } + default: + // MemoryBuffer is empty -> no need to write anyhing to disk + return } - fi, err := file.Stat() - if err != nil { - log.Printf("[warning] Diskbuffer: Could not obtain file info for file %s", filename) - } - if uint64(fi.Size()) > segment.FileSize { - log.Printf("[debug] Diskbuffer: File %s is bigger than %d, stopping write", filename, segment.FileSize) - break - } + } + fi, err := file.Stat() + if err != nil { + log.Printf("[warning] Diskbuffer: Could not obtain file info for file %s", filename) + } + if uint64(fi.Size()) > segment.FileSize { + log.Printf("[debug] Diskbuffer: File %s is bigger than %d, stopping write", filename, segment.FileSize) + break } } } - FuncReadWatchdogLowMemoryMark := func(Signal chan struct{}, StopReadingFromDisk chan struct{}) { - defer ReadWriteWG.Done() - for { - select { - case <- Signal: +} +func ReadWatchdogLowMemoryMark(segment *DiskBuffer, ReadWriteWG *sync.WaitGroup, Signal chan struct{}, StopReadingFromDisk chan struct{}) { + defer ReadWriteWG.Done() + for { + select { + case <- Signal: + return + default: + length := len(segment.MemoryBuffer) + if length > segment.LowMemoryMark * segment.Capacity / 100 { + close(StopReadingFromDisk) return - default: - length := len(segment.MemoryBuffer) - if length > segment.LowMemoryMark * capacity / 100 { - close(StopReadingFromDisk) - return - } - time.Sleep(100 * time.Millisecond) } + time.Sleep(100 * time.Millisecond) } } - FuncReadWatchdogHighMemoryMark := func(Signal chan struct{}, EmergencyStopReadingFromDisk chan struct{}) { - defer ReadWriteWG.Done() - for { - select { - case <- Signal: - return - case <- StopDecider: +} +func ReadWatchdogHighMemoryMark(segment *DiskBuffer, ReadWriteWG *sync.WaitGroup, Signal chan struct{}, StopDecider chan struct{}, EmergencyStopReadingFromDisk chan struct{}) { + defer ReadWriteWG.Done() + for { + select { + case <- Signal: + return + case <- StopDecider: + close(EmergencyStopReadingFromDisk) + return + default: + length := len(segment.MemoryBuffer) + if length > segment.HighMemoryMark * segment.Capacity / 100 { close(EmergencyStopReadingFromDisk) return - default: - length := len(segment.MemoryBuffer) - if length > segment.HighMemoryMark * capacity / 100 { - close(EmergencyStopReadingFromDisk) - return - } - time.Sleep(100 * time.Millisecond) - } - } + } + time.Sleep(100 * time.Millisecond) + } } - FuncReadFromDisk := func(Signal chan struct{}, EmergencySignal chan struct{}, Watchdogs chan struct{}) { - defer close(Watchdogs) - defer ReadWriteWG.Done() - - log.Print("[debug] Diskbuffer: Started Reading from Disk") - defer log.Print("[debug] Diskbuffer: Ended Reading from Disk") - - // the ReadWriteWG ensures, that there are no Read and Write at the same time. - // hence we can read from every file that exists - fromReader := make(chan []byte) - go func() { - for _, filename := range CacheFiles { - file, err := os.Open(filename) - +} + +func ReadFromDisk(segment *DiskBuffer, ReadWriteWG *sync.WaitGroup, Signal chan struct{}, EmergencySignal chan struct{}, Watchdogs chan struct{}, CacheFiles *[]string) { + defer close(Watchdogs) + defer ReadWriteWG.Done() + + log.Print("[debug] Diskbuffer: Started Reading from Disk") + defer log.Print("[debug] Diskbuffer: Ended Reading from Disk") + + // the ReadWriteWG ensures, that there are no Read and Write at the same time. + // hence we can read from every file that exists + fromReader := make(chan []byte) + go func() { + for _, filename := range *CacheFiles { + file, err := os.Open(filename) + + if err != nil { + log.Printf("[warning] Diskbuffer: Could not open file: %s, with error %s", filename, err) + continue + } + + var decoder, _ = zstd.NewReader(file) + scanner := bufio.NewScanner(decoder) + for { + scan := scanner.Scan() + err := scanner.Err() + if errors.Is(err, io.ErrUnexpectedEOF) { + log.Printf("[warning] Diskbuffer: Unexpected EOF: %v", err) + break + } if err != nil { - log.Printf("[warning] Diskbuffer: Could not open file: %s, with error %s", filename, err) + log.Printf("[warning] Diskbuffer: Skipping a flow, could not read line from stdin: %v", err) continue } - - var decoder, _ = zstd.NewReader(file) - scanner := bufio.NewScanner(decoder) - for { - scan := scanner.Scan() - err := scanner.Err() - if errors.Is(err, io.ErrUnexpectedEOF) { - log.Printf("[warning] Diskbuffer: Unexpected EOF: %v", err) - break - } - if err != nil { - log.Printf("[warning] Diskbuffer: Skipping a flow, could not read line from stdin: %v", err) - continue - } - if !scan && scanner.Err() == nil { - break - } - if len(scanner.Text()) == 0 { - continue - } - fromReader <- []byte(scanner.Text()) - } - // end-of-file: delete it - file.Close() - err = os.Remove(filename) - if err != nil { - log.Printf("[warning] Diskbuffer: Could not remove file %s with error %s", filename, err) + if !scan && scanner.Err() == nil { + break } - // check signal channel, if we have a signal, do not read any new file - select { - case <- Signal: - close(fromReader) - return - case <- EmergencySignal: - close(fromReader) - return - default: + if len(scanner.Text()) == 0 { + continue } + fromReader <- []byte(scanner.Text()) + } + // end-of-file: delete it + file.Close() + err = os.Remove(filename) + if err != nil { + log.Printf("[warning] Diskbuffer: Could not remove file %s with error %s", filename, err) } - close(fromReader) - }() - for line := range fromReader { + // check signal channel, if we have a signal, do not read any new file select { - case <- EmergencySignal: - log.Print("[warning] Diskbuffer: While reading from disk, got into high watermark") - // we are in high watermark again - // write every line in a new file, then stop reading - filename := fmt.Sprintf("%s/rest_%s.json.zst", segment.BufferDir, uuid.NewString()) - file, err := os.Create(filename) - if err != nil { - log.Printf("[error] Diskbuffer: File specified in 'filename' is not accessible: %s", err) - } - level := zstd.SpeedDefault - encoder, err := zstd.NewWriter(file, zstd.WithEncoderLevel(level)) - if err != nil { - log.Fatalf("[error] Diskbuffer: error creating zstd encoder: %s", err) - } - writer := bufio.NewWriter(encoder) + case <- Signal: + close(fromReader) + return + case <- EmergencySignal: + close(fromReader) + return + default: + } + } + close(fromReader) + }() + for line := range fromReader { + select { + case <- EmergencySignal: + log.Print("[warning] Diskbuffer: While reading from disk, got into high watermark") + // we are in high watermark again + // write every line in a new file, then stop reading + filename := fmt.Sprintf("%s/rest_%s.json.zst", segment.BufferDir, uuid.NewString()) + file, err := os.Create(filename) + if err != nil { + log.Printf("[error] Diskbuffer: File specified in 'filename' is not accessible: %s", err) + } + level := zstd.SpeedDefault + encoder, err := zstd.NewWriter(file, zstd.WithEncoderLevel(level)) + if err != nil { + log.Fatalf("[error] Diskbuffer: error creating zstd encoder: %s", err) + } + writer := bufio.NewWriter(encoder) - defer file.Close() - defer encoder.Close() - defer writer.Flush() + defer file.Close() + defer encoder.Close() + defer writer.Flush() - for emerg_line := range fromReader { - // use Fprintln because it adds an OS specific newline - _, err = fmt.Fprintln(writer, emerg_line) - if err != nil { - log.Printf("[warning] Diskbuffer: Skipping a flow, failed to write to file %s: %v", filename, err) - continue - } - } - default: - msg := &pb.EnrichedFlow{} - err := protojson.Unmarshal(line, msg) + for emerg_line := range fromReader { + // use Fprintln because it adds an OS specific newline + _, err = fmt.Fprintln(writer, emerg_line) if err != nil { - log.Printf("[warning] Diskbuffer: Skipping a flow, failed to recode input to protobuf: %v", err) + log.Printf("[warning] Diskbuffer: Skipping a flow, failed to write to file %s: %v", filename, err) continue } - select { - case segment.Out <- msg: - case <- time.After(10* time.Millisecond): - segment.MemoryBuffer <- msg - } + } + default: + msg := &pb.EnrichedFlow{} + err := protojson.Unmarshal(line, msg) + if err != nil { + log.Printf("[warning] Diskbuffer: Skipping a flow, failed to recode input to protobuf: %v", err) + continue + } + select { + case segment.Out <- msg: + case <- time.After(10* time.Millisecond): + segment.MemoryBuffer <- msg } } } +} +func QueueStatus(segment *DiskBuffer, BufferWG *sync.WaitGroup, StopQueueStatusInterval chan struct{}) { + defer BufferWG.Done() + for { + select { + case <- StopQueueStatusInterval: + return + case <- time.After(segment.QueueStatusInterval): + fill := len(segment.MemoryBuffer) + log.Printf("[debug] Diskbuffer: Queue is %3.2f%% full (%d/%d)", float64(fill)/float64(segment.Capacity)*100, fill, segment.Capacity) + } + } +} + +func (segment *DiskBuffer) Run(wg *sync.WaitGroup) { + var BufferWG sync.WaitGroup + var ReadWriteWG sync.WaitGroup + var CacheFiles []string + var CacheFilesSize int64 = 0 + StopDecider := make(chan struct{}) + + FuncWatchCacheFiles := func(Signal chan struct{}) { + WatchCacheFiles(segment, &BufferWG, Signal, &CacheFiles) + } + + FuncWriteWatchdogLowMemoryMark := func(Signal chan struct{}, StopWritingToDisk chan struct{}) { + WriteWatchdogLowMemoryMark(segment, &ReadWriteWG, Signal, StopDecider, StopWritingToDisk) + } + + FuncWriteToDisk := func(Signal chan struct{}, Watchdogs chan struct{}) { + WriteToDisk(segment, &ReadWriteWG, Signal, Watchdogs) + } + + FuncReadWatchdogLowMemoryMark := func(Signal chan struct{}, StopReadingFromDisk chan struct{}) { + ReadWatchdogLowMemoryMark(segment, &ReadWriteWG, Signal, StopReadingFromDisk) + } + FuncReadWatchdogHighMemoryMark := func(Signal chan struct{}, EmergencyStopReadingFromDisk chan struct{}) { + ReadWatchdogHighMemoryMark(segment, &ReadWriteWG, Signal, StopDecider, EmergencyStopReadingFromDisk) + } + FuncReadFromDisk := func(Signal chan struct{}, EmergencySignal chan struct{}, Watchdogs chan struct{}) { + ReadFromDisk(segment, &ReadWriteWG, Signal, EmergencySignal, Watchdogs, &CacheFiles) + } defer func() { close(segment.Out) wg.Done() @@ -453,20 +485,9 @@ func (segment *DiskBuffer) Run(wg *sync.WaitGroup) { StopQueueStatusInterval := make(chan struct{}) if segment.QueueStatusInterval > 0 { BufferWG.Add(1) - go func() { - defer BufferWG.Done() - length := cap(segment.MemoryBuffer) - for { - select { - case <- StopQueueStatusInterval: - return - case <- time.After(segment.QueueStatusInterval): - fill := len(segment.MemoryBuffer) - log.Printf("[debug] Diskbuffer: Queue is %3.2f%% full (%d/%d)", float64(fill)/float64(length)*100, fill, length) - } - } - }() + go QueueStatus(segment, &BufferWG, StopQueueStatusInterval) } + StopWritingNextSegment := make(chan struct{}) StopCacheFileWatcher := make(chan struct{}) // read from input into memory buffer @@ -518,7 +539,7 @@ func (segment *DiskBuffer) Run(wg *sync.WaitGroup) { default: length := len(segment.MemoryBuffer) - if length < segment.ReadingMemoryMark * capacity / 100 && len(CacheFiles) > 0 { + if length < segment.ReadingMemoryMark * segment.Capacity / 100 && len(CacheFiles) > 0 { ReadWriteWG.Wait() ReadWriteWG.Add(3) @@ -530,7 +551,7 @@ func (segment *DiskBuffer) Run(wg *sync.WaitGroup) { go FuncReadFromDisk(StopReadingFromDisk, EmergencyStopReadingFromDisk, StopWatchdogs) ReadWriteWG.Wait() } - if length > segment.HighMemoryMark * capacity / 100 && uint64(CacheFilesSize) < segment.MaxCacheSize { + if length > segment.HighMemoryMark * segment.Capacity / 100 && uint64(CacheFilesSize) < segment.MaxCacheSize { log.Print("[debug] Diskbuffer: Try to buffer to disk") // start new go routine ReadWriteWG.Wait() From 7d8d88b8b9a47cfeb7dd824d1af8fa1c8ffa0e55 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Tue, 29 Oct 2024 10:37:46 +0100 Subject: [PATCH 04/18] new segment mongodb Allows exporting to an external mongoDb. By using capped collections, the disk size used by flowpipeline can be limited to a fixed size --- go.mod | 19 +- go.sum | 28 +++ main.go | 1 + segments/output/mongodb/mongo.go | 310 ++++++++++++++++++++++++++ segments/output/mongodb/mongo_test.go | 122 ++++++++++ 5 files changed, 475 insertions(+), 5 deletions(-) create mode 100644 segments/output/mongodb/mongo.go create mode 100644 segments/output/mongodb/mongo_test.go diff --git a/go.mod b/go.mod index 1928f1a..9e77cea 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,14 @@ require ( gopkg.in/yaml.v2 v2.4.0 ) +require ( + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect +) + require ( github.com/ClickHouse/ch-go v0.53.0 // indirect github.com/alecthomas/participle/v2 v2.0.0-beta.1 // indirect @@ -92,13 +100,14 @@ require ( github.com/subosito/gotenv v1.4.2 // indirect github.com/vishvananda/netlink v1.2.1-beta.2 // indirect github.com/vishvananda/netns v0.0.4 // indirect + go.mongodb.org/mongo-driver v1.17.1 go.opentelemetry.io/otel v1.13.0 // indirect go.opentelemetry.io/otel/trace v1.13.0 // indirect - golang.org/x/crypto v0.6.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/net v0.21.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.23.0 // indirect + golang.org/x/text v0.17.0 // indirect google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec // indirect google.golang.org/grpc v1.53.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 5d47c55..54c55fa 100644 --- a/go.sum +++ b/go.sum @@ -376,6 +376,8 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/netsampler/goflow2 v1.1.1 h1:GpVlvPq4yRbyzoiz0Vp3XilNr5js/0UhHcQI7Ol/MDk= @@ -510,16 +512,26 @@ github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207 h1:nn7SOQy8xCu3i github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= +go.mongodb.org/mongo-driver v1.17.1 h1:Wic5cJIwJgSpBhe3lx3+/RybR5PiYRMpVFgO7cOHyIM= +go.mongodb.org/mongo-driver v1.17.1/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -553,6 +565,8 @@ golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -587,6 +601,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -626,11 +641,14 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -653,10 +671,13 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7 h1:ZrnxWX62AgTKOSagEqxvb3ffipvEDX2pl7E1TdqLqIc= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -711,6 +732,7 @@ golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -718,6 +740,8 @@ golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -728,10 +752,13 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -787,6 +814,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/main.go b/main.go index 9da6133..2ba4d76 100644 --- a/main.go +++ b/main.go @@ -55,6 +55,7 @@ import ( _ "github.com/bwNetFlow/flowpipeline/segments/output/json" _ "github.com/bwNetFlow/flowpipeline/segments/output/kafkaproducer" _ "github.com/bwNetFlow/flowpipeline/segments/output/lumberjack" + _ "github.com/bwNetFlow/flowpipeline/segments/output/mongodb" _ "github.com/bwNetFlow/flowpipeline/segments/output/sqlite" _ "github.com/bwNetFlow/flowpipeline/segments/print/count" diff --git a/segments/output/mongodb/mongo.go b/segments/output/mongodb/mongo.go new file mode 100644 index 0000000..802a161 --- /dev/null +++ b/segments/output/mongodb/mongo.go @@ -0,0 +1,310 @@ +//go:build cgo +// +build cgo + +// Dumps all incoming flow messages to a local mongodb database using a capped collection to limit the used disk space +package mongodb + +import ( + "context" + "errors" + "fmt" + "log" + "net" + "reflect" + "strconv" + "strings" + "sync" + + "github.com/bwNetFlow/flowpipeline/pb" + "github.com/bwNetFlow/flowpipeline/segments" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type Mongodb struct { + segments.BaseSegment + mongodbUri string + dbCollection *mongo.Collection + fieldTypes []string + fieldNames []string + ringbufferSize int64 + + databaseName string // default flowdata + collectionName string // default ringbuffer + Fields string // optional comma-separated list of fields to export, default is "", meaning all fields + BatchSize int // optional how many flows to hold in memory between INSERTs, default is 1000 +} + +// Every Segment must implement a New method, even if there isn't any config +// it is interested in. +func (segment Mongodb) New(configx map[string]string) segments.Segment { + newsegment := &Mongodb{} + + newsegment, err := fillSegmentWithConfig(newsegment, configx) + if err != nil { + log.Printf("[error] '%s'", err.Error()) + return nil + } + + ctx := context.Background() + + //Test if db connection works + client, err := mongo.Connect(ctx, options.Client().ApplyURI(newsegment.mongodbUri)) + if err == nil { + //test if the connection was acutally sucessful + err = client.Ping(ctx, options.Client().ReadPreference) + } + if err != nil { + log.Printf("[error] mongoDB: Could not open DB connection due to '%s", err.Error()) + return nil + } + db := client.Database(newsegment.databaseName) + + // collection in the mongdo should be capped to limit the used disk space + convertToCappedCollection(db, newsegment) + return newsegment +} + +func (segment *Mongodb) Run(wg *sync.WaitGroup) { + ctx := context.Background() + defer func() { + close(segment.Out) + wg.Done() + }() + + client, err := mongo.Connect(ctx, options.Client().ApplyURI(segment.mongodbUri)) + if err != nil { + log.Panic(err) // this has already been checked in New + } + db := client.Database(segment.databaseName) + segment.dbCollection = db.Collection(segment.collectionName) + + defer client.Disconnect(ctx) + + var unsaved []*pb.EnrichedFlow + + for msg := range segment.In { + unsaved = append(unsaved, msg) + if len(unsaved) >= segment.BatchSize { + err := segment.bulkInsert(unsaved, ctx) + if err != nil { + log.Printf("[error] %s", err) + } + unsaved = []*pb.EnrichedFlow{} + } + segment.Out <- msg + } + segment.bulkInsert(unsaved, ctx) +} + +func fillSegmentWithConfig(newsegment *Mongodb, config map[string]string) (*Mongodb, error) { + if config == nil { + return newsegment, errors.New("missing configuration for segment mongodb") + } + + if config["mongodb_uri"] == "" { + return newsegment, errors.New("mongoDB: mongodb_uri not defined") + } + newsegment.mongodbUri = config["mongodb_uri"] + + if config["database"] == "" { + log.Println("[INFO] mongoDB: no database defined - using default value (flowdata)") + config["database"] = "flowdata" + } + newsegment.databaseName = config["database"] + + if config["collection"] == "" { + log.Println("[INFO] mongoDB: no collection defined - using default value (ringbuffer)") + config["collection"] = "ringbuffer" + } + newsegment.collectionName = config["collection"] + + var ringbufferSize int64 = 10737418240 + if config["max_disk_usage"] == "" { + log.Println("[INFO] mongoDB: no ring buffer size defined - using default value (10GB)") + } else { + size, err := sizeInBytes(config["max_disk_usage"]) + if err == nil { + log.Println("[INFO] mongoDB: setting ring buffer size to " + config["max_disk_usage"]) + ringbufferSize = size + } else { + log.Println("[Warning] mongoDB: failed setting ring buffer size to " + config["max_disk_usage"] + " - using default as fallback (10GB)") + } + } + newsegment.ringbufferSize = ringbufferSize + + newsegment.BatchSize = 1000 + if config["batchsize"] != "" { + if parsedBatchSize, err := strconv.ParseUint(config["batchsize"], 10, 32); err == nil { + if parsedBatchSize == 0 { + return newsegment, errors.New("MongoDO: Batch size 0 is not allowed. Set this in relation to the expected flows per second") + } + newsegment.BatchSize = int(parsedBatchSize) + } else { + log.Println("[error] MongoDO: Could not parse 'batchsize' parameter, using default 1000.") + } + } else { + log.Println("[info] MongoDO: 'batchsize' set to default '1000'.") + } + + // determine field set + if config["fields"] != "" { + protofields := reflect.TypeOf(pb.EnrichedFlow{}) + conffields := strings.Split(config["fields"], ",") + for _, field := range conffields { + protofield, found := protofields.FieldByName(field) + if !found { + return newsegment, errors.New("csv: Field specified in 'fields' does not exist") + } + newsegment.fieldNames = append(newsegment.fieldNames, field) + newsegment.fieldTypes = append(newsegment.fieldTypes, protofield.Type.String()) + } + } else { + protofields := reflect.TypeOf(pb.EnrichedFlow{}) + // +-3 skips over protobuf state, sizeCache and unknownFields + newsegment.fieldNames = make([]string, protofields.NumField()-3) + newsegment.fieldTypes = make([]string, protofields.NumField()-3) + for i := 3; i < protofields.NumField(); i++ { + field := protofields.Field(i) + newsegment.fieldNames[i-3] = field.Name + newsegment.fieldTypes[i-3] = field.Type.String() + } + newsegment.Fields = config["fields"] + } + + return newsegment, nil +} + +func (segment Mongodb) bulkInsert(unsavedFlows []*pb.EnrichedFlow, ctx context.Context) error { + // not using transactions due to limitations of capped collectiction + // ("You cannot write to capped collections in transactions." + // https://www.mongodb.com/docs/manual/core/capped-collections/) + if len(unsavedFlows) == 0 { + return nil + } + unsavedFlowData := bson.A{} + for _, msg := range unsavedFlows { + singleFlowData := bson.M{} + values := reflect.ValueOf(msg).Elem() + for i, fieldname := range segment.fieldNames { + protofield := values.FieldByName(fieldname) + switch segment.fieldTypes[i] { + case "[]uint8": // this is neccessary for proper formatting + ipstring := net.IP(protofield.Interface().([]uint8)).String() + if ipstring == "" { + ipstring = "" + } + singleFlowData[fieldname] = ipstring + case "string": // this is because doing nothing is also much faster than Sprint + singleFlowData[fieldname] = protofield.Interface().(string) + default: + singleFlowData[fieldname] = fmt.Sprint(protofield) + } + } + unsavedFlowData = append(unsavedFlowData, singleFlowData) + } + _, err := segment.dbCollection.InsertMany(ctx, unsavedFlowData) + if err != nil { + log.Println("[error] mongoDB: Failed to insert due to " + err.Error()) + return err + } + return nil +} + +func init() { + segment := &Mongodb{} + segments.RegisterSegment("mongodb", segment) +} + +func sizeInBytes(sizeStr string) (int64, error) { + // Split into number and unit + parts := strings.Fields(sizeStr) + if len(parts) > 2 || len(parts) < 1 { + return 0, fmt.Errorf("invalid size format") + } + + size, err := strconv.ParseInt(parts[0], 10, 64) + if err != nil { + return 0, err + } + + if len(parts) == 1 { + return size, nil + } + + // Calculate bytes if a size was provided + unit := strings.ToUpper(parts[1]) + switch unit { + case "B": + return size, nil + case "KB": + return size * 1024, nil + case "MB": + return size * 1024 * 1024, nil + case "GB": + return size * 1024 * 1024 * 1024, nil + case "TB": + return size * 1024 * 1024 * 1024 * 1024, nil + default: + return 0, fmt.Errorf("unknown unit: %s", unit) + } +} + +/************************************************************************************************ +** Checks if the collection segment.collectionName in the db is a capped collection +** If not it converts it to a capped collection with the size segment.ringbufferSize +*************************************************************************************************/ +func convertToCappedCollection(db *mongo.Database, segment *Mongodb) error { + ctx := context.Background() + + collStats := db.RunCommand(ctx, bson.D{{Key: "collStats", Value: segment.collectionName}}) + + var collInfo struct { + Name string `bson:"name"` + Capped bool `bson:"capped"` + MaxSize int32 `bson:"maxSize"` + Count int64 `bson:"count"` + Size int64 `bson:"size"` + } + + if collStats.Err() != nil { + log.Printf("[Error] Failed to check Collection '%s' due to: '%s'\n", segment.collectionName, collStats.Err().Error()) + return collStats.Err() + } + + if err := collStats.Decode(&collInfo); err != nil { + return fmt.Errorf("failed to decode collection info: %v", err) + } + + if collInfo.Count == 0 { + // Create a new capped collection + cappedOptions := options.CreateCollection().SetCapped(true).SetSizeInBytes(segment.ringbufferSize) + err := db.CreateCollection(ctx, segment.collectionName, cappedOptions) + if err != nil { + return fmt.Errorf("failed to create capped collection: %v", err) + } + + log.Printf("[Debug] Capped collection '%s' created successfully.\n", segment.collectionName) + return nil + } + + if !collInfo.Capped { + log.Printf("[Warning] Collection '%s' is not capped. Starting converting it...\n", segment.collectionName) + db.RunCommand(ctx, bson.D{ + {Key: "convertToCapped", Value: segment.collectionName}, + {Key: "size", Value: segment.ringbufferSize}, + }) + return nil + } + + log.Printf("[INFO] Collection '%s' is already capped.\n", segment.collectionName) + if collInfo.MaxSize != int32(segment.ringbufferSize) { + log.Printf("[Warning] Changing max size of collection '%s' from '%d' to '%d'.\n", segment.collectionName, collInfo.MaxSize, segment.ringbufferSize) + db.RunCommand(ctx, bson.D{ + {Key: "collMod", Value: segment.collectionName}, + {Key: "cappedSize", Value: segment.ringbufferSize}, + }) + } + return nil +} diff --git a/segments/output/mongodb/mongo_test.go b/segments/output/mongodb/mongo_test.go new file mode 100644 index 0000000..af7bfbf --- /dev/null +++ b/segments/output/mongodb/mongo_test.go @@ -0,0 +1,122 @@ +//go:build cgo +// +build cgo + +package mongodb + +import ( + "io" + "log" + "os" + "sync" + "testing" + + "github.com/bwNetFlow/flowpipeline/pb" + // "github.com/bwNetFlow/flowpipeline/segments" +) + +// Mongodb Segment test, passthrough test only +func TestSegment_Mongodb_passthrough(t *testing.T) { + // result := segments.TestSegment("Mongodb", map[string]string{"mongodb_uri": "mongodb://localhost:27017/" , "database":"testing"}, + // &pb.EnrichedFlow{SrcAddr: []byte{192, 168, 88, 142}, DstAddr: []byte{192, 168, 88, 143}, Proto: 45}) + // if result == nil { + // t.Error("Segment Mongodb is not passing through flows.") + // } + segment := Mongodb{}.New(map[string]string{"mongodb_uri": "mongodb://localhost:27017/", "database": "testing"}) + + in, out := make(chan *pb.EnrichedFlow), make(chan *pb.EnrichedFlow) + segment.Rewire(in, out) + + wg := &sync.WaitGroup{} + wg.Add(1) + go segment.Run(wg) + in <- &pb.EnrichedFlow{SrcAddr: []byte{192, 168, 88, 1}, DstAddr: []byte{192, 168, 88, 1}, Proto: 1} + <-out + in <- &pb.EnrichedFlow{SrcAddr: []byte{192, 168, 88, 2}, DstAddr: []byte{192, 168, 88, 2}, Proto: 2} + <-out + close(in) + wg.Wait() +} + +// Mongodb Segment benchmark with 1000 samples stored in memory +func BenchmarkMongodb_1000(b *testing.B) { + log.SetOutput(io.Discard) + os.Stdout, _ = os.Open(os.DevNull) + + segment := Mongodb{}.New(map[string]string{"mongodb_uri": "mongodb://localhost:27017/", "database": "testing"}) + + in, out := make(chan *pb.EnrichedFlow), make(chan *pb.EnrichedFlow) + segment.Rewire(in, out) + + wg := &sync.WaitGroup{} + wg.Add(1) + go segment.Run(wg) + + for n := 0; n < b.N; n++ { + in <- &pb.EnrichedFlow{SrcAddr: []byte{192, 168, 88, 142}, DstAddr: []byte{192, 168, 88, 143}, Proto: 45} + _ = <-out + } + close(in) +} + +// Mongodb Segment benchmark with 10000 samples stored in memory +func BenchmarkMongodb_10000(b *testing.B) { + log.SetOutput(io.Discard) + os.Stdout, _ = os.Open(os.DevNull) + + segment := Mongodb{}.New(map[string]string{"mongodb_uri": "mongodb://localhost:27017/", "database": "testing", "batchsize": "10000"}) + + in, out := make(chan *pb.EnrichedFlow), make(chan *pb.EnrichedFlow) + segment.Rewire(in, out) + + wg := &sync.WaitGroup{} + wg.Add(1) + go segment.Run(wg) + + for n := 0; n < b.N; n++ { + in <- &pb.EnrichedFlow{SrcAddr: []byte{192, 168, 88, 142}, DstAddr: []byte{192, 168, 88, 143}, Proto: 45} + _ = <-out + } + close(in) +} + +// Mongodb Segment benchmark with 10000 samples stored in memory +func BenchmarkMongodb_100000(b *testing.B) { + log.SetOutput(io.Discard) + os.Stdout, _ = os.Open(os.DevNull) + + segment := Mongodb{}.New(map[string]string{"mongodb_uri": "mongodb://localhost:27017/", "database": "testing", "batchsize": "100000"}) + + in, out := make(chan *pb.EnrichedFlow), make(chan *pb.EnrichedFlow) + segment.Rewire(in, out) + + wg := &sync.WaitGroup{} + wg.Add(1) + go segment.Run(wg) + + for n := 0; n < b.N; n++ { + in <- &pb.EnrichedFlow{SrcAddr: []byte{192, 168, 88, 142}, DstAddr: []byte{192, 168, 88, 143}, Proto: 45} + _ = <-out + } + close(in) +} + +// Mongodb Segment benchmark with 10000 samples stored in memory +func BenchmarkMongodb_100000_with_storage_limit(b *testing.B) { + log.SetOutput(io.Discard) + os.Stdout, _ = os.Open(os.DevNull) + + segment := Mongodb{}.New(map[string]string{"mongodb_uri": "mongodb://localhost:27017/", "database": "testing", "batchsize": "100000", "max_disk_usage": "100 MB"}) + + in, out := make(chan *pb.EnrichedFlow), make(chan *pb.EnrichedFlow) + segment.Rewire(in, out) + + wg := &sync.WaitGroup{} + wg.Add(1) + go segment.Run(wg) + + for n := 0; n < b.N; n++ { + in <- &pb.EnrichedFlow{SrcAddr: []byte{192, 168, 88, 142}, DstAddr: []byte{192, 168, 88, 143}, Proto: 45} + _ = <-out + } + close(in) +} From 2c1d1b5ef0d66a1d83dad86a8d531b080bef4ee7 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Mon, 4 Nov 2024 09:23:28 +0100 Subject: [PATCH 05/18] Miragation to goflow2 v2.2.1 Goflow2 changed its protobuffer format These changes adapt the new format --- go.mod | 69 +- go.sum | 77 +- pb/enrichedflow.go | 139 +- pb/enrichedflow.pb.go | 1138 +++++++++-------- pb/enrichedflow.proto | 270 ++-- pb/flow.proto | 123 ++ pb/proton_producer.go | 17 + segments/export/clickhouse/clickhouse.go | 6 +- segments/filter/aggregate/flowcache.go | 32 +- segments/filter/flowfilter/flowfilter.go | 5 +- segments/filter/flowfilter/visitor.go | 502 ++++++++ segments/input/bpf/bpf.go | 11 +- segments/input/bpf/bpf_bpfeb.o | Bin 0 -> 18544 bytes segments/input/bpf/flow_exporter.go | 205 +++ segments/input/bpf/packet_dumper.go | 289 +++++ segments/input/goflow/goflow.go | 98 +- segments/input/kafkaconsumer/handler.go | 16 +- segments/modify/aslookup/aslookup.go | 113 +- segments/modify/aslookup/aslookup_test.go | 12 +- segments/modify/bgp/bgp.go | 6 +- .../output/kafkaproducer/kafkaproducer.go | 5 +- segments/print/printflowdump/printflowdump.go | 8 +- 22 files changed, 2196 insertions(+), 945 deletions(-) create mode 100644 pb/flow.proto create mode 100644 pb/proton_producer.go create mode 100644 segments/filter/flowfilter/visitor.go create mode 100644 segments/input/bpf/bpf_bpfeb.o create mode 100644 segments/input/bpf/flow_exporter.go create mode 100644 segments/input/bpf/packet_dumper.go diff --git a/go.mod b/go.mod index 1928f1a..4cb0a73 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/bwNetFlow/flowpipeline -go 1.20 +go 1.22.7 + +toolchain go1.23.2 require ( github.com/BelWue/bgp_routeinfo v0.0.0-20221004100427-d8095fc566dd @@ -10,7 +12,6 @@ require ( github.com/alouca/gosnmp v0.0.0-20170620005048-04d83944c9ab github.com/asecurityteam/rolling v2.0.4+incompatible github.com/banviktor/asnlookup v0.1.0 - github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05 github.com/bwNetFlow/flowfilter v0.0.0-20221025122858-60746fa15915 github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04 github.com/bwNetFlow/protobuf/go v0.0.0-20211004083441-61e193b4b342 @@ -20,15 +21,24 @@ require ( github.com/hashicorp/logutils v1.0.0 github.com/influxdata/influxdb-client-go/v2 v2.12.2 github.com/mattn/go-sqlite3 v1.14.16 - github.com/netsampler/goflow2 v1.1.1 - github.com/oschwald/maxminddb-golang v1.10.0 + github.com/netsampler/goflow2/v2 v2.2.1 + github.com/oschwald/maxminddb-golang v1.13.0 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/prometheus/client_golang v1.14.0 + github.com/prometheus/client_golang v1.20.0 github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 - google.golang.org/protobuf v1.28.1 + google.golang.org/protobuf v1.35.1 gopkg.in/yaml.v2 v2.4.0 ) +require ( + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect +) + require ( github.com/ClickHouse/ch-go v0.53.0 // indirect github.com/alecthomas/participle/v2 v2.0.0-beta.1 // indirect @@ -36,8 +46,8 @@ require ( github.com/andybalholm/brotli v1.0.5 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cilium/ebpf v0.10.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cilium/ebpf v0.10.0 github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect @@ -48,9 +58,9 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.6.1 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect @@ -64,43 +74,44 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/k-sone/critbitgo v1.4.0 // indirect github.com/kaorimatz/go-mrt v0.0.0-20210326003454-aa11f3646f93 // indirect - github.com/klauspost/compress v1.15.15 // indirect - github.com/libp2p/go-reuseport v0.2.0 // indirect + github.com/klauspost/compress v1.17.9 + github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/osrg/gobgp/v3 v3.11.0 // indirect + github.com/netsampler/goflow2 v1.3.7 + github.com/osrg/gobgp/v3 v3.30.0 // indirect github.com/paulmach/orb v0.9.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.40.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/segmentio/asm v1.2.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - github.com/spf13/afero v1.9.4 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.15.0 // indirect + github.com/spf13/viper v1.16.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/vishvananda/netlink v1.2.1-beta.2 // indirect + github.com/vishvananda/netlink v1.2.1 // indirect github.com/vishvananda/netns v0.0.4 // indirect go.opentelemetry.io/otel v1.13.0 // indirect go.opentelemetry.io/otel/trace v1.13.0 // indirect - golang.org/x/crypto v0.6.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec // indirect - google.golang.org/grpc v1.53.0 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.17.0 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect + google.golang.org/grpc v1.56.3 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 5d47c55..ea4bdb0 100644 --- a/go.sum +++ b/go.sum @@ -89,13 +89,10 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= -github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05 h1:/H/qIQ0bo3uVWV9ILwv7dIR6r4MsHmqk+Nc7zGT4/0s= -github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05/go.mod h1:DuJLqsHWPJZpyo1yfuHEMjSlQlPjXWntTjGAHJCt4ns= github.com/bwNetFlow/flowfilter v0.0.0-20221025122858-60746fa15915 h1:RN9oNbfTMlAlVznyp0pI5LOZnB+rjnB/Lmzd23UVyQY= github.com/bwNetFlow/flowfilter v0.0.0-20221025122858-60746fa15915/go.mod h1:g+jR9KOBdcsGSdRLf8Q5ii7FgwumWPs83gU8pbBQ/4k= github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04 h1:mm0/N8cMAdc5TRsmAkrhnPIdOm0ZqbT7uUC9Wt/21mk= github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04/go.mod h1:rtoxrzCig192Z9SYgF7J58r3qgnJ09yI3pnPVPf9+3U= -github.com/bwNetFlow/protobuf/go v0.0.0-20211004083441-61e193b4b342 h1:CrEmmSVFs3Ssceezrj/KyLuTvelGH8CZkNLgVxYrQ4o= github.com/bwNetFlow/protobuf/go v0.0.0-20211004083441-61e193b4b342/go.mod h1:kBaPxJ+ZXKXx3DoYF8OQdxtkHtH2xhdUIL51a4OE3as= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -103,6 +100,8 @@ github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cb github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -217,6 +216,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -254,6 +255,8 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -318,6 +321,8 @@ github.com/klauspost/compress v1.15.14 h1:i7WCKDToww0wA+9qrUZ1xOjp218vfFo3nTU6UH github.com/klauspost/compress v1.15.14/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -344,6 +349,10 @@ github.com/lestrrat-go/jwx v1.2.24/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xw github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k= +github.com/libp2p/go-reuseport v0.3.0 h1:iiZslO5byUYZEg9iCwJGf5h+sf1Agmqx2V2FDjPyvUw= +github.com/libp2p/go-reuseport v0.3.0/go.mod h1:laea40AimhtfEqysZ71UpYj4S+R9VpH8PgqLo7L+SwI= +github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= +github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -376,17 +385,29 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/netsampler/goflow2 v1.1.1 h1:GpVlvPq4yRbyzoiz0Vp3XilNr5js/0UhHcQI7Ol/MDk= -github.com/netsampler/goflow2 v1.1.1/go.mod h1:oNIeGj67SjwrRSTEukErjNT1zZ02W9+8M5mSgQCkZC8= +github.com/netsampler/goflow2 v1.3.7 h1:XZaTy8kkMnGXpJ9hS3KbO1McyrFTpVNhVFEx9rNhMmc= +github.com/netsampler/goflow2 v1.3.7/go.mod h1:4UZsVGVAs//iMCptUHn3WNScztJeUhZH7kDW2+/vDdQ= +github.com/netsampler/goflow2/v2 v2.2.1 h1:QzrtWS/meXsqCLv68hdouL+09NfuLKrCoVDJ1xfmuoE= +github.com/netsampler/goflow2/v2 v2.2.1/go.mod h1:057wOc/Xp7c+hUwRDB7wRqrx55m0r3vc7J0k4NrlFbM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oschwald/maxminddb-golang v1.10.0 h1:Xp1u0ZhqkSuopaKmk1WwHtjF0H9Hd9181uj2MQ5Vndg= github.com/oschwald/maxminddb-golang v1.10.0/go.mod h1:Y2ELenReaLAZ0b400URyGwvYxHV1dLIxBuyOsyYjHK0= +github.com/oschwald/maxminddb-golang v1.11.0 h1:aSXMqYR/EPNjGE8epgqwDay+P30hCBZIveY0WZbAWh0= +github.com/oschwald/maxminddb-golang v1.11.0/go.mod h1:YmVI+H0zh3ySFR3w+oz8PCfglAFj3PuCmui13+P9zDg= +github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU= +github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o= github.com/osrg/gobgp/v3 v3.7.0 h1:h+Liq90TsxNKTB/443V8b1o/pwOm94yIsm+gP0RHwOo= github.com/osrg/gobgp/v3 v3.7.0/go.mod h1:fKQPuk7+4qMiDT5viZTXT/aSEn8yYDkEs5p3NjmU2bw= github.com/osrg/gobgp/v3 v3.11.0 h1:HismNqoeZJ96WoDjxg5A4mAvFmOcuct5QYktFc8euSo= github.com/osrg/gobgp/v3 v3.11.0/go.mod h1:/q/mr+dOuPf5hDlLiatVll1P7BX4pmiXQxd4ZZpUbkg= +github.com/osrg/gobgp/v3 v3.30.0 h1:nGCr0G4ERPeKEHw9HpaUybeZdgIdrHHIIG2VSoZR2lQ= +github.com/osrg/gobgp/v3 v3.30.0/go.mod h1:8m+kgkdaWrByxg5EWpNUO2r/mopodrNBOUBhMnW/yGQ= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/paulmach/orb v0.8.0 h1:W5XAt5yNPNnhaMNEf0xNSkBMJ1LzOzdk2MRlB6EN0Vs= @@ -400,6 +421,8 @@ github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwb github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= @@ -420,12 +443,18 @@ github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPk github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= +github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= @@ -434,6 +463,10 @@ github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8 github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.40.0 h1:Afz7EVRqGg2Mqqf4JuF9vdvp1pi220m55Pi9T2JnO4Q= github.com/prometheus/common v0.40.0/go.mod h1:L65ZJPSmfn/UBWLQIHV7dBrKFidB/wPlF1y5TlSt9OE= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -443,6 +476,10 @@ github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5 github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -462,12 +499,18 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.9.4 h1:Sd43wM1IWz/s1aVXdOBkjJvuP8UdyqioeE4AmM0QsBs= github.com/spf13/afero v1.9.4/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -476,6 +519,8 @@ github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -491,6 +536,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= @@ -505,6 +552,8 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.2.1 h1:pfLv/qlJUwOTPvtWREA7c3PI4u81YkqZw1DYhI2HmLA= +github.com/vishvananda/netlink v1.2.1/go.mod h1:i6NetklAujEcC6fK0JPjT8qSwWyO0HLn4UKG+hGqeJs= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207 h1:nn7SOQy8xCu3iXNv7oiBhhEQtbWdnEOMnuKBlHvrqIM= github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= @@ -631,6 +680,12 @@ golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -716,8 +771,14 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -858,6 +919,8 @@ google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e h1:S9GbmC1iCgvbLyA google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec h1:6rwgChOSUfpzJF2/KnLgo+gMaxGpujStSkPWrbhXArU= google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -878,6 +941,8 @@ google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -894,6 +959,8 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pb/enrichedflow.go b/pb/enrichedflow.go index 23292ac..b434399 100644 --- a/pb/enrichedflow.go +++ b/pb/enrichedflow.go @@ -3,141 +3,8 @@ package pb import ( "fmt" "net" - - oldpb "github.com/bwNetFlow/protobuf/go" - goflowpb "github.com/netsampler/goflow2/pb" ) -func NewFromOld(msg *oldpb.FlowMessage) *EnrichedFlow { - return &EnrichedFlow{ - Type: EnrichedFlow_FlowType(msg.Type), - TimeReceived: msg.TimeReceived, - SequenceNum: msg.SequenceNum, - SamplingRate: msg.SamplingRate, - FlowDirection: msg.FlowDirection, - SamplerAddress: msg.SamplerAddress, - TimeFlowStart: msg.TimeFlowStart, - TimeFlowEnd: msg.TimeFlowEnd, - Bytes: msg.Bytes, - Packets: msg.Packets, - SrcAddr: msg.SrcAddr, - DstAddr: msg.DstAddr, - Etype: msg.Etype, - Proto: msg.Proto, - SrcPort: msg.SrcPort, - DstPort: msg.DstPort, - InIf: msg.InIf, - OutIf: msg.OutIf, - SrcMac: msg.SrcMac, - DstMac: msg.DstMac, - SrcVlan: msg.SrcVlan, - DstVlan: msg.DstVlan, - VlanId: msg.VlanId, - IngressVrfID: msg.IngressVrfID, - EgressVrfID: msg.EgressVrfID, - IPTos: msg.IPTos, - ForwardingStatus: msg.ForwardingStatus, - IPTTL: msg.IPTTL, - TCPFlags: msg.TCPFlags, - IcmpType: msg.IcmpType, - IcmpCode: msg.IcmpCode, - IPv6FlowLabel: msg.IPv6FlowLabel, - FragmentId: msg.FragmentId, - FragmentOffset: msg.FragmentOffset, - BiFlowDirection: msg.BiFlowDirection, - SrcAS: msg.SrcAS, - DstAS: msg.DstAS, - NextHop: msg.NextHop, - NextHopAS: msg.NextHopAS, - SrcNet: msg.SrcNet, - DstNet: msg.DstNet, - HasMPLS: msg.HasMPLS, - MPLSCount: msg.MPLSCount, - MPLS1TTL: msg.MPLS1TTL, - MPLS1Label: msg.MPLS1Label, - MPLS2TTL: msg.MPLS2TTL, - MPLS2Label: msg.MPLS2Label, - MPLS3TTL: msg.MPLS3TTL, - MPLS3Label: msg.MPLS3Label, - MPLSLastTTL: msg.MPLSLastTTL, - MPLSLastLabel: msg.MPLSLastLabel, - Cid: msg.Cid, - CidString: msg.CidString, - SrcCid: msg.SrcCid, - DstCid: msg.DstCid, - Normalized: EnrichedFlow_NormalizedType(msg.Normalized), - SrcIfName: msg.SrcIfName, - SrcIfDesc: msg.SrcIfDesc, - SrcIfSpeed: msg.SrcIfSpeed, - DstIfName: msg.DstIfName, - DstIfDesc: msg.DstIfDesc, - DstIfSpeed: msg.DstIfSpeed, - ProtoName: msg.ProtoName, - RemoteCountry: msg.RemoteCountry, - SrcCountry: msg.SrcCountry, - DstCountry: msg.DstCountry, - RemoteAddr: EnrichedFlow_RemoteAddrType(msg.RemoteAddr), - Note: msg.Note, - } -} - -func NewFromGoflow(msg *goflowpb.FlowMessage) *EnrichedFlow { - return &EnrichedFlow{ - Type: EnrichedFlow_FlowType(msg.Type), - TimeReceived: msg.TimeReceived, - SequenceNum: msg.SequenceNum, - SamplingRate: msg.SamplingRate, - FlowDirection: msg.FlowDirection, - SamplerAddress: msg.SamplerAddress, - TimeFlowStart: msg.TimeFlowStart, - TimeFlowEnd: msg.TimeFlowEnd, - Bytes: msg.Bytes, - Packets: msg.Packets, - SrcAddr: msg.SrcAddr, - DstAddr: msg.DstAddr, - Etype: msg.Etype, - Proto: msg.Proto, - SrcPort: msg.SrcPort, - DstPort: msg.DstPort, - InIf: msg.InIf, - OutIf: msg.OutIf, - SrcMac: msg.SrcMac, - DstMac: msg.DstMac, - SrcVlan: msg.SrcVlan, - DstVlan: msg.DstVlan, - VlanId: msg.VlanId, - IngressVrfID: msg.IngressVrfID, - EgressVrfID: msg.EgressVrfID, - IPTos: msg.IPTos, - ForwardingStatus: msg.ForwardingStatus, - IPTTL: msg.IPTTL, - TCPFlags: msg.TCPFlags, - IcmpType: msg.IcmpType, - IcmpCode: msg.IcmpCode, - IPv6FlowLabel: msg.IPv6FlowLabel, - FragmentId: msg.FragmentId, - FragmentOffset: msg.FragmentOffset, - BiFlowDirection: msg.BiFlowDirection, - SrcAS: msg.SrcAS, - DstAS: msg.DstAS, - NextHop: msg.NextHop, - NextHopAS: msg.NextHopAS, - SrcNet: msg.SrcNet, - DstNet: msg.DstNet, - HasMPLS: msg.HasMPLS, - MPLSCount: msg.MPLSCount, - MPLS1TTL: msg.MPLS1TTL, - MPLS1Label: msg.MPLS1Label, - MPLS2TTL: msg.MPLS2TTL, - MPLS2Label: msg.MPLS2Label, - MPLS3TTL: msg.MPLS3TTL, - MPLS3Label: msg.MPLS3Label, - MPLSLastTTL: msg.MPLSLastTTL, - MPLSLastLabel: msg.MPLSLastLabel, - // leave the 'Custom*' fields out of this conversion - } -} - var ( FlowDirectionMap = map[uint32]string{ 0: "Incoming", @@ -301,7 +168,8 @@ func (flow *EnrichedFlow) GetBps() uint64 { if duration == 0 { duration = 1 } - return flow.Bytes / duration + bpns := flow.Bytes / duration + return bpns } func (flow *EnrichedFlow) GetPps() uint64 { @@ -309,5 +177,6 @@ func (flow *EnrichedFlow) GetPps() uint64 { if duration == 0 { duration = 1 } - return flow.Packets / duration + ppns := flow.Packets / duration + return ppns } diff --git a/pb/enrichedflow.pb.go b/pb/enrichedflow.pb.go index a64ec93..cd38533 100644 --- a/pb/enrichedflow.pb.go +++ b/pb/enrichedflow.pb.go @@ -1,8 +1,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v4.23.2 -// source: pb/enrichedflow.proto +// protoc-gen-go v1.35.1 +// protoc v3.21.12 +// source: enrichedflow.proto package pb @@ -62,11 +62,11 @@ func (x EnrichedFlow_FlowType) String() string { } func (EnrichedFlow_FlowType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[0].Descriptor() + return file_enrichedflow_proto_enumTypes[0].Descriptor() } func (EnrichedFlow_FlowType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[0] + return &file_enrichedflow_proto_enumTypes[0] } func (x EnrichedFlow_FlowType) Number() protoreflect.EnumNumber { @@ -75,7 +75,7 @@ func (x EnrichedFlow_FlowType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_FlowType.Descriptor instead. func (EnrichedFlow_FlowType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 0} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 0} } // modify/anonymize @@ -109,11 +109,11 @@ func (x EnrichedFlow_AnonymizedType) String() string { } func (EnrichedFlow_AnonymizedType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[1].Descriptor() + return file_enrichedflow_proto_enumTypes[1].Descriptor() } func (EnrichedFlow_AnonymizedType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[1] + return &file_enrichedflow_proto_enumTypes[1] } func (x EnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { @@ -122,7 +122,7 @@ func (x EnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_AnonymizedType.Descriptor instead. func (EnrichedFlow_AnonymizedType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 1} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 1} } type EnrichedFlow_ValidationStatusType int32 @@ -161,11 +161,11 @@ func (x EnrichedFlow_ValidationStatusType) String() string { } func (EnrichedFlow_ValidationStatusType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[2].Descriptor() + return file_enrichedflow_proto_enumTypes[2].Descriptor() } func (EnrichedFlow_ValidationStatusType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[2] + return &file_enrichedflow_proto_enumTypes[2] } func (x EnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { @@ -174,7 +174,7 @@ func (x EnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_ValidationStatusType.Descriptor instead. func (EnrichedFlow_ValidationStatusType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 2} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 2} } // modify/normalize @@ -208,11 +208,11 @@ func (x EnrichedFlow_NormalizedType) String() string { } func (EnrichedFlow_NormalizedType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[3].Descriptor() + return file_enrichedflow_proto_enumTypes[3].Descriptor() } func (EnrichedFlow_NormalizedType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[3] + return &file_enrichedflow_proto_enumTypes[3] } func (x EnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { @@ -221,7 +221,7 @@ func (x EnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_NormalizedType.Descriptor instead. func (EnrichedFlow_NormalizedType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 3} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 3} } // modify/remoteaddress @@ -258,11 +258,11 @@ func (x EnrichedFlow_RemoteAddrType) String() string { } func (EnrichedFlow_RemoteAddrType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[4].Descriptor() + return file_enrichedflow_proto_enumTypes[4].Descriptor() } func (EnrichedFlow_RemoteAddrType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[4] + return &file_enrichedflow_proto_enumTypes[4] } func (x EnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { @@ -271,7 +271,7 @@ func (x EnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_RemoteAddrType.Descriptor instead. func (EnrichedFlow_RemoteAddrType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 4} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 4} } type EnrichedFlow struct { @@ -279,158 +279,169 @@ type EnrichedFlow struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type EnrichedFlow_FlowType `protobuf:"varint,1,opt,name=Type,proto3,enum=flowpb.EnrichedFlow_FlowType" json:"Type,omitempty"` - TimeReceived uint64 `protobuf:"varint,2,opt,name=TimeReceived,proto3" json:"TimeReceived,omitempty"` - SequenceNum uint32 `protobuf:"varint,4,opt,name=SequenceNum,proto3" json:"SequenceNum,omitempty"` - SamplingRate uint64 `protobuf:"varint,3,opt,name=SamplingRate,proto3" json:"SamplingRate,omitempty"` - FlowDirection uint32 `protobuf:"varint,42,opt,name=FlowDirection,proto3" json:"FlowDirection,omitempty"` + Type EnrichedFlow_FlowType `protobuf:"varint,1,opt,name=type,proto3,enum=flowpb.EnrichedFlow_FlowType" json:"type,omitempty"` + TimeReceived uint64 `protobuf:"varint,2,opt,name=time_received,json=timeReceived,proto3" json:"time_received,omitempty"` + SequenceNum uint32 `protobuf:"varint,4,opt,name=sequence_num,json=sequenceNum,proto3" json:"sequence_num,omitempty"` + SamplingRate uint64 `protobuf:"varint,3,opt,name=sampling_rate,json=samplingRate,proto3" json:"sampling_rate,omitempty"` + FlowDirection uint32 `protobuf:"varint,42,opt,name=flow_direction,json=flowDirection,proto3" json:"flow_direction,omitempty"` // Sampler information - SamplerAddress []byte `protobuf:"bytes,11,opt,name=SamplerAddress,proto3" json:"SamplerAddress,omitempty"` + SamplerAddress []byte `protobuf:"bytes,11,opt,name=sampler_address,json=samplerAddress,proto3" json:"sampler_address,omitempty"` // Found inside packet - TimeFlowStart uint64 `protobuf:"varint,38,opt,name=TimeFlowStart,proto3" json:"TimeFlowStart,omitempty"` - TimeFlowEnd uint64 `protobuf:"varint,5,opt,name=TimeFlowEnd,proto3" json:"TimeFlowEnd,omitempty"` + TimeFlowStart uint64 `protobuf:"varint,38,opt,name=time_flow_start,json=timeFlowStart,proto3" json:"time_flow_start,omitempty"` + TimeFlowEnd uint64 `protobuf:"varint,5,opt,name=time_flow_end,json=timeFlowEnd,proto3" json:"time_flow_end,omitempty"` + TimeFlowStartMs uint64 `protobuf:"varint,63,opt,name=time_flow_start_ms,json=timeFlowStartMs,proto3" json:"time_flow_start_ms,omitempty"` + TimeFlowEndMs uint64 `protobuf:"varint,64,opt,name=time_flow_end_ms,json=timeFlowEndMs,proto3" json:"time_flow_end_ms,omitempty"` // Size of the sampled packet - Bytes uint64 `protobuf:"varint,9,opt,name=Bytes,proto3" json:"Bytes,omitempty"` - Packets uint64 `protobuf:"varint,10,opt,name=Packets,proto3" json:"Packets,omitempty"` + Bytes uint64 `protobuf:"varint,9,opt,name=bytes,proto3" json:"bytes,omitempty"` + Packets uint64 `protobuf:"varint,10,opt,name=packets,proto3" json:"packets,omitempty"` // Source/destination addresses - SrcAddr []byte `protobuf:"bytes,6,opt,name=SrcAddr,proto3" json:"SrcAddr,omitempty"` - DstAddr []byte `protobuf:"bytes,7,opt,name=DstAddr,proto3" json:"DstAddr,omitempty"` + SrcAddr []byte `protobuf:"bytes,6,opt,name=src_addr,json=srcAddr,proto3" json:"src_addr,omitempty"` + DstAddr []byte `protobuf:"bytes,7,opt,name=dst_addr,json=dstAddr,proto3" json:"dst_addr,omitempty"` // Layer 3 protocol (IPv4/IPv6/ARP/MPLS...) - Etype uint32 `protobuf:"varint,30,opt,name=Etype,proto3" json:"Etype,omitempty"` + Etype uint32 `protobuf:"varint,30,opt,name=etype,proto3" json:"etype,omitempty"` // Layer 4 protocol - Proto uint32 `protobuf:"varint,20,opt,name=Proto,proto3" json:"Proto,omitempty"` + Proto uint32 `protobuf:"varint,20,opt,name=proto,proto3" json:"proto,omitempty"` // Ports for UDP and TCP - SrcPort uint32 `protobuf:"varint,21,opt,name=SrcPort,proto3" json:"SrcPort,omitempty"` - DstPort uint32 `protobuf:"varint,22,opt,name=DstPort,proto3" json:"DstPort,omitempty"` + SrcPort uint32 `protobuf:"varint,21,opt,name=src_port,json=srcPort,proto3" json:"src_port,omitempty"` + DstPort uint32 `protobuf:"varint,22,opt,name=dst_port,json=dstPort,proto3" json:"dst_port,omitempty"` // Interfaces - InIf uint32 `protobuf:"varint,18,opt,name=InIf,proto3" json:"InIf,omitempty"` - OutIf uint32 `protobuf:"varint,19,opt,name=OutIf,proto3" json:"OutIf,omitempty"` + InIf uint32 `protobuf:"varint,18,opt,name=in_if,json=inIf,proto3" json:"in_if,omitempty"` + OutIf uint32 `protobuf:"varint,19,opt,name=out_if,json=outIf,proto3" json:"out_if,omitempty"` // Ethernet information - SrcMac uint64 `protobuf:"varint,27,opt,name=SrcMac,proto3" json:"SrcMac,omitempty"` - DstMac uint64 `protobuf:"varint,28,opt,name=DstMac,proto3" json:"DstMac,omitempty"` + SrcMac uint64 `protobuf:"varint,27,opt,name=src_mac,json=srcMac,proto3" json:"src_mac,omitempty"` + DstMac uint64 `protobuf:"varint,28,opt,name=dst_mac,json=dstMac,proto3" json:"dst_mac,omitempty"` // Vlan - SrcVlan uint32 `protobuf:"varint,33,opt,name=SrcVlan,proto3" json:"SrcVlan,omitempty"` - DstVlan uint32 `protobuf:"varint,34,opt,name=DstVlan,proto3" json:"DstVlan,omitempty"` + SrcVlan uint32 `protobuf:"varint,33,opt,name=src_vlan,json=srcVlan,proto3" json:"src_vlan,omitempty"` + DstVlan uint32 `protobuf:"varint,34,opt,name=dst_vlan,json=dstVlan,proto3" json:"dst_vlan,omitempty"` // 802.1q VLAN in sampled packet - VlanId uint32 `protobuf:"varint,29,opt,name=VlanId,proto3" json:"VlanId,omitempty"` + VlanId uint32 `protobuf:"varint,29,opt,name=vlan_id,json=vlanId,proto3" json:"vlan_id,omitempty"` // VRF - IngressVrfID uint32 `protobuf:"varint,39,opt,name=IngressVrfID,proto3" json:"IngressVrfID,omitempty"` - EgressVrfID uint32 `protobuf:"varint,40,opt,name=EgressVrfID,proto3" json:"EgressVrfID,omitempty"` + IngressVrfId uint32 `protobuf:"varint,39,opt,name=ingress_vrf_id,json=ingressVrfId,proto3" json:"ingress_vrf_id,omitempty"` + EgressVrfId uint32 `protobuf:"varint,40,opt,name=egress_vrf_id,json=egressVrfId,proto3" json:"egress_vrf_id,omitempty"` // IP and TCP special flags - IPTos uint32 `protobuf:"varint,23,opt,name=IPTos,proto3" json:"IPTos,omitempty"` - ForwardingStatus uint32 `protobuf:"varint,24,opt,name=ForwardingStatus,proto3" json:"ForwardingStatus,omitempty"` - IPTTL uint32 `protobuf:"varint,25,opt,name=IPTTL,proto3" json:"IPTTL,omitempty"` - TCPFlags uint32 `protobuf:"varint,26,opt,name=TCPFlags,proto3" json:"TCPFlags,omitempty"` - IcmpType uint32 `protobuf:"varint,31,opt,name=IcmpType,proto3" json:"IcmpType,omitempty"` - IcmpCode uint32 `protobuf:"varint,32,opt,name=IcmpCode,proto3" json:"IcmpCode,omitempty"` - IPv6FlowLabel uint32 `protobuf:"varint,37,opt,name=IPv6FlowLabel,proto3" json:"IPv6FlowLabel,omitempty"` + IpTos uint32 `protobuf:"varint,23,opt,name=ip_tos,json=ipTos,proto3" json:"ip_tos,omitempty"` + ForwardingStatus uint32 `protobuf:"varint,24,opt,name=forwarding_status,json=forwardingStatus,proto3" json:"forwarding_status,omitempty"` + IpTtl uint32 `protobuf:"varint,25,opt,name=ip_ttl,json=ipTtl,proto3" json:"ip_ttl,omitempty"` + TcpFlags uint32 `protobuf:"varint,26,opt,name=tcp_flags,json=tcpFlags,proto3" json:"tcp_flags,omitempty"` + IcmpType uint32 `protobuf:"varint,31,opt,name=icmp_type,json=icmpType,proto3" json:"icmp_type,omitempty"` + IcmpCode uint32 `protobuf:"varint,32,opt,name=icmp_code,json=icmpCode,proto3" json:"icmp_code,omitempty"` + Ipv6FlowLabel uint32 `protobuf:"varint,37,opt,name=ipv6_flow_label,json=ipv6FlowLabel,proto3" json:"ipv6_flow_label,omitempty"` // Fragments (IPv4/IPv6) - FragmentId uint32 `protobuf:"varint,35,opt,name=FragmentId,proto3" json:"FragmentId,omitempty"` - FragmentOffset uint32 `protobuf:"varint,36,opt,name=FragmentOffset,proto3" json:"FragmentOffset,omitempty"` - BiFlowDirection uint32 `protobuf:"varint,41,opt,name=BiFlowDirection,proto3" json:"BiFlowDirection,omitempty"` + FragmentId uint32 `protobuf:"varint,35,opt,name=fragment_id,json=fragmentId,proto3" json:"fragment_id,omitempty"` + FragmentOffset uint32 `protobuf:"varint,36,opt,name=fragment_offset,json=fragmentOffset,proto3" json:"fragment_offset,omitempty"` + BiFlowDirection uint32 `protobuf:"varint,41,opt,name=bi_flow_direction,json=biFlowDirection,proto3" json:"bi_flow_direction,omitempty"` // Autonomous system information - SrcAS uint32 `protobuf:"varint,14,opt,name=SrcAS,proto3" json:"SrcAS,omitempty"` - DstAS uint32 `protobuf:"varint,15,opt,name=DstAS,proto3" json:"DstAS,omitempty"` - NextHop []byte `protobuf:"bytes,12,opt,name=NextHop,proto3" json:"NextHop,omitempty"` - NextHopAS uint32 `protobuf:"varint,13,opt,name=NextHopAS,proto3" json:"NextHopAS,omitempty"` + SrcAs uint32 `protobuf:"varint,14,opt,name=src_as,json=srcAs,proto3" json:"src_as,omitempty"` + DstAs uint32 `protobuf:"varint,15,opt,name=dst_as,json=dstAs,proto3" json:"dst_as,omitempty"` + NextHop []byte `protobuf:"bytes,12,opt,name=next_hop,json=nextHop,proto3" json:"next_hop,omitempty"` + NextHopAs uint32 `protobuf:"varint,13,opt,name=next_hop_as,json=nextHopAs,proto3" json:"next_hop_as,omitempty"` // Prefix size - SrcNet uint32 `protobuf:"varint,16,opt,name=SrcNet,proto3" json:"SrcNet,omitempty"` - DstNet uint32 `protobuf:"varint,17,opt,name=DstNet,proto3" json:"DstNet,omitempty"` + SrcNet uint32 `protobuf:"varint,16,opt,name=src_net,json=srcNet,proto3" json:"src_net,omitempty"` + DstNet uint32 `protobuf:"varint,17,opt,name=dst_net,json=dstNet,proto3" json:"dst_net,omitempty"` + // BGP information + BgpNextHop []byte `protobuf:"bytes,100,opt,name=bgp_next_hop,json=bgpNextHop,proto3" json:"bgp_next_hop,omitempty"` + BgpCommunities []uint32 `protobuf:"varint,101,rep,packed,name=bgp_communities,json=bgpCommunities,proto3" json:"bgp_communities,omitempty"` + AsPath []uint32 `protobuf:"varint,102,rep,packed,name=as_path,json=asPath,proto3" json:"as_path,omitempty"` // MPLS information - HasMPLS bool `protobuf:"varint,53,opt,name=HasMPLS,proto3" json:"HasMPLS,omitempty"` - MPLSCount uint32 `protobuf:"varint,54,opt,name=MPLSCount,proto3" json:"MPLSCount,omitempty"` - MPLS1TTL uint32 `protobuf:"varint,55,opt,name=MPLS1TTL,proto3" json:"MPLS1TTL,omitempty"` // First TTL - MPLS1Label uint32 `protobuf:"varint,56,opt,name=MPLS1Label,proto3" json:"MPLS1Label,omitempty"` // First Label - MPLS2TTL uint32 `protobuf:"varint,57,opt,name=MPLS2TTL,proto3" json:"MPLS2TTL,omitempty"` // Second TTL - MPLS2Label uint32 `protobuf:"varint,58,opt,name=MPLS2Label,proto3" json:"MPLS2Label,omitempty"` // Second Label - MPLS3TTL uint32 `protobuf:"varint,59,opt,name=MPLS3TTL,proto3" json:"MPLS3TTL,omitempty"` // Third TTL - MPLS3Label uint32 `protobuf:"varint,60,opt,name=MPLS3Label,proto3" json:"MPLS3Label,omitempty"` // Third Label - MPLSLastTTL uint32 `protobuf:"varint,61,opt,name=MPLSLastTTL,proto3" json:"MPLSLastTTL,omitempty"` // Last TTL - MPLSLastLabel uint32 `protobuf:"varint,62,opt,name=MPLSLastLabel,proto3" json:"MPLSLastLabel,omitempty"` // Last Label - PacketBytesMin uint32 `protobuf:"varint,1100,opt,name=PacketBytesMin,proto3" json:"PacketBytesMin,omitempty"` // new, single packet means uint32 < MTU - PacketBytesMax uint32 `protobuf:"varint,1101,opt,name=PacketBytesMax,proto3" json:"PacketBytesMax,omitempty"` // new - PacketBytesMean uint32 `protobuf:"varint,1102,opt,name=PacketBytesMean,proto3" json:"PacketBytesMean,omitempty"` // new - PacketBytesStdDev uint32 `protobuf:"varint,1103,opt,name=PacketBytesStdDev,proto3" json:"PacketBytesStdDev,omitempty"` // new - PacketIATMin uint64 `protobuf:"varint,1110,opt,name=PacketIATMin,proto3" json:"PacketIATMin,omitempty"` // new - PacketIATMax uint64 `protobuf:"varint,1111,opt,name=PacketIATMax,proto3" json:"PacketIATMax,omitempty"` // new - PacketIATMean uint64 `protobuf:"varint,1112,opt,name=PacketIATMean,proto3" json:"PacketIATMean,omitempty"` // new - PacketIATStdDev uint64 `protobuf:"varint,1113,opt,name=PacketIATStdDev,proto3" json:"PacketIATStdDev,omitempty"` // new - HeaderBytes uint32 `protobuf:"varint,1120,opt,name=HeaderBytes,proto3" json:"HeaderBytes,omitempty"` // new - FINFlagCount uint64 `protobuf:"varint,1130,opt,name=FINFlagCount,proto3" json:"FINFlagCount,omitempty"` // new - SYNFlagCount uint64 `protobuf:"varint,1131,opt,name=SYNFlagCount,proto3" json:"SYNFlagCount,omitempty"` // new - RSTFlagCount uint64 `protobuf:"varint,1132,opt,name=RSTFlagCount,proto3" json:"RSTFlagCount,omitempty"` // new - PSHFlagCount uint64 `protobuf:"varint,1133,opt,name=PSHFlagCount,proto3" json:"PSHFlagCount,omitempty"` // new - ACKFlagCount uint64 `protobuf:"varint,1134,opt,name=ACKFlagCount,proto3" json:"ACKFlagCount,omitempty"` // new - URGFlagCount uint64 `protobuf:"varint,1135,opt,name=URGFlagCount,proto3" json:"URGFlagCount,omitempty"` // new - CWRFlagCount uint64 `protobuf:"varint,1136,opt,name=CWRFlagCount,proto3" json:"CWRFlagCount,omitempty"` // new - ECEFlagCount uint64 `protobuf:"varint,1137,opt,name=ECEFlagCount,proto3" json:"ECEFlagCount,omitempty"` // new - PayloadPackets uint64 `protobuf:"varint,1140,opt,name=PayloadPackets,proto3" json:"PayloadPackets,omitempty"` // new - TimeActiveMin uint64 `protobuf:"varint,1150,opt,name=TimeActiveMin,proto3" json:"TimeActiveMin,omitempty"` // new - TimeActiveMax uint64 `protobuf:"varint,1151,opt,name=TimeActiveMax,proto3" json:"TimeActiveMax,omitempty"` // new - TimeActiveMean uint64 `protobuf:"varint,1152,opt,name=TimeActiveMean,proto3" json:"TimeActiveMean,omitempty"` // new - TimeActiveStdDev uint64 `protobuf:"varint,1153,opt,name=TimeActiveStdDev,proto3" json:"TimeActiveStdDev,omitempty"` // new - TimeIdleMin uint64 `protobuf:"varint,1154,opt,name=TimeIdleMin,proto3" json:"TimeIdleMin,omitempty"` // new - TimeIdleMax uint64 `protobuf:"varint,1155,opt,name=TimeIdleMax,proto3" json:"TimeIdleMax,omitempty"` // new - TimeIdleMean uint64 `protobuf:"varint,1156,opt,name=TimeIdleMean,proto3" json:"TimeIdleMean,omitempty"` // new - TimeIdleStdDev uint64 `protobuf:"varint,1157,opt,name=TimeIdleStdDev,proto3" json:"TimeIdleStdDev,omitempty"` // new + HasMpls bool `protobuf:"varint,53,opt,name=has_mpls,json=hasMpls,proto3" json:"has_mpls,omitempty"` + MplsCount uint32 `protobuf:"varint,54,opt,name=mpls_count,json=mplsCount,proto3" json:"mpls_count,omitempty"` + Mpls_1Ttl uint32 `protobuf:"varint,55,opt,name=mpls_1_ttl,json=mpls1Ttl,proto3" json:"mpls_1_ttl,omitempty"` // First TTL + Mpls_1Label uint32 `protobuf:"varint,56,opt,name=mpls_1_label,json=mpls1Label,proto3" json:"mpls_1_label,omitempty"` // First Label + Mpls_2Ttl uint32 `protobuf:"varint,57,opt,name=mpls_2_ttl,json=mpls2Ttl,proto3" json:"mpls_2_ttl,omitempty"` // Second TTL + Mpls_2Label uint32 `protobuf:"varint,58,opt,name=mpls_2_label,json=mpls2Label,proto3" json:"mpls_2_label,omitempty"` // Second Label + Mpls_3Ttl uint32 `protobuf:"varint,59,opt,name=mpls_3_ttl,json=mpls3Ttl,proto3" json:"mpls_3_ttl,omitempty"` // Third TTL + Mpls_3Label uint32 `protobuf:"varint,60,opt,name=mpls_3_label,json=mpls3Label,proto3" json:"mpls_3_label,omitempty"` // Third Label + MplsLastTtl uint32 `protobuf:"varint,61,opt,name=mpls_last_ttl,json=mplsLastTtl,proto3" json:"mpls_last_ttl,omitempty"` // Last TTL + MplsLastLabel uint32 `protobuf:"varint,62,opt,name=mpls_last_label,json=mplsLastLabel,proto3" json:"mpls_last_label,omitempty"` // Last Label + MplsLabelIp []byte `protobuf:"bytes,65,opt,name=mpls_label_ip,json=mplsLabelIp,proto3" json:"mpls_label_ip,omitempty"` // MPLS TOP Label IP + ObservationDomainId uint32 `protobuf:"varint,70,opt,name=observation_domain_id,json=observationDomainId,proto3" json:"observation_domain_id,omitempty"` + ObservationPointId uint32 `protobuf:"varint,71,opt,name=observation_point_id,json=observationPointId,proto3" json:"observation_point_id,omitempty"` + SrcCountry string `protobuf:"bytes,1000,opt,name=src_country,json=srcCountry,proto3" json:"src_country,omitempty"` + DstCountry string `protobuf:"bytes,1001,opt,name=dst_country,json=dstCountry,proto3" json:"dst_country,omitempty"` + PacketBytesMin uint32 `protobuf:"varint,2100,opt,name=PacketBytesMin,proto3" json:"PacketBytesMin,omitempty"` // new, single packet means uint32 < MTU + PacketBytesMax uint32 `protobuf:"varint,2101,opt,name=PacketBytesMax,proto3" json:"PacketBytesMax,omitempty"` // new + PacketBytesMean uint32 `protobuf:"varint,2102,opt,name=PacketBytesMean,proto3" json:"PacketBytesMean,omitempty"` // new + PacketBytesStdDev uint32 `protobuf:"varint,2103,opt,name=PacketBytesStdDev,proto3" json:"PacketBytesStdDev,omitempty"` // new + PacketIATMin uint64 `protobuf:"varint,2110,opt,name=PacketIATMin,proto3" json:"PacketIATMin,omitempty"` // new + PacketIATMax uint64 `protobuf:"varint,2111,opt,name=PacketIATMax,proto3" json:"PacketIATMax,omitempty"` // new + PacketIATMean uint64 `protobuf:"varint,2112,opt,name=PacketIATMean,proto3" json:"PacketIATMean,omitempty"` // new + PacketIATStdDev uint64 `protobuf:"varint,2113,opt,name=PacketIATStdDev,proto3" json:"PacketIATStdDev,omitempty"` // new + HeaderBytes uint32 `protobuf:"varint,2120,opt,name=HeaderBytes,proto3" json:"HeaderBytes,omitempty"` // new + FINFlagCount uint64 `protobuf:"varint,2130,opt,name=FINFlagCount,proto3" json:"FINFlagCount,omitempty"` // new + SYNFlagCount uint64 `protobuf:"varint,2131,opt,name=SYNFlagCount,proto3" json:"SYNFlagCount,omitempty"` // new + RSTFlagCount uint64 `protobuf:"varint,2132,opt,name=RSTFlagCount,proto3" json:"RSTFlagCount,omitempty"` // new + PSHFlagCount uint64 `protobuf:"varint,2133,opt,name=PSHFlagCount,proto3" json:"PSHFlagCount,omitempty"` // new + ACKFlagCount uint64 `protobuf:"varint,2134,opt,name=ACKFlagCount,proto3" json:"ACKFlagCount,omitempty"` // new + URGFlagCount uint64 `protobuf:"varint,2135,opt,name=URGFlagCount,proto3" json:"URGFlagCount,omitempty"` // new + CWRFlagCount uint64 `protobuf:"varint,2136,opt,name=CWRFlagCount,proto3" json:"CWRFlagCount,omitempty"` // new + ECEFlagCount uint64 `protobuf:"varint,2137,opt,name=ECEFlagCount,proto3" json:"ECEFlagCount,omitempty"` // new + PayloadPackets uint64 `protobuf:"varint,2140,opt,name=PayloadPackets,proto3" json:"PayloadPackets,omitempty"` // new + TimeActiveMin uint64 `protobuf:"varint,2150,opt,name=TimeActiveMin,proto3" json:"TimeActiveMin,omitempty"` // new + TimeActiveMax uint64 `protobuf:"varint,2151,opt,name=TimeActiveMax,proto3" json:"TimeActiveMax,omitempty"` // new + TimeActiveMean uint64 `protobuf:"varint,2152,opt,name=TimeActiveMean,proto3" json:"TimeActiveMean,omitempty"` // new + TimeActiveStdDev uint64 `protobuf:"varint,2153,opt,name=TimeActiveStdDev,proto3" json:"TimeActiveStdDev,omitempty"` // new + TimeIdleMin uint64 `protobuf:"varint,2154,opt,name=TimeIdleMin,proto3" json:"TimeIdleMin,omitempty"` // new + TimeIdleMax uint64 `protobuf:"varint,2155,opt,name=TimeIdleMax,proto3" json:"TimeIdleMax,omitempty"` // new + TimeIdleMean uint64 `protobuf:"varint,2156,opt,name=TimeIdleMean,proto3" json:"TimeIdleMean,omitempty"` // new + TimeIdleStdDev uint64 `protobuf:"varint,2157,opt,name=TimeIdleStdDev,proto3" json:"TimeIdleStdDev,omitempty"` // new // modify/addcid - Cid uint32 `protobuf:"varint,1000,opt,name=Cid,proto3" json:"Cid,omitempty"` // TODO: deprecate and provide as helper? - CidString string `protobuf:"bytes,1001,opt,name=CidString,proto3" json:"CidString,omitempty"` // deprecated, delete for v1.0.0 - SrcCid uint32 `protobuf:"varint,1012,opt,name=SrcCid,proto3" json:"SrcCid,omitempty"` - DstCid uint32 `protobuf:"varint,1013,opt,name=DstCid,proto3" json:"DstCid,omitempty"` - SrcAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,1160,opt,name=SrcAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"SrcAddrAnon,omitempty"` - DstAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,1161,opt,name=DstAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"DstAddrAnon,omitempty"` - SrcAddrPreservedLen uint32 `protobuf:"varint,1162,opt,name=SrcAddrPreservedLen,proto3" json:"SrcAddrPreservedLen,omitempty"` - DstAddrPreservedLen uint32 `protobuf:"varint,1163,opt,name=DstAddrPreservedLen,proto3" json:"DstAddrPreservedLen,omitempty"` - SamplerAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,1164,opt,name=SamplerAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"SamplerAddrAnon,omitempty"` - SamplerAddrAnonPreservedPrefixLen uint32 `protobuf:"varint,1165,opt,name=SamplerAddrAnonPreservedPrefixLen,proto3" json:"SamplerAddrAnonPreservedPrefixLen,omitempty"` + Cid uint32 `protobuf:"varint,2000,opt,name=Cid,proto3" json:"Cid,omitempty"` // TODO: deprecate and provide as helper? + CidString string `protobuf:"bytes,2001,opt,name=CidString,proto3" json:"CidString,omitempty"` // deprecated, delete for v1.0.0 + SrcCid uint32 `protobuf:"varint,2012,opt,name=SrcCid,proto3" json:"SrcCid,omitempty"` + DstCid uint32 `protobuf:"varint,2013,opt,name=DstCid,proto3" json:"DstCid,omitempty"` + SrcAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,2160,opt,name=SrcAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"SrcAddrAnon,omitempty"` + DstAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,2161,opt,name=DstAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"DstAddrAnon,omitempty"` + SrcAddrPreservedLen uint32 `protobuf:"varint,2162,opt,name=SrcAddrPreservedLen,proto3" json:"SrcAddrPreservedLen,omitempty"` + DstAddrPreservedLen uint32 `protobuf:"varint,2163,opt,name=DstAddrPreservedLen,proto3" json:"DstAddrPreservedLen,omitempty"` + SamplerAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,2164,opt,name=SamplerAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"SamplerAddrAnon,omitempty"` + SamplerAddrAnonPreservedPrefixLen uint32 `protobuf:"varint,2165,opt,name=SamplerAddrAnonPreservedPrefixLen,proto3" json:"SamplerAddrAnonPreservedPrefixLen,omitempty"` // modify/bgp // as done by a number of Netflow implementations, these refer to the destination - ASPath []uint32 `protobuf:"varint,1171,rep,packed,name=ASPath,proto3" json:"ASPath,omitempty"` - Med uint32 `protobuf:"varint,1172,opt,name=Med,proto3" json:"Med,omitempty"` - LocalPref uint32 `protobuf:"varint,1173,opt,name=LocalPref,proto3" json:"LocalPref,omitempty"` - ValidationStatus EnrichedFlow_ValidationStatusType `protobuf:"varint,1174,opt,name=ValidationStatus,proto3,enum=flowpb.EnrichedFlow_ValidationStatusType" json:"ValidationStatus,omitempty"` + Med uint32 `protobuf:"varint,2172,opt,name=Med,proto3" json:"Med,omitempty"` + LocalPref uint32 `protobuf:"varint,2173,opt,name=LocalPref,proto3" json:"LocalPref,omitempty"` + ValidationStatus EnrichedFlow_ValidationStatusType `protobuf:"varint,2174,opt,name=ValidationStatus,proto3,enum=flowpb.EnrichedFlow_ValidationStatusType" json:"ValidationStatus,omitempty"` // modify/geolocation - RemoteCountry string `protobuf:"bytes,1010,opt,name=RemoteCountry,proto3" json:"RemoteCountry,omitempty"` // TODO: deprecate and provide as helper - SrcCountry string `protobuf:"bytes,1014,opt,name=SrcCountry,proto3" json:"SrcCountry,omitempty"` - DstCountry string `protobuf:"bytes,1015,opt,name=DstCountry,proto3" json:"DstCountry,omitempty"` - Normalized EnrichedFlow_NormalizedType `protobuf:"varint,1002,opt,name=Normalized,proto3,enum=flowpb.EnrichedFlow_NormalizedType" json:"Normalized,omitempty"` // TODO: deprecate and replace with helper? + RemoteCountry string `protobuf:"bytes,2010,opt,name=RemoteCountry,proto3" json:"RemoteCountry,omitempty"` // TODO: deprecate and provide as helper + SrcCountryBW string `protobuf:"bytes,2014,opt,name=SrcCountryBW,proto3" json:"SrcCountryBW,omitempty"` + DstCountryBW string `protobuf:"bytes,2015,opt,name=DstCountryBW,proto3" json:"DstCountryBW,omitempty"` + Normalized EnrichedFlow_NormalizedType `protobuf:"varint,2002,opt,name=Normalized,proto3,enum=flowpb.EnrichedFlow_NormalizedType" json:"Normalized,omitempty"` // TODO: deprecate and replace with helper? // modify/protomap - ProtoName string `protobuf:"bytes,1009,opt,name=ProtoName,proto3" json:"ProtoName,omitempty"` // TODO: deprecate and replace with helper, why lug a string along... - RemoteAddr EnrichedFlow_RemoteAddrType `protobuf:"varint,1011,opt,name=RemoteAddr,proto3,enum=flowpb.EnrichedFlow_RemoteAddrType" json:"RemoteAddr,omitempty"` // TODO: figure out a better system? applicable only to service providers right now... + ProtoName string `protobuf:"bytes,2009,opt,name=ProtoName,proto3" json:"ProtoName,omitempty"` // TODO: deprecate and replace with helper, why lug a string along... + RemoteAddr EnrichedFlow_RemoteAddrType `protobuf:"varint,2011,opt,name=RemoteAddr,proto3,enum=flowpb.EnrichedFlow_RemoteAddrType" json:"RemoteAddr,omitempty"` // TODO: figure out a better system? applicable only to service providers right now... // modify/reversedns - SrcHostName string `protobuf:"bytes,1180,opt,name=SrcHostName,proto3" json:"SrcHostName,omitempty"` - DstHostName string `protobuf:"bytes,1181,opt,name=DstHostName,proto3" json:"DstHostName,omitempty"` - NextHopHostName string `protobuf:"bytes,1182,opt,name=NextHopHostName,proto3" json:"NextHopHostName,omitempty"` - SrcASName string `protobuf:"bytes,1183,opt,name=SrcASName,proto3" json:"SrcASName,omitempty"` - DstASName string `protobuf:"bytes,1184,opt,name=DstASName,proto3" json:"DstASName,omitempty"` - NextHopASName string `protobuf:"bytes,1185,opt,name=NextHopASName,proto3" json:"NextHopASName,omitempty"` - SamplerHostName string `protobuf:"bytes,1186,opt,name=SamplerHostName,proto3" json:"SamplerHostName,omitempty"` + SrcHostName string `protobuf:"bytes,2180,opt,name=SrcHostName,proto3" json:"SrcHostName,omitempty"` + DstHostName string `protobuf:"bytes,2181,opt,name=DstHostName,proto3" json:"DstHostName,omitempty"` + NextHopHostName string `protobuf:"bytes,2182,opt,name=NextHopHostName,proto3" json:"NextHopHostName,omitempty"` + SrcASName string `protobuf:"bytes,2183,opt,name=SrcASName,proto3" json:"SrcASName,omitempty"` + DstASName string `protobuf:"bytes,2184,opt,name=DstASName,proto3" json:"DstASName,omitempty"` + NextHopASName string `protobuf:"bytes,2185,opt,name=NextHopASName,proto3" json:"NextHopASName,omitempty"` + SamplerHostName string `protobuf:"bytes,2186,opt,name=SamplerHostName,proto3" json:"SamplerHostName,omitempty"` // modify/snmp - SrcIfName string `protobuf:"bytes,1003,opt,name=SrcIfName,proto3" json:"SrcIfName,omitempty"` // TODO: rename to match InIf and OutIf - SrcIfDesc string `protobuf:"bytes,1004,opt,name=SrcIfDesc,proto3" json:"SrcIfDesc,omitempty"` // TODO: rename to match InIf and OutIf - SrcIfSpeed uint32 `protobuf:"varint,1005,opt,name=SrcIfSpeed,proto3" json:"SrcIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf - DstIfName string `protobuf:"bytes,1006,opt,name=DstIfName,proto3" json:"DstIfName,omitempty"` // TODO: rename to match InIf and OutIf - DstIfDesc string `protobuf:"bytes,1007,opt,name=DstIfDesc,proto3" json:"DstIfDesc,omitempty"` // TODO: rename to match InIf and OutIf - DstIfSpeed uint32 `protobuf:"varint,1008,opt,name=DstIfSpeed,proto3" json:"DstIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf + SrcIfName string `protobuf:"bytes,2003,opt,name=SrcIfName,proto3" json:"SrcIfName,omitempty"` // TODO: rename to match InIf and OutIf + SrcIfDesc string `protobuf:"bytes,2004,opt,name=SrcIfDesc,proto3" json:"SrcIfDesc,omitempty"` // TODO: rename to match InIf and OutIf + SrcIfSpeed uint32 `protobuf:"varint,2005,opt,name=SrcIfSpeed,proto3" json:"SrcIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf + DstIfName string `protobuf:"bytes,2006,opt,name=DstIfName,proto3" json:"DstIfName,omitempty"` // TODO: rename to match InIf and OutIf + DstIfDesc string `protobuf:"bytes,2007,opt,name=DstIfDesc,proto3" json:"DstIfDesc,omitempty"` // TODO: rename to match InIf and OutIf + DstIfSpeed uint32 `protobuf:"varint,2008,opt,name=DstIfSpeed,proto3" json:"DstIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf // general - Note string `protobuf:"bytes,1016,opt,name=Note,proto3" json:"Note,omitempty"` // free-form field to implement anything + Note string `protobuf:"bytes,2016,opt,name=Note,proto3" json:"Note,omitempty"` // free-form field to implement anything // modify/addrstrings - SourceIP string `protobuf:"bytes,1290,opt,name=SourceIP,proto3" json:"SourceIP,omitempty"` - DestinationIP string `protobuf:"bytes,1291,opt,name=DestinationIP,proto3" json:"DestinationIP,omitempty"` - NextHopIP string `protobuf:"bytes,1292,opt,name=NextHopIP,proto3" json:"NextHopIP,omitempty"` - SamplerIP string `protobuf:"bytes,1293,opt,name=SamplerIP,proto3" json:"SamplerIP,omitempty"` - SourceMAC string `protobuf:"bytes,1294,opt,name=SourceMAC,proto3" json:"SourceMAC,omitempty"` - DestinationMAC string `protobuf:"bytes,1295,opt,name=DestinationMAC,proto3" json:"DestinationMAC,omitempty"` + SourceIP string `protobuf:"bytes,2290,opt,name=SourceIP,proto3" json:"SourceIP,omitempty"` + DestinationIP string `protobuf:"bytes,2291,opt,name=DestinationIP,proto3" json:"DestinationIP,omitempty"` + NextHopIP string `protobuf:"bytes,2292,opt,name=NextHopIP,proto3" json:"NextHopIP,omitempty"` + SamplerIP string `protobuf:"bytes,2293,opt,name=SamplerIP,proto3" json:"SamplerIP,omitempty"` + SourceMAC string `protobuf:"bytes,2294,opt,name=SourceMAC,proto3" json:"SourceMAC,omitempty"` + DestinationMAC string `protobuf:"bytes,2295,opt,name=DestinationMAC,proto3" json:"DestinationMAC,omitempty"` + // VRF + IngressVrfIDBW uint32 `protobuf:"varint,2539,opt,name=IngressVrfIDBW,proto3" json:"IngressVrfIDBW,omitempty"` + EgressVrfIDBW uint32 `protobuf:"varint,2540,opt,name=EgressVrfIDBW,proto3" json:"EgressVrfIDBW,omitempty"` } func (x *EnrichedFlow) Reset() { *x = EnrichedFlow{} - if protoimpl.UnsafeEnabled { - mi := &file_pb_enrichedflow_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_enrichedflow_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *EnrichedFlow) String() string { @@ -440,8 +451,8 @@ func (x *EnrichedFlow) String() string { func (*EnrichedFlow) ProtoMessage() {} func (x *EnrichedFlow) ProtoReflect() protoreflect.Message { - mi := &file_pb_enrichedflow_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_enrichedflow_proto_msgTypes[0] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -453,7 +464,7 @@ func (x *EnrichedFlow) ProtoReflect() protoreflect.Message { // Deprecated: Use EnrichedFlow.ProtoReflect.Descriptor instead. func (*EnrichedFlow) Descriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0} + return file_enrichedflow_proto_rawDescGZIP(), []int{0} } func (x *EnrichedFlow) GetType() EnrichedFlow_FlowType { @@ -512,6 +523,20 @@ func (x *EnrichedFlow) GetTimeFlowEnd() uint64 { return 0 } +func (x *EnrichedFlow) GetTimeFlowStartMs() uint64 { + if x != nil { + return x.TimeFlowStartMs + } + return 0 +} + +func (x *EnrichedFlow) GetTimeFlowEndMs() uint64 { + if x != nil { + return x.TimeFlowEndMs + } + return 0 +} + func (x *EnrichedFlow) GetBytes() uint64 { if x != nil { return x.Bytes @@ -617,23 +642,23 @@ func (x *EnrichedFlow) GetVlanId() uint32 { return 0 } -func (x *EnrichedFlow) GetIngressVrfID() uint32 { +func (x *EnrichedFlow) GetIngressVrfId() uint32 { if x != nil { - return x.IngressVrfID + return x.IngressVrfId } return 0 } -func (x *EnrichedFlow) GetEgressVrfID() uint32 { +func (x *EnrichedFlow) GetEgressVrfId() uint32 { if x != nil { - return x.EgressVrfID + return x.EgressVrfId } return 0 } -func (x *EnrichedFlow) GetIPTos() uint32 { +func (x *EnrichedFlow) GetIpTos() uint32 { if x != nil { - return x.IPTos + return x.IpTos } return 0 } @@ -645,16 +670,16 @@ func (x *EnrichedFlow) GetForwardingStatus() uint32 { return 0 } -func (x *EnrichedFlow) GetIPTTL() uint32 { +func (x *EnrichedFlow) GetIpTtl() uint32 { if x != nil { - return x.IPTTL + return x.IpTtl } return 0 } -func (x *EnrichedFlow) GetTCPFlags() uint32 { +func (x *EnrichedFlow) GetTcpFlags() uint32 { if x != nil { - return x.TCPFlags + return x.TcpFlags } return 0 } @@ -673,9 +698,9 @@ func (x *EnrichedFlow) GetIcmpCode() uint32 { return 0 } -func (x *EnrichedFlow) GetIPv6FlowLabel() uint32 { +func (x *EnrichedFlow) GetIpv6FlowLabel() uint32 { if x != nil { - return x.IPv6FlowLabel + return x.Ipv6FlowLabel } return 0 } @@ -701,16 +726,16 @@ func (x *EnrichedFlow) GetBiFlowDirection() uint32 { return 0 } -func (x *EnrichedFlow) GetSrcAS() uint32 { +func (x *EnrichedFlow) GetSrcAs() uint32 { if x != nil { - return x.SrcAS + return x.SrcAs } return 0 } -func (x *EnrichedFlow) GetDstAS() uint32 { +func (x *EnrichedFlow) GetDstAs() uint32 { if x != nil { - return x.DstAS + return x.DstAs } return 0 } @@ -722,9 +747,9 @@ func (x *EnrichedFlow) GetNextHop() []byte { return nil } -func (x *EnrichedFlow) GetNextHopAS() uint32 { +func (x *EnrichedFlow) GetNextHopAs() uint32 { if x != nil { - return x.NextHopAS + return x.NextHopAs } return 0 } @@ -743,76 +768,132 @@ func (x *EnrichedFlow) GetDstNet() uint32 { return 0 } -func (x *EnrichedFlow) GetHasMPLS() bool { +func (x *EnrichedFlow) GetBgpNextHop() []byte { + if x != nil { + return x.BgpNextHop + } + return nil +} + +func (x *EnrichedFlow) GetBgpCommunities() []uint32 { + if x != nil { + return x.BgpCommunities + } + return nil +} + +func (x *EnrichedFlow) GetAsPath() []uint32 { + if x != nil { + return x.AsPath + } + return nil +} + +func (x *EnrichedFlow) GetHasMpls() bool { if x != nil { - return x.HasMPLS + return x.HasMpls } return false } -func (x *EnrichedFlow) GetMPLSCount() uint32 { +func (x *EnrichedFlow) GetMplsCount() uint32 { + if x != nil { + return x.MplsCount + } + return 0 +} + +func (x *EnrichedFlow) GetMpls_1Ttl() uint32 { + if x != nil { + return x.Mpls_1Ttl + } + return 0 +} + +func (x *EnrichedFlow) GetMpls_1Label() uint32 { if x != nil { - return x.MPLSCount + return x.Mpls_1Label } return 0 } -func (x *EnrichedFlow) GetMPLS1TTL() uint32 { +func (x *EnrichedFlow) GetMpls_2Ttl() uint32 { if x != nil { - return x.MPLS1TTL + return x.Mpls_2Ttl } return 0 } -func (x *EnrichedFlow) GetMPLS1Label() uint32 { +func (x *EnrichedFlow) GetMpls_2Label() uint32 { if x != nil { - return x.MPLS1Label + return x.Mpls_2Label } return 0 } -func (x *EnrichedFlow) GetMPLS2TTL() uint32 { +func (x *EnrichedFlow) GetMpls_3Ttl() uint32 { if x != nil { - return x.MPLS2TTL + return x.Mpls_3Ttl } return 0 } -func (x *EnrichedFlow) GetMPLS2Label() uint32 { +func (x *EnrichedFlow) GetMpls_3Label() uint32 { if x != nil { - return x.MPLS2Label + return x.Mpls_3Label } return 0 } -func (x *EnrichedFlow) GetMPLS3TTL() uint32 { +func (x *EnrichedFlow) GetMplsLastTtl() uint32 { if x != nil { - return x.MPLS3TTL + return x.MplsLastTtl } return 0 } -func (x *EnrichedFlow) GetMPLS3Label() uint32 { +func (x *EnrichedFlow) GetMplsLastLabel() uint32 { if x != nil { - return x.MPLS3Label + return x.MplsLastLabel } return 0 } -func (x *EnrichedFlow) GetMPLSLastTTL() uint32 { +func (x *EnrichedFlow) GetMplsLabelIp() []byte { if x != nil { - return x.MPLSLastTTL + return x.MplsLabelIp + } + return nil +} + +func (x *EnrichedFlow) GetObservationDomainId() uint32 { + if x != nil { + return x.ObservationDomainId } return 0 } -func (x *EnrichedFlow) GetMPLSLastLabel() uint32 { +func (x *EnrichedFlow) GetObservationPointId() uint32 { if x != nil { - return x.MPLSLastLabel + return x.ObservationPointId } return 0 } +func (x *EnrichedFlow) GetSrcCountry() string { + if x != nil { + return x.SrcCountry + } + return "" +} + +func (x *EnrichedFlow) GetDstCountry() string { + if x != nil { + return x.DstCountry + } + return "" +} + func (x *EnrichedFlow) GetPacketBytesMin() uint32 { if x != nil { return x.PacketBytesMin @@ -1065,13 +1146,6 @@ func (x *EnrichedFlow) GetSamplerAddrAnonPreservedPrefixLen() uint32 { return 0 } -func (x *EnrichedFlow) GetASPath() []uint32 { - if x != nil { - return x.ASPath - } - return nil -} - func (x *EnrichedFlow) GetMed() uint32 { if x != nil { return x.Med @@ -1100,16 +1174,16 @@ func (x *EnrichedFlow) GetRemoteCountry() string { return "" } -func (x *EnrichedFlow) GetSrcCountry() string { +func (x *EnrichedFlow) GetSrcCountryBW() string { if x != nil { - return x.SrcCountry + return x.SrcCountryBW } return "" } -func (x *EnrichedFlow) GetDstCountry() string { +func (x *EnrichedFlow) GetDstCountryBW() string { if x != nil { - return x.DstCountry + return x.DstCountryBW } return "" } @@ -1275,311 +1349,357 @@ func (x *EnrichedFlow) GetDestinationMAC() string { return "" } -var File_pb_enrichedflow_proto protoreflect.FileDescriptor - -var file_pb_enrichedflow_proto_rawDesc = []byte{ - 0x0a, 0x15, 0x70, 0x62, 0x2f, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x66, 0x6c, 0x6f, - 0x77, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x22, - 0xf1, 0x22, 0x0a, 0x0c, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, - 0x12, 0x31, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, - 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, - 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, - 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x26, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, - 0x45, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x63, - 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x44, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x44, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x4f, - 0x75, 0x74, 0x49, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4f, 0x75, 0x74, 0x49, - 0x66, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x18, 0x1b, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, - 0x4d, 0x61, 0x63, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x44, 0x73, 0x74, 0x4d, 0x61, - 0x63, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x18, 0x21, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x44, - 0x73, 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x44, 0x73, - 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x18, - 0x1d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, - 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x18, 0x27, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, - 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, - 0x18, 0x28, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, - 0x66, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x18, 0x17, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x46, 0x6f, 0x72, - 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x18, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x18, 0x19, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x12, 0x1a, 0x0a, 0x08, 0x54, - 0x43, 0x50, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x54, - 0x43, 0x50, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, - 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x18, 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x46, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x28, 0x0a, - 0x0f, 0x42, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x42, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, 0x12, 0x14, 0x0a, - 0x05, 0x44, 0x73, 0x74, 0x41, 0x53, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x44, 0x73, - 0x74, 0x41, 0x53, 0x12, 0x18, 0x0a, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1c, 0x0a, - 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x53, - 0x72, 0x63, 0x4e, 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, - 0x4e, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, - 0x61, 0x73, 0x4d, 0x50, 0x4c, 0x53, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x61, - 0x73, 0x4d, 0x50, 0x4c, 0x53, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x18, - 0x37, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x12, - 0x1e, 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, - 0x1a, 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x18, 0x39, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, - 0x50, 0x4c, 0x53, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x4d, - 0x50, 0x4c, 0x53, 0x33, 0x54, 0x54, 0x4c, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, - 0x50, 0x4c, 0x53, 0x33, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x33, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, 0x4c, - 0x53, 0x33, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x50, 0x4c, 0x53, 0x4c, - 0x61, 0x73, 0x74, 0x54, 0x54, 0x4c, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, 0x50, - 0x4c, 0x53, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x54, 0x4c, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x50, 0x4c, - 0x53, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0d, 0x4d, 0x50, 0x4c, 0x53, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, - 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, - 0x6e, 0x18, 0xcc, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xcd, 0x08, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, - 0x78, 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xce, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, 0x61, 0x63, - 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, 0x0a, 0x11, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, - 0x76, 0x18, 0xcf, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, 0x0c, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xd6, 0x08, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, - 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, - 0x18, 0xd7, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, - 0x41, 0x54, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, - 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xd8, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x0f, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, - 0xd9, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, - 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0xe0, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x46, 0x49, - 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xea, 0x08, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x23, 0x0a, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0xeb, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xec, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, 0x53, 0x54, - 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x53, 0x48, - 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xed, 0x08, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, - 0x0a, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xee, - 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0xef, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, 0x47, 0x46, - 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, 0x52, 0x46, - 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf0, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, - 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf1, 0x08, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, - 0x6b, 0x65, 0x74, 0x73, 0x18, 0xf4, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x54, - 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xfe, 0x08, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, - 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x4d, 0x61, 0x78, 0x18, 0xff, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, - 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0x80, 0x09, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, - 0x61, 0x6e, 0x12, 0x2b, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x81, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x54, - 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, - 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0x82, - 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, - 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, - 0x78, 0x18, 0x83, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, - 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, - 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0x84, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, - 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, - 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x85, 0x09, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, - 0x44, 0x65, 0x76, 0x12, 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x03, 0x43, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, 0x64, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x18, - 0xf4, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x12, 0x17, - 0x0a, 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x18, 0xf5, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, - 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x88, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, - 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, - 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, - 0x46, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x89, - 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, - 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, - 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, 0x74, 0x41, - 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, - 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0x8a, - 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x44, 0x73, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, - 0x6e, 0x18, 0x8b, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, - 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x4e, 0x0a, - 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, - 0x18, 0x8c, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, +func (x *EnrichedFlow) GetIngressVrfIDBW() uint32 { + if x != nil { + return x.IngressVrfIDBW + } + return 0 +} + +func (x *EnrichedFlow) GetEgressVrfIDBW() uint32 { + if x != nil { + return x.EgressVrfIDBW + } + return 0 +} + +var File_enrichedflow_proto protoreflect.FileDescriptor + +var file_enrichedflow_proto_rawDesc = []byte{ + 0x0a, 0x12, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x22, 0xf5, 0x26, 0x0a, + 0x0c, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x31, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x66, 0x6c, + 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, + 0x77, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, + 0x0e, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x2a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x26, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x69, + 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6d, 0x73, 0x18, + 0x3f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x4d, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, + 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x4d, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, + 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x73, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, + 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x64, 0x73, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x74, 0x79, 0x70, 0x65, 0x18, 0x1e, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x65, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x13, 0x0a, 0x05, 0x69, 0x6e, 0x5f, 0x69, 0x66, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x69, 0x6e, 0x49, 0x66, 0x12, 0x15, 0x0a, 0x06, + 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6f, 0x75, + 0x74, 0x49, 0x66, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x1b, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, + 0x64, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, + 0x73, 0x74, 0x4d, 0x61, 0x63, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x76, 0x6c, 0x61, + 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, + 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x76, 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x76, + 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x6c, + 0x61, 0x6e, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, + 0x76, 0x72, 0x66, 0x5f, 0x69, 0x64, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x69, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x65, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x72, 0x66, 0x5f, 0x69, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x64, 0x12, 0x15, + 0x0a, 0x06, 0x69, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x69, 0x70, 0x54, 0x6f, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x10, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x70, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x19, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x69, 0x70, 0x54, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x63, 0x70, + 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x74, 0x63, + 0x70, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, 0x6d, 0x70, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x69, 0x70, 0x76, 0x36, 0x46, + 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x24, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x69, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x62, + 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, + 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x73, 0x72, 0x63, 0x41, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x73, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x64, 0x73, 0x74, 0x41, 0x73, 0x12, 0x19, 0x0a, 0x08, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x6e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x68, 0x6f, 0x70, 0x5f, 0x61, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, + 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6e, + 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4e, 0x65, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x06, 0x64, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x62, 0x67, 0x70, + 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0a, 0x62, 0x67, 0x70, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x62, + 0x67, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x65, + 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x62, 0x67, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x66, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x61, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, + 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x70, 0x6c, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x68, 0x61, 0x73, 0x4d, 0x70, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x70, + 0x6c, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, + 0x31, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, + 0x73, 0x31, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x31, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, + 0x73, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, + 0x32, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, + 0x73, 0x32, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x32, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, + 0x73, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, + 0x33, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, + 0x73, 0x33, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x33, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, + 0x73, 0x33, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x5f, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, + 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x74, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x6d, + 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x5f, 0x69, 0x70, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6d, 0x70, 0x6c, 0x73, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x49, 0x70, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x46, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x73, 0x72, 0x63, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xe8, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xe9, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x4d, 0x69, 0x6e, 0x18, 0xb4, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xb5, 0x10, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x4d, 0x61, 0x78, 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xb6, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, + 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, + 0x44, 0x65, 0x76, 0x18, 0xb7, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, + 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xbe, 0x10, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, + 0x69, 0x6e, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, + 0x61, 0x78, 0x18, 0xbf, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xc0, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, + 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, + 0x76, 0x18, 0xc1, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0xc8, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, + 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd2, 0x10, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0xd3, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, + 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, + 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd4, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, + 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, + 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd5, 0x10, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x23, 0x0a, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0xd6, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, + 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, + 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd8, 0x10, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x23, 0x0a, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0xd9, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0xdc, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, + 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xe6, + 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x4d, 0x61, 0x78, 0x18, 0xe7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, + 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, + 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xe8, 0x10, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2b, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xe9, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, + 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, + 0x18, 0xea, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, + 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, + 0x4d, 0x61, 0x78, 0x18, 0xeb, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, + 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, + 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xec, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, + 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xed, + 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, + 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xd0, 0x0f, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x03, 0x43, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0xd1, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, + 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, + 0x64, 0x18, 0xdc, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, + 0x12, 0x17, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x18, 0xdd, 0x0f, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x72, 0x63, + 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0xf0, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, + 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, + 0x6e, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, + 0x18, 0xf1, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, - 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x53, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, - 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, - 0x65, 0x6e, 0x18, 0x8d, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x17, 0x0a, 0x06, - 0x41, 0x53, 0x50, 0x61, 0x74, 0x68, 0x18, 0x93, 0x09, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x41, - 0x53, 0x50, 0x61, 0x74, 0x68, 0x12, 0x11, 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0x94, 0x09, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x4d, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, - 0x6c, 0x50, 0x72, 0x65, 0x66, 0x18, 0x95, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x12, 0x56, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x96, 0x09, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, - 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x25, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, - 0x18, 0xf2, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf6, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x72, 0x63, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf7, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x73, - 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x44, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, - 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, - 0x6c, 0x6f, 0x77, 0x2e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x1d, - 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xf1, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, - 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xf3, 0x07, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, - 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x9c, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, - 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9d, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x73, - 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x4e, 0x65, 0x78, - 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9e, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x9f, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0xa0, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0xa1, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, 0x74, - 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xa2, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, - 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, - 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, - 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x18, - 0xef, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, - 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, - 0xf0, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, - 0x65, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xf8, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x50, 0x18, 0x8a, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x50, 0x12, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x18, 0x8b, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x4e, - 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x18, 0x8c, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x18, 0x8d, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x18, 0x8e, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x18, 0x8f, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, - 0x43, 0x22, 0x5d, 0x0a, 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, - 0x0b, 0x46, 0x4c, 0x4f, 0x57, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x53, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x35, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, - 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x35, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, - 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x39, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x49, - 0x50, 0x46, 0x49, 0x58, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x42, 0x50, 0x46, 0x10, 0x05, - 0x22, 0x32, 0x0a, 0x0e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, - 0x7a, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x50, - 0x41, 0x4e, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, - 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x03, 0x22, - 0x21, 0x0a, 0x0e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x65, 0x73, - 0x10, 0x01, 0x22, 0x2f, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x10, - 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x73, - 0x74, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x62, 0x77, 0x4e, 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, 0x6c, 0x6f, 0x77, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, + 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, + 0x18, 0xf2, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, + 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x4c, 0x65, 0x6e, 0x18, 0xf3, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, + 0x4e, 0x0a, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, + 0x6f, 0x6e, 0x18, 0xf4, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, + 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, + 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, + 0x4d, 0x0a, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, + 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x4c, 0x65, 0x6e, 0x18, 0xf5, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x11, + 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0xfc, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x4d, 0x65, + 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x18, 0xfd, + 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, + 0x12, 0x56, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0xfe, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, + 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, + 0x77, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xda, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x23, 0x0a, 0x0c, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x18, + 0xde, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x42, 0x57, 0x12, 0x23, 0x0a, 0x0c, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x42, 0x57, 0x18, 0xdf, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x44, 0x73, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x12, 0x44, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0xd2, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, + 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, + 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, + 0x1d, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xd9, 0x0f, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, + 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xdb, 0x0f, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, + 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x84, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x48, + 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x85, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, + 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x4e, 0x65, + 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x86, 0x11, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x87, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x88, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x89, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, + 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x8a, 0x11, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0xd3, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, + 0x63, 0x18, 0xd4, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, + 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, + 0x64, 0x18, 0xd5, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, + 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0xd6, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, + 0x18, 0xd7, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, + 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, + 0x18, 0xd8, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, + 0x65, 0x65, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xe0, 0x0f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x49, 0x50, 0x18, 0xf2, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x18, 0xf3, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, + 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x18, 0xf4, 0x11, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x18, 0xf5, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x18, 0xf6, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x18, 0xf7, 0x11, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, + 0x49, 0x44, 0x42, 0x57, 0x18, 0xeb, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x12, 0x25, 0x0a, 0x0d, 0x45, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x18, 0xec, 0x13, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, + 0x42, 0x57, 0x22, 0x5d, 0x0a, 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, + 0x0a, 0x0b, 0x46, 0x4c, 0x4f, 0x57, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x0b, 0x0a, 0x07, 0x53, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x35, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, + 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x35, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, + 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x39, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, + 0x49, 0x50, 0x46, 0x49, 0x58, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x42, 0x50, 0x46, 0x10, + 0x05, 0x22, 0x32, 0x0a, 0x0e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, + 0x69, 0x7a, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, + 0x50, 0x41, 0x4e, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, + 0x64, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x03, + 0x22, 0x21, 0x0a, 0x0e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x65, + 0x73, 0x10, 0x01, 0x22, 0x2f, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, + 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, + 0x73, 0x74, 0x10, 0x02, 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x62, 0x77, 0x4e, 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, 0x6c, 0x6f, + 0x77, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x66, 0x6c, 0x6f, + 0x77, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_pb_enrichedflow_proto_rawDescOnce sync.Once - file_pb_enrichedflow_proto_rawDescData = file_pb_enrichedflow_proto_rawDesc + file_enrichedflow_proto_rawDescOnce sync.Once + file_enrichedflow_proto_rawDescData = file_enrichedflow_proto_rawDesc ) -func file_pb_enrichedflow_proto_rawDescGZIP() []byte { - file_pb_enrichedflow_proto_rawDescOnce.Do(func() { - file_pb_enrichedflow_proto_rawDescData = protoimpl.X.CompressGZIP(file_pb_enrichedflow_proto_rawDescData) +func file_enrichedflow_proto_rawDescGZIP() []byte { + file_enrichedflow_proto_rawDescOnce.Do(func() { + file_enrichedflow_proto_rawDescData = protoimpl.X.CompressGZIP(file_enrichedflow_proto_rawDescData) }) - return file_pb_enrichedflow_proto_rawDescData + return file_enrichedflow_proto_rawDescData } -var file_pb_enrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_pb_enrichedflow_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_pb_enrichedflow_proto_goTypes = []interface{}{ +var file_enrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_enrichedflow_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_enrichedflow_proto_goTypes = []any{ (EnrichedFlow_FlowType)(0), // 0: flowpb.EnrichedFlow.FlowType (EnrichedFlow_AnonymizedType)(0), // 1: flowpb.EnrichedFlow.AnonymizedType (EnrichedFlow_ValidationStatusType)(0), // 2: flowpb.EnrichedFlow.ValidationStatusType @@ -1587,8 +1707,8 @@ var file_pb_enrichedflow_proto_goTypes = []interface{}{ (EnrichedFlow_RemoteAddrType)(0), // 4: flowpb.EnrichedFlow.RemoteAddrType (*EnrichedFlow)(nil), // 5: flowpb.EnrichedFlow } -var file_pb_enrichedflow_proto_depIdxs = []int32{ - 0, // 0: flowpb.EnrichedFlow.Type:type_name -> flowpb.EnrichedFlow.FlowType +var file_enrichedflow_proto_depIdxs = []int32{ + 0, // 0: flowpb.EnrichedFlow.type:type_name -> flowpb.EnrichedFlow.FlowType 1, // 1: flowpb.EnrichedFlow.SrcAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType 1, // 2: flowpb.EnrichedFlow.DstAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType 1, // 3: flowpb.EnrichedFlow.SamplerAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType @@ -1602,42 +1722,28 @@ var file_pb_enrichedflow_proto_depIdxs = []int32{ 0, // [0:7] is the sub-list for field type_name } -func init() { file_pb_enrichedflow_proto_init() } -func file_pb_enrichedflow_proto_init() { - if File_pb_enrichedflow_proto != nil { +func init() { file_enrichedflow_proto_init() } +func file_enrichedflow_proto_init() { + if File_enrichedflow_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_pb_enrichedflow_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrichedFlow); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_pb_enrichedflow_proto_rawDesc, + RawDescriptor: file_enrichedflow_proto_rawDesc, NumEnums: 5, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_pb_enrichedflow_proto_goTypes, - DependencyIndexes: file_pb_enrichedflow_proto_depIdxs, - EnumInfos: file_pb_enrichedflow_proto_enumTypes, - MessageInfos: file_pb_enrichedflow_proto_msgTypes, + GoTypes: file_enrichedflow_proto_goTypes, + DependencyIndexes: file_enrichedflow_proto_depIdxs, + EnumInfos: file_enrichedflow_proto_enumTypes, + MessageInfos: file_enrichedflow_proto_msgTypes, }.Build() - File_pb_enrichedflow_proto = out.File - file_pb_enrichedflow_proto_rawDesc = nil - file_pb_enrichedflow_proto_goTypes = nil - file_pb_enrichedflow_proto_depIdxs = nil + File_enrichedflow_proto = out.File + file_enrichedflow_proto_rawDesc = nil + file_enrichedflow_proto_goTypes = nil + file_enrichedflow_proto_depIdxs = nil } diff --git a/pb/enrichedflow.proto b/pb/enrichedflow.proto index 705312d..70b78dc 100644 --- a/pb/enrichedflow.proto +++ b/pb/enrichedflow.proto @@ -1,6 +1,6 @@ syntax = "proto3"; package flowpb; -option go_package = "github.com/bwNetFlow/flowpipeline/pb;"; +option go_package = "github.com/bwNetFlow/flowpipeline/pb;flowpb"; message EnrichedFlow { @@ -12,92 +12,107 @@ message EnrichedFlow { IPFIX = 4; EBPF = 5; } - FlowType Type = 1; - uint64 TimeReceived = 2; - uint32 SequenceNum = 4; - uint64 SamplingRate = 3; + FlowType type = 1; - uint32 FlowDirection = 42; + uint64 time_received = 2; + uint32 sequence_num = 4; + uint64 sampling_rate = 3; + + uint32 flow_direction = 42; // Sampler information - bytes SamplerAddress = 11; + bytes sampler_address = 11; // Found inside packet - uint64 TimeFlowStart = 38; - uint64 TimeFlowEnd = 5; + uint64 time_flow_start = 38; + uint64 time_flow_end = 5; + uint64 time_flow_start_ms = 63; + uint64 time_flow_end_ms = 64; // Size of the sampled packet - uint64 Bytes = 9; - uint64 Packets = 10; + uint64 bytes = 9; + uint64 packets = 10; // Source/destination addresses - bytes SrcAddr = 6; - bytes DstAddr = 7; + bytes src_addr = 6; + bytes dst_addr = 7; // Layer 3 protocol (IPv4/IPv6/ARP/MPLS...) - uint32 Etype = 30; + uint32 etype = 30; // Layer 4 protocol - uint32 Proto = 20; + uint32 proto = 20; // Ports for UDP and TCP - uint32 SrcPort = 21; - uint32 DstPort = 22; + uint32 src_port = 21; + uint32 dst_port = 22; // Interfaces - uint32 InIf = 18; - uint32 OutIf = 19; + uint32 in_if = 18; + uint32 out_if = 19; // Ethernet information - uint64 SrcMac = 27; - uint64 DstMac = 28; + uint64 src_mac = 27; + uint64 dst_mac = 28; // Vlan - uint32 SrcVlan = 33; - uint32 DstVlan = 34; + uint32 src_vlan = 33; + uint32 dst_vlan = 34; // 802.1q VLAN in sampled packet - uint32 VlanId = 29; + uint32 vlan_id = 29; // VRF - uint32 IngressVrfID = 39; - uint32 EgressVrfID = 40; + uint32 ingress_vrf_id = 39; + uint32 egress_vrf_id = 40; // IP and TCP special flags - uint32 IPTos = 23; - uint32 ForwardingStatus = 24; - uint32 IPTTL = 25; - uint32 TCPFlags = 26; - uint32 IcmpType = 31; - uint32 IcmpCode = 32; - uint32 IPv6FlowLabel = 37; + uint32 ip_tos = 23; + uint32 forwarding_status = 24; + uint32 ip_ttl = 25; + uint32 tcp_flags = 26; + uint32 icmp_type = 31; + uint32 icmp_code = 32; + uint32 ipv6_flow_label = 37; // Fragments (IPv4/IPv6) - uint32 FragmentId = 35; - uint32 FragmentOffset = 36; - uint32 BiFlowDirection = 41; + uint32 fragment_id = 35; + uint32 fragment_offset = 36; + uint32 bi_flow_direction = 41; // Autonomous system information - uint32 SrcAS = 14; - uint32 DstAS = 15; + uint32 src_as = 14; + uint32 dst_as = 15; - bytes NextHop = 12; - uint32 NextHopAS = 13; + bytes next_hop = 12; + uint32 next_hop_as = 13; // Prefix size - uint32 SrcNet = 16; - uint32 DstNet = 17; + uint32 src_net = 16; + uint32 dst_net = 17; + + // BGP information + bytes bgp_next_hop = 100; + repeated uint32 bgp_communities = 101; + repeated uint32 as_path = 102; // MPLS information - bool HasMPLS = 53; - uint32 MPLSCount = 54; - uint32 MPLS1TTL = 55; // First TTL - uint32 MPLS1Label = 56; // First Label - uint32 MPLS2TTL = 57; // Second TTL - uint32 MPLS2Label = 58; // Second Label - uint32 MPLS3TTL = 59; // Third TTL - uint32 MPLS3Label = 60; // Third Label - uint32 MPLSLastTTL = 61; // Last TTL - uint32 MPLSLastLabel = 62; // Last Label + bool has_mpls = 53; + uint32 mpls_count = 54; + uint32 mpls_1_ttl = 55; // First TTL + uint32 mpls_1_label = 56; // First Label + uint32 mpls_2_ttl = 57; // Second TTL + uint32 mpls_2_label = 58; // Second Label + uint32 mpls_3_ttl = 59; // Third TTL + uint32 mpls_3_label = 60; // Third Label + uint32 mpls_last_ttl = 61; // Last TTL + uint32 mpls_last_label = 62; // Last Label + bytes mpls_label_ip = 65; // MPLS TOP Label IP + + uint32 observation_domain_id = 70; + uint32 observation_point_id = 71; + + string src_country = 1000; + string dst_country = 1001; // bwNET custom fields: @@ -107,85 +122,84 @@ message EnrichedFlow { // inspired by this list: // https://github.com/ahlashkari/CICFlowMeter/blob/master/ReadMe.txt - uint32 PacketBytesMin = 1100; // new, single packet means uint32 < MTU - uint32 PacketBytesMax = 1101; // new - uint32 PacketBytesMean = 1102; // new - uint32 PacketBytesStdDev = 1103; // new - - uint64 PacketIATMin = 1110; // new - uint64 PacketIATMax = 1111; // new - uint64 PacketIATMean = 1112; // new - uint64 PacketIATStdDev = 1113; // new - - uint32 HeaderBytes = 1120; // new - - uint64 FINFlagCount = 1130; // new - uint64 SYNFlagCount = 1131; // new - uint64 RSTFlagCount = 1132; // new - uint64 PSHFlagCount = 1133; // new - uint64 ACKFlagCount = 1134; // new - uint64 URGFlagCount = 1135; // new - uint64 CWRFlagCount = 1136; // new - uint64 ECEFlagCount = 1137; // new - - uint64 PayloadPackets = 1140; // new - - uint64 TimeActiveMin = 1150; // new - uint64 TimeActiveMax = 1151; // new - uint64 TimeActiveMean = 1152; // new - uint64 TimeActiveStdDev = 1153; // new - uint64 TimeIdleMin = 1154; // new - uint64 TimeIdleMax = 1155; // new - uint64 TimeIdleMean = 1156; // new - uint64 TimeIdleStdDev = 1157; // new + uint32 PacketBytesMin = 2100; // new, single packet means uint32 < MTU + uint32 PacketBytesMax = 2101; // new + uint32 PacketBytesMean = 2102; // new + uint32 PacketBytesStdDev = 2103; // new + + uint64 PacketIATMin = 2110; // new + uint64 PacketIATMax = 2111; // new + uint64 PacketIATMean = 2112; // new + uint64 PacketIATStdDev = 2113; // new + + uint32 HeaderBytes = 2120; // new + + uint64 FINFlagCount = 2130; // new + uint64 SYNFlagCount = 2131; // new + uint64 RSTFlagCount = 2132; // new + uint64 PSHFlagCount = 2133; // new + uint64 ACKFlagCount = 2134; // new + uint64 URGFlagCount = 2135; // new + uint64 CWRFlagCount = 2136; // new + uint64 ECEFlagCount = 2137; // new + + uint64 PayloadPackets = 2140; // new + + uint64 TimeActiveMin = 2150; // new + uint64 TimeActiveMax = 2151; // new + uint64 TimeActiveMean = 2152; // new + uint64 TimeActiveStdDev = 2153; // new + uint64 TimeIdleMin = 2154; // new + uint64 TimeIdleMax = 2155; // new + uint64 TimeIdleMean = 2156; // new + uint64 TimeIdleStdDev = 2157; // new // modify/addcid - uint32 Cid = 1000; // TODO: deprecate and provide as helper? - string CidString = 1001; // deprecated, delete for v1.0.0 - uint32 SrcCid = 1012; - uint32 DstCid = 1013; + uint32 Cid = 2000; // TODO: deprecate and provide as helper? + string CidString = 2001; // deprecated, delete for v1.0.0 + uint32 SrcCid = 2012; + uint32 DstCid = 2013; // modify/anonymize enum AnonymizedType { NotAnonymized = 0; CryptoPAN = 1; } - AnonymizedType SrcAddrAnon = 1160; - AnonymizedType DstAddrAnon = 1161; - uint32 SrcAddrPreservedLen = 1162; - uint32 DstAddrPreservedLen = 1163; + AnonymizedType SrcAddrAnon = 2160; + AnonymizedType DstAddrAnon = 2161; + uint32 SrcAddrPreservedLen = 2162; + uint32 DstAddrPreservedLen = 2163; - AnonymizedType SamplerAddrAnon = 1164; - uint32 SamplerAddrAnonPreservedPrefixLen = 1165; + AnonymizedType SamplerAddrAnon = 2164; + uint32 SamplerAddrAnonPreservedPrefixLen = 2165; // modify/bgp // as done by a number of Netflow implementations, these refer to the destination - repeated uint32 ASPath = 1171; - uint32 Med = 1172; - uint32 LocalPref = 1173; + uint32 Med = 2172; + uint32 LocalPref = 2173; enum ValidationStatusType { Unknown = 0; Valid = 1; NotFound = 2; Invalid = 3; } - ValidationStatusType ValidationStatus = 1174; + ValidationStatusType ValidationStatus = 2174; // modify/geolocation - string RemoteCountry = 1010; // TODO: deprecate and provide as helper - string SrcCountry = 1014; - string DstCountry = 1015; + string RemoteCountry = 2010; // TODO: deprecate and provide as helper + string SrcCountryBW = 2014; + string DstCountryBW = 2015; // modify/normalize enum NormalizedType { No = 0; Yes = 1; } - NormalizedType Normalized = 1002; // TODO: deprecate and replace with helper? + NormalizedType Normalized = 2002; // TODO: deprecate and replace with helper? // TODO: if not, replace with OriginalSamplingRate instead and set SamplingRate to 1? // modify/protomap - string ProtoName = 1009; // TODO: deprecate and replace with helper, why lug a string along... + string ProtoName = 2009; // TODO: deprecate and replace with helper, why lug a string along... // modify/remoteaddress enum RemoteAddrType { @@ -193,33 +207,41 @@ message EnrichedFlow { Src = 1; Dst = 2; } - RemoteAddrType RemoteAddr = 1011; // TODO: figure out a better system? applicable only to service providers right now... + RemoteAddrType RemoteAddr = 2011; // TODO: figure out a better system? applicable only to service providers right now... // modify/reversedns - string SrcHostName = 1180; - string DstHostName = 1181; - string NextHopHostName = 1182; - string SrcASName = 1183; - string DstASName = 1184; - string NextHopASName = 1185; - string SamplerHostName = 1186; + string SrcHostName = 2180; + string DstHostName = 2181; + string NextHopHostName = 2182; + string SrcASName = 2183; + string DstASName = 2184; + string NextHopASName = 2185; + string SamplerHostName = 2186; // modify/snmp - string SrcIfName = 1003; // TODO: rename to match InIf and OutIf - string SrcIfDesc = 1004; // TODO: rename to match InIf and OutIf - uint32 SrcIfSpeed = 1005; // TODO: rename to match InIf and OutIf - string DstIfName = 1006; // TODO: rename to match InIf and OutIf - string DstIfDesc = 1007; // TODO: rename to match InIf and OutIf - uint32 DstIfSpeed = 1008; // TODO: rename to match InIf and OutIf + string SrcIfName = 2003; // TODO: rename to match InIf and OutIf + string SrcIfDesc = 2004; // TODO: rename to match InIf and OutIf + uint32 SrcIfSpeed = 2005; // TODO: rename to match InIf and OutIf + string DstIfName = 2006; // TODO: rename to match InIf and OutIf + string DstIfDesc = 2007; // TODO: rename to match InIf and OutIf + uint32 DstIfSpeed = 2008; // TODO: rename to match InIf and OutIf // general - string Note = 1016; // free-form field to implement anything + string Note = 2016; // free-form field to implement anything // modify/addrstrings - string SourceIP = 1290; - string DestinationIP = 1291; - string NextHopIP = 1292; - string SamplerIP = 1293; - string SourceMAC = 1294; - string DestinationMAC = 1295; -} + string SourceIP = 2290; + string DestinationIP = 2291; + string NextHopIP = 2292; + string SamplerIP = 2293; + string SourceMAC = 2294; + string DestinationMAC = 2295; + +// VRF +uint32 IngressVrfIDBW = 2539; +uint32 EgressVrfIDBW = 2540; + +// Replaced by ns values +// uint64 TimeFlowStart = 2538; +// uint64 TimeFlowEnd = 2505; +} \ No newline at end of file diff --git a/pb/flow.proto b/pb/flow.proto new file mode 100644 index 0000000..3c4c961 --- /dev/null +++ b/pb/flow.proto @@ -0,0 +1,123 @@ +syntax = "proto3"; +package flowpb; +option go_package = "github.com/netsampler/goflow2/pb;flowpb"; + +message FlowMessage { + + enum FlowType { + FLOWUNKNOWN = 0; + SFLOW_5 = 1; + NETFLOW_V5 = 2; + NETFLOW_V9 = 3; + IPFIX = 4; + } + FlowType type = 1; + + uint64 time_received_ns = 110; + uint32 sequence_num = 4; + uint64 sampling_rate = 3; + + //uint32 flow_direction = 42; + + // Sampler information + bytes sampler_address = 11; + + // Found inside packet + uint64 time_flow_start_ns = 111; + uint64 time_flow_end_ns = 112; + + // Size of the sampled packet + uint64 bytes = 9; + uint64 packets = 10; + + // Source/destination addresses + bytes src_addr = 6; + bytes dst_addr = 7; + + // Layer 3 protocol (IPv4/IPv6/ARP/MPLS...) + uint32 etype = 30; + + // Layer 4 protocol + uint32 proto = 20; + + // Ports for UDP and TCP + uint32 src_port = 21; + uint32 dst_port = 22; + + // Interfaces + uint32 in_if = 18; + uint32 out_if = 19; + + // Ethernet information + uint64 src_mac = 27; + uint64 dst_mac = 28; + + // Vlan + uint32 src_vlan = 33; + uint32 dst_vlan = 34; + // 802.1q VLAN in sampled packet + uint32 vlan_id = 29; + + // IP and TCP special flags + uint32 ip_tos = 23; + uint32 forwarding_status = 24; + uint32 ip_ttl = 25; + uint32 ip_flags = 38; + uint32 tcp_flags = 26; + uint32 icmp_type = 31; + uint32 icmp_code = 32; + uint32 ipv6_flow_label = 37; + // Fragments (IPv4/IPv6) + uint32 fragment_id = 35; + uint32 fragment_offset = 36; + + // Autonomous system information + uint32 src_as = 14; + uint32 dst_as = 15; + + bytes next_hop = 12; + uint32 next_hop_as = 13; + + // Prefix size + uint32 src_net = 16; + uint32 dst_net = 17; + + // BGP information + bytes bgp_next_hop = 100; + repeated uint32 bgp_communities = 101; + repeated uint32 as_path = 102; + + // MPLS information + repeated uint32 mpls_ttl = 80; + repeated uint32 mpls_label = 81; + repeated bytes mpls_ip = 82; + + uint32 observation_domain_id = 70; + uint32 observation_point_id = 71; + + // Encapsulation + enum LayerStack { + Ethernet = 0; + IPv4 = 1; + IPv6 = 2; + TCP = 3; + UDP = 4; + MPLS = 5; + Dot1Q = 6; + ICMP = 7; + ICMPv6 = 8; + GRE = 9; + IPv6HeaderRouting = 10; + IPv6HeaderFragment = 11; + Geneve = 12; + Teredo = 13; + Custom = 99; + // todo: add nsh + } + repeated LayerStack layer_stack = 103; + repeated uint32 layer_size = 104; + + repeated bytes ipv6_routing_header_addresses = 105; // SRv6 + uint32 ipv6_routing_header_seg_left = 106; // SRv6 + +} \ No newline at end of file diff --git a/pb/proton_producer.go b/pb/proton_producer.go new file mode 100644 index 0000000..32b86d9 --- /dev/null +++ b/pb/proton_producer.go @@ -0,0 +1,17 @@ +package pb + +import ( + "bytes" + + "google.golang.org/protobuf/encoding/protodelim" +) + +type ProtoProducerMessage struct { + EnrichedFlow +} + +func (m *ProtoProducerMessage) MarshalBinary() ([]byte, error) { + buf := bytes.NewBuffer([]byte{}) + _, err := protodelim.MarshalTo(buf, m) + return buf.Bytes(), err +} diff --git a/segments/export/clickhouse/clickhouse.go b/segments/export/clickhouse/clickhouse.go index 2543445..8ff7de4 100644 --- a/segments/export/clickhouse/clickhouse.go +++ b/segments/export/clickhouse/clickhouse.go @@ -185,9 +185,9 @@ func (segment Clickhouse) bulkInsertFlowhouse(unsavedFlows []*pb.EnrichedFlow) e dstPfx, uint8(msg.DstNet), net.IP(msg.NextHop), - msg.NextHopAS, - msg.SrcAS, - msg.DstAS, + msg.NextHopAs, + msg.SrcAs, + msg.DstAs, uint8(msg.Proto), uint16(msg.SrcPort), uint16(msg.DstPort), diff --git a/segments/filter/aggregate/flowcache.go b/segments/filter/aggregate/flowcache.go index 2b88aa5..04732c0 100644 --- a/segments/filter/aggregate/flowcache.go +++ b/segments/filter/aggregate/flowcache.go @@ -31,7 +31,7 @@ func NewFlowKeyFromFlow(flow *pb.EnrichedFlow) FlowKey { SrcPort: uint16(flow.SrcPort), DstPort: uint16(flow.DstPort), Proto: flow.Proto, - IPTos: uint8(flow.IPTos), + IPTos: uint8(flow.IpTos), InIface: flow.InIf, } } @@ -79,9 +79,9 @@ func BuildFlow(f *FlowRecord) *pb.EnrichedFlow { msg := &pb.EnrichedFlow{} msg.Type = pb.EnrichedFlow_EBPF msg.SamplerAddress = f.SamplerAddress - msg.TimeReceived = uint64(f.TimeReceived.Unix()) - msg.TimeFlowStart = uint64(f.TimeReceived.Unix()) - msg.TimeFlowEnd = uint64(f.LastUpdated.Unix()) + msg.TimeReceived = uint64(f.TimeReceived.UnixNano()) + msg.TimeFlowStart = uint64(f.TimeReceived.UnixNano()) + msg.TimeFlowEnd = uint64(f.LastUpdated.UnixNano()) for i, pkt := range f.Packets { if i == 0 { msg.InIf = uint32(pkt.Metadata().InterfaceIndex) @@ -103,37 +103,37 @@ func BuildFlow(f *FlowRecord) *pb.EnrichedFlow { msg.SrcAddr = ip.SrcIP msg.DstAddr = ip.DstIP msg.Proto = uint32(ip.Protocol) - msg.IPTos = uint32(ip.TOS) - msg.IPTTL = uint32(ip.TTL) + msg.IpTos = uint32(ip.TOS) + msg.IpTtl = uint32(ip.TTL) case layers.LayerTypeIPv6: ip, _ := layer.(*layers.IPv6) msg.SrcAddr = ip.SrcIP msg.DstAddr = ip.DstIP msg.Proto = uint32(ip.NextHeader) - msg.IPTos = uint32(ip.TrafficClass) - msg.IPTTL = uint32(ip.HopLimit) - msg.IPv6FlowLabel = ip.FlowLabel + msg.IpTos = uint32(ip.TrafficClass) + msg.IpTtl = uint32(ip.HopLimit) + msg.Ipv6FlowLabel = ip.FlowLabel case layers.LayerTypeTCP: tcp, _ := layer.(*layers.TCP) msg.SrcPort = uint32(tcp.SrcPort) msg.DstPort = uint32(tcp.DstPort) if tcp.URG { - msg.TCPFlags = msg.TCPFlags | 0b100000 + msg.TcpFlags = msg.TcpFlags | 0b100000 } if tcp.ACK { - msg.TCPFlags = msg.TCPFlags | 0b010000 + msg.TcpFlags = msg.TcpFlags | 0b010000 } if tcp.PSH { - msg.TCPFlags = msg.TCPFlags | 0b001000 + msg.TcpFlags = msg.TcpFlags | 0b001000 } if tcp.RST { - msg.TCPFlags = msg.TCPFlags | 0b000100 + msg.TcpFlags = msg.TcpFlags | 0b000100 } if tcp.SYN { - msg.TCPFlags = msg.TCPFlags | 0b000010 + msg.TcpFlags = msg.TcpFlags | 0b000010 } if tcp.FIN { - msg.TCPFlags = msg.TCPFlags | 0b000001 + msg.TcpFlags = msg.TcpFlags | 0b000001 } case layers.LayerTypeUDP: udp, _ := layer.(*layers.UDP) @@ -272,7 +272,7 @@ func (f *FlowExporter) Insert(pkt gopacket.Packet) { record.SamplerAddress = f.samplerAddress record.Packets = append(record.Packets, pkt) - // shortcut flow export if we see TCP FIN + // shortcut flow export if we see Tcp FIN if tcpLayer := pkt.Layer(layers.LayerTypeTCP); tcpLayer != nil { tcp, _ := tcpLayer.(*layers.TCP) if tcp.FIN { diff --git a/segments/filter/flowfilter/flowfilter.go b/segments/filter/flowfilter/flowfilter.go index 248cffd..fd9f147 100644 --- a/segments/filter/flowfilter/flowfilter.go +++ b/segments/filter/flowfilter/flowfilter.go @@ -7,7 +7,6 @@ import ( "sync" "github.com/bwNetFlow/flowfilter/parser" - "github.com/bwNetFlow/flowfilter/visitors" "github.com/bwNetFlow/flowpipeline/pb" "github.com/bwNetFlow/flowpipeline/segments" ) @@ -32,7 +31,7 @@ func (segment FlowFilter) New(config map[string]string) segments.Segment { log.Printf("[error] FlowFilter: Syntax error in filter expression: %v", err) return nil } - filter := &visitors.Filter{} + filter := &Filter{} if _, err := filter.CheckFlow(newSegment.expression, &pb.EnrichedFlow{}); err != nil { log.Printf("[error] FlowFilter: Semantic error in filter expression: %v", err) return nil @@ -48,7 +47,7 @@ func (segment *FlowFilter) Run(wg *sync.WaitGroup) { log.Printf("[info] FlowFilter: Using filter expression: %s", segment.Filter) - filter := &visitors.Filter{} + filter := &Filter{} for msg := range segment.In { if match, _ := filter.CheckFlow(segment.expression, msg); match { segment.Out <- msg diff --git a/segments/filter/flowfilter/visitor.go b/segments/filter/flowfilter/visitor.go new file mode 100644 index 0000000..224e6c7 --- /dev/null +++ b/segments/filter/flowfilter/visitor.go @@ -0,0 +1,502 @@ +// FROM https://github.com/bwNetFlow/flowfilter/ +package flowfilter + +import ( + "fmt" + "net" + "strings" + + "github.com/bwNetFlow/flowfilter/parser" + "github.com/bwNetFlow/flowpipeline/pb" +) + +type Filter struct { + flowmsg *pb.EnrichedFlow + __direction string // this is super hacky +} + +func (f *Filter) CheckFlow(expr *parser.Expression, flowmsg *pb.EnrichedFlow) (bool, error) { + f.flowmsg = flowmsg // provide current flow to actual Visitor + err := parser.Visit(expr, f.Visit) // run the Visitor + return expr.EvalResult, err +} + +func (f *Filter) Visit(n parser.Node, next func() error) error { + // Before processing a node's children. + // This Visitor generally does nothing here, as we always want to know + // our childrens evaluation first. This serves to throw an error when + // new nodes haven't been added to this visitor yet. + switch node := n.(type) { + case *parser.AddressMatch: + case *parser.Address: + case *parser.AsnRangeMatch: + case *parser.Boolean: + case *parser.BpsRangeMatch: + case *parser.ByteRangeMatch: + case *parser.CidRangeMatch: + case *parser.DirectionalMatchGroup: + case *parser.DurationRangeMatch: + case *parser.DscpKey: + case *parser.DscpMatch: + case *parser.EcnKey: + case *parser.EcnMatch: + case *parser.EtypeKey: + case *parser.EtypeMatch: + case *parser.Expression: + case *parser.FlowDirectionMatch: + case *parser.IcmpMatch: + case *parser.IfSpeedRangeMatch: + case *parser.InterfaceMatch: + case *parser.IPTosRangeMatch: + case *parser.MedRangeMatch: + case *parser.LocalPrefRangeMatch: + case *parser.NetsizeRangeMatch: + case *parser.NextHopMatch: + case *parser.NextHopAsnMatch: + case *parser.NormalizedMatch: + case *parser.Number: + case *parser.PacketRangeMatch: + case *parser.PortRangeMatch: + case *parser.PpsRangeMatch: + case *parser.PassesThroughListMatch: + case *parser.ProtoKey: + case *parser.ProtoMatch: + case *parser.RangeEnd: + case *parser.RegularMatchGroup: + case *parser.RemoteCountryMatch: + case *parser.RouterMatch: + case *parser.RpkiKey: + case *parser.RpkiMatch: + case *parser.SamplingRateRangeMatch: + case *parser.Statement: + case *parser.StatusKey: + case *parser.StatusMatch: + case *parser.String: + case *parser.TcpFlagsKey: + case *parser.TcpFlagsMatch: + case *parser.VrfRangeMatch: + default: + return fmt.Errorf("Encountered unknown node type: %T", node) + } + + err := next() // descend to child nodes + if err != nil { + return err + } + + // After processing all children... + // This Visitor does all its work here. Leaf nodes are skipped over. + + switch node := n.(type) { + case *parser.AddressMatch: + if node.Mask != nil { + var mask net.IPMask + if node.Address.To4() != nil { + mask = net.CIDRMask(int(*node.Mask), 32) + } else { + mask = net.CIDRMask(int(*node.Mask), 128) + } + ipnet := &net.IPNet{IP: *node.Address, Mask: mask} + (*node).EvalResultSrc = ipnet.Contains(f.flowmsg.SrcAddr) + (*node).EvalResultDst = ipnet.Contains(f.flowmsg.DstAddr) + } else { + (*node).EvalResultSrc = net.IP(f.flowmsg.SrcAddr).Equal(*node.Address) + (*node).EvalResultDst = net.IP(f.flowmsg.DstAddr).Equal(*node.Address) + } + case *parser.AsnRangeMatch: + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.SrcAs)) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.DstAs)) + if err != nil { // errs from above calls will be the same anyways + return fmt.Errorf("Bad ASN range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.BpsRangeMatch: + duration := f.flowmsg.TimeFlowEnd - f.flowmsg.TimeFlowStart + if duration == 0 { + duration += 1 + } + bps := f.flowmsg.Bytes * 8 / duration + (*node).EvalResult, err = processNumericRange(node.NumericRange, bps) + case *parser.ByteRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, f.flowmsg.Bytes) + if err != nil { + return fmt.Errorf("Bad byte size range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.CidRangeMatch: + (*node).EvalResult, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.Cid)) + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.SrcCid)) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.DstCid)) + if err != nil { + return fmt.Errorf("Bad cid range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.RegularMatchGroup: + switch { + case node.Router != nil: + (*node).EvalResult = node.Router.EvalResult + case node.NextHop != nil: + (*node).EvalResult = node.NextHop.EvalResult + case node.NextHopAsn != nil: + (*node).EvalResult = node.NextHopAsn.EvalResult + case node.Bytes != nil: + (*node).EvalResult = node.Bytes.EvalResult + case node.Packets != nil: + (*node).EvalResult = node.Packets.EvalResult + case node.RemoteCountry != nil: + (*node).EvalResult = node.RemoteCountry.EvalResult + case node.FlowDirection != nil: + (*node).EvalResult = node.FlowDirection.EvalResult + case node.Normalized != nil: + (*node).EvalResult = node.Normalized.EvalResult + case node.Duration != nil: + (*node).EvalResult = node.Duration.EvalResult + case node.Etype != nil: + (*node).EvalResult = node.Etype.EvalResult + case node.Proto != nil: + (*node).EvalResult = node.Proto.EvalResult + case node.Status != nil: + (*node).EvalResult = node.Status.EvalResult + case node.TcpFlags != nil: + (*node).EvalResult = node.TcpFlags.EvalResult + case node.IPTos != nil: + (*node).EvalResult = node.IPTos.EvalResult + case node.LocalPref != nil: + (*node).EvalResult = node.LocalPref.EvalResult + case node.Med != nil: + (*node).EvalResult = node.Med.EvalResult + case node.Dscp != nil: + (*node).EvalResult = node.Dscp.EvalResult + case node.Ecn != nil: + (*node).EvalResult = node.Ecn.EvalResult + case node.SamplingRate != nil: + (*node).EvalResult = node.SamplingRate.EvalResult + case node.Icmp != nil: + (*node).EvalResult = node.Icmp.EvalResult + case node.Bps != nil: + (*node).EvalResult = node.Bps.EvalResult + case node.Pps != nil: + (*node).EvalResult = node.Pps.EvalResult + case node.PassesThrough != nil: + (*node).EvalResult = node.PassesThrough.EvalResult + case node.Rpki != nil: + (*node).EvalResult = node.Rpki.EvalResult + } + case *parser.DirectionalMatchGroup: + if node.Direction == nil { + switch { + case node.Address != nil: + (*node).EvalResult = node.Address.EvalResultSrc || node.Address.EvalResultDst + case node.Interface != nil: + (*node).EvalResult = node.Interface.EvalResultSrc || node.Interface.EvalResultDst + case node.Port != nil: + (*node).EvalResult = node.Port.EvalResultSrc || node.Port.EvalResultDst + case node.Asn != nil: + (*node).EvalResult = node.Asn.EvalResultSrc || node.Asn.EvalResultDst + case node.Netsize != nil: + (*node).EvalResult = node.Netsize.EvalResultSrc || node.Netsize.EvalResultDst + case node.Cid != nil: + (*node).EvalResult = node.Cid.EvalResult || node.Cid.EvalResultSrc || node.Cid.EvalResultDst + case node.Vrf != nil: + (*node).EvalResult = node.Vrf.EvalResultSrc || node.Vrf.EvalResultDst + } + } else if *node.Direction == "src" { + switch { + case node.Address != nil: + (*node).EvalResult = node.Address.EvalResultSrc + case node.Interface != nil: + (*node).EvalResult = node.Interface.EvalResultSrc + case node.Port != nil: + (*node).EvalResult = node.Port.EvalResultSrc + case node.Asn != nil: + (*node).EvalResult = node.Asn.EvalResultSrc + case node.Netsize != nil: + (*node).EvalResult = node.Netsize.EvalResultSrc + case node.Cid != nil: + (*node).EvalResult = node.Cid.EvalResultSrc + case node.Vrf != nil: + (*node).EvalResult = node.Vrf.EvalResultSrc + } + } else if *node.Direction == "dst" { + switch { + case node.Address != nil: + (*node).EvalResult = node.Address.EvalResultDst + case node.Interface != nil: + (*node).EvalResult = node.Interface.EvalResultDst + case node.Port != nil: + (*node).EvalResult = node.Port.EvalResultDst + case node.Asn != nil: + (*node).EvalResult = node.Asn.EvalResultDst + case node.Netsize != nil: + (*node).EvalResult = node.Netsize.EvalResultDst + case node.Cid != nil: + (*node).EvalResult = node.Cid.EvalResultDst + case node.Vrf != nil: + (*node).EvalResult = node.Vrf.EvalResultDst + } + } + case *parser.DurationRangeMatch: + duration := f.flowmsg.TimeFlowEnd - f.flowmsg.TimeFlowStart + (*node).EvalResult, err = processNumericRange(node.NumericRange, duration) + if err != nil { + return fmt.Errorf("Bad duration range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.DscpMatch: + switch { + case node.Dscp != nil: + (*node).EvalResult = f.flowmsg.IpTos>>2 == uint32(*node.Dscp) + case node.DscpKey != nil: + (*node).EvalResult = f.flowmsg.IpTos>>2 == uint32(*node.DscpKey) + } + case *parser.EcnMatch: + switch { + case node.Ecn != nil: + (*node).EvalResult = f.flowmsg.IpTos&0b00000011 == uint32(*node.Ecn) + case node.EcnKey != nil: + (*node).EvalResult = f.flowmsg.IpTos&0b00000011 == uint32(*node.EcnKey) + } + case *parser.EtypeMatch: + switch { + case node.Etype != nil: + (*node).EvalResult = f.flowmsg.Etype == uint32(*node.Etype) + case node.EtypeKey != nil: + (*node).EvalResult = f.flowmsg.Etype == uint32(*node.EtypeKey) + } + case *parser.Expression: + switch { + case node.Left == nil: + (*node).EvalResult = true // empty filters return all flows + case node.Conjunction == nil: + (*node).EvalResult = node.Left.EvalResult + case *node.Conjunction == "and": + (*node).EvalResult = node.Left.EvalResult && node.Right.EvalResult + case *node.Conjunction == "or": + (*node).EvalResult = node.Left.EvalResult || node.Right.EvalResult + } + case *parser.FlowDirectionMatch: + if *node.FlowDirection == "incoming" { + (*node).EvalResult = f.flowmsg.FlowDirection == 0 + } else if *node.FlowDirection == "outgoing" { + (*node).EvalResult = f.flowmsg.FlowDirection == 1 + } + case *parser.IcmpMatch: + if f.flowmsg.Proto != 1 { + (*node).EvalResult = false + break + } + switch { + case node.Type != nil: + (*node).EvalResult = uint32(*node.Type) == f.flowmsg.DstPort/256 + case node.Code != nil: + (*node).EvalResult = uint32(*node.Code) == f.flowmsg.DstPort%256 + } + case *parser.IfSpeedRangeMatch: + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.SrcIfSpeed)/1000) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.DstIfSpeed)/1000) + if err != nil { // errs from above calls will be the same anyways + return fmt.Errorf("Bad iface speed range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.InterfaceMatch: + switch { + case node.SnmpId != nil: + (*node).EvalResultSrc = uint32(*node.SnmpId) == f.flowmsg.InIf + (*node).EvalResultDst = uint32(*node.SnmpId) == f.flowmsg.OutIf + case node.Name != nil: + (*node).EvalResultSrc = strings.Contains( + strings.ToLower(f.flowmsg.SrcIfName), + strings.ToLower(string(*node.Name)), + ) + (*node).EvalResultDst = strings.Contains( + strings.ToLower(f.flowmsg.DstIfName), + strings.ToLower(string(*node.Name)), + ) + case node.Description != nil: + (*node).EvalResultSrc = strings.Contains( + strings.ToLower(f.flowmsg.SrcIfDesc), + strings.ToLower(string(*node.Description)), + ) + (*node).EvalResultDst = strings.Contains( + strings.ToLower(f.flowmsg.DstIfDesc), + strings.ToLower(string(*node.Description)), + ) + case node.Speed != nil: + (*node).EvalResultSrc = node.Speed.EvalResultSrc + (*node).EvalResultDst = node.Speed.EvalResultDst + } + case *parser.IPTosRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.IpTos)) + if err != nil { + return fmt.Errorf("Bad iptos range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.LocalPrefRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.LocalPref)) + if err != nil { + return fmt.Errorf("Bad localpref range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.MedRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.Med)) + if err != nil { + return fmt.Errorf("Bad med range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.NetsizeRangeMatch: + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.SrcNet)) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.DstNet)) + if err != nil { // errs from above calls will be the same anyways + return fmt.Errorf("Bad netsize range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.NextHopMatch: + (*node).EvalResult = net.IP(f.flowmsg.NextHop).Equal(*node.Address) + case *parser.NextHopAsnMatch: + (*node).EvalResult = f.flowmsg.NextHopAs == *node.Asn + case *parser.NormalizedMatch: + (*node).EvalResult = f.flowmsg.Normalized == 1 + case *parser.PacketRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, f.flowmsg.Packets) + if err != nil { + return fmt.Errorf("Bad packet count range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.PortRangeMatch: + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.SrcPort)) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.DstPort)) + if err != nil { // errs from above calls will be the same anyways + return fmt.Errorf("Bad port range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.PpsRangeMatch: + duration := f.flowmsg.TimeFlowEnd - f.flowmsg.TimeFlowStart + + if duration == 0 { + duration += 1 + } + pps := f.flowmsg.Packets / duration + (*node).EvalResult, err = processNumericRange(node.NumericRange, pps) + if err != nil { + return fmt.Errorf("Bad range: %v.", err) + } + case *parser.PassesThroughListMatch: + sliceEq := func(a []parser.Number, b []uint32) bool { + for i, v := range a { + if uint32(v) != b[i] { + return false + } + } + return true + } + + for i := range f.flowmsg.AsPath { + if i+len(node.Numbers) > len(f.flowmsg.AsPath) { + break + } + if sliceEq(node.Numbers, f.flowmsg.AsPath[i:i+len(node.Numbers)]) { + (*node).EvalResult = true + break + } else { + (*node).EvalResult = false + } + } + case *parser.ProtoMatch: + switch { + case node.Proto != nil: + (*node).EvalResult = f.flowmsg.Proto == uint32(*node.Proto) + case node.ProtoKey != nil: + (*node).EvalResult = f.flowmsg.Proto == uint32(*node.ProtoKey) + } + case *parser.RemoteCountryMatch: + (*node).EvalResult = strings.Contains(f.flowmsg.RemoteCountry, strings.ToUpper(string(*node.CountryCode))) + case *parser.RouterMatch: + (*node).EvalResult = net.IP(f.flowmsg.SamplerAddress).Equal(*node.Address) + case *parser.RpkiMatch: + if node.RpkiKey == nil { + (*node).EvalResult = false + break + } + (*node).EvalResult = f.flowmsg.ValidationStatus == pb.EnrichedFlow_ValidationStatusType(*node.RpkiKey) + case *parser.SamplingRateRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, f.flowmsg.SamplingRate) + if err != nil { + return fmt.Errorf("Bad samplingrate range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.Statement: + switch { + case node.DirectionalMatch != nil: + (*node).EvalResult = node.DirectionalMatch.EvalResult + case node.RegularMatch != nil: + (*node).EvalResult = node.RegularMatch.EvalResult + case node.SubExpression != nil: + (*node).EvalResult = node.SubExpression.EvalResult + } + if node.Negated != nil && *node.Negated == true { + (*node).EvalResult = !(*node).EvalResult + } + case *parser.StatusMatch: + switch { + case node.Status != nil: + (*node).EvalResult = f.flowmsg.ForwardingStatus == uint32(*node.Status) + case node.StatusKey != nil: + (*node).EvalResult = f.flowmsg.ForwardingStatus&uint32(*node.StatusKey) == uint32(*node.StatusKey) + } + case *parser.TcpFlagsMatch: + if f.flowmsg.Proto != 6 { + (*node).EvalResult = false + break + } + switch { + case node.TcpFlags != nil: + (*node).EvalResult = f.flowmsg.TcpFlags == uint32(*node.TcpFlags) + case node.TcpFlagsKey != nil: + (*node).EvalResult = f.flowmsg.TcpFlags&uint32(*node.TcpFlagsKey) == uint32(*node.TcpFlagsKey) + } + case *parser.VrfRangeMatch: + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.IngressVrfIDBW)) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.EgressVrfIDBW)) + if err != nil { // errs from above calls will be the same anyways + return fmt.Errorf("Bad ASN range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + } + return nil +} + +func processNumericRange(node parser.NumericRange, compare uint64) (bool, error) { + var err error + if node.Lower != nil && node.Upper != nil { + if uint64(*node.Lower) > uint64(*node.Upper) { + err = fmt.Errorf("Bad range, %d - %d", *node.Lower, *node.Upper) + } + return uint64(*node.Lower) <= compare && compare <= uint64(*node.Upper), err + } else { + var unary string + if node.Unary != nil { + unary = string(*node.Unary) + } + switch unary { + case "<": + return compare < uint64(*node.Number), err + case ">": + return compare > uint64(*node.Number), err + default: + return compare == uint64(*node.Number), err + } + } +} diff --git a/segments/input/bpf/bpf.go b/segments/input/bpf/bpf.go index abf9591..dc4d543 100644 --- a/segments/input/bpf/bpf.go +++ b/segments/input/bpf/bpf.go @@ -9,17 +9,14 @@ import ( "sync" "time" - "github.com/bwNetFlow/bpf_flowexport/flowexport" - "github.com/bwNetFlow/bpf_flowexport/packetdump" "github.com/bwNetFlow/flowpipeline/segments" ) -// FIXME: the bpf_flowexport projects needs to adopt the new flowmsg too type Bpf struct { segments.BaseSegment - dumper *packetdump.PacketDumper - exporter *flowexport.FlowExporter + dumper PacketDumper + exporter *FlowExporter Device string // required, the name of the device to capture, e.g. "eth0" ActiveTimeout string // optional, default is 30m @@ -53,7 +50,7 @@ func (segment Bpf) New(config map[string]string) segments.Segment { } // setup bpf dumping - newsegment.dumper = &packetdump.PacketDumper{BufSize: newsegment.BufferSize} + newsegment.dumper = PacketDumper{BufSize: newsegment.BufferSize} err := newsegment.dumper.Setup(newsegment.Device) if err != nil { @@ -88,7 +85,7 @@ func (segment Bpf) New(config map[string]string) segments.Segment { log.Printf("[info] Bpf: 'inactivetimeout' set to '%s'.", config["inactivetimeout"]) } - newsegment.exporter, err = flowexport.NewFlowExporter(newsegment.ActiveTimeout, newsegment.InactiveTimeout) + newsegment.exporter, err = NewFlowExporter(newsegment.ActiveTimeout, newsegment.InactiveTimeout) if err != nil { log.Printf("[error] Bpf: error setting up exporter: %s", err) return nil diff --git a/segments/input/bpf/bpf_bpfeb.o b/segments/input/bpf/bpf_bpfeb.o new file mode 100644 index 0000000000000000000000000000000000000000..5f9ddf1aa235d81602687fc0a9cd8897cd5b92cb GIT binary patch literal 18544 zcmds8eRx#WnLqc=X99!?1PEVpp@2a{2oPiZKocO4C?6vPL2I21$%M=@BtvF`pev@< zR?RL%ne&?J!bLIeR zcc1-h&%?d%`+MK_yyu+veBAfm47aqdS>?KpC=^Hh4!j{KXuvE#AyKowPZrKoNy&@D zF-32Bc=QxGP-zSLrp6V+5`9o_fTWQ7lVl2#mUmbB`_l89+Lr;Xl07VW-G3cO$A-;$=MjowLW zv@7G5oHlx|A@|T98DGfnx8!dT!|&asup1%WdEV$g(rq5^!riRsr4dCd5T{vG{E6eK z@yFxOzcHS>=m*#z&&P<*Fdo?-L;gDL_UL$Mc{A40AuTt@N%;{iKR{~O4->=BK~h70 zlvvM8BjWQ3Vn049wVq;_-*FH-pxg^##Ki+Wdt92S6%~Fw;P*ZXF#c1ds6T-e{>Fk- zYQGmlK8f!#XR8|8~7^?ez!wZ|MK2 zD|p8`ZTn zS5!I^aPqhfB2dvj@$#t`kGW)wi_ruer+p$0q}if<;)R%k&|DZ?Hf9XiFxfFQ617S~R;H4NndUcS_N4 zN`r8#i?ABd&`upA-3T#lrn7h=J#HCu&6v$-Z93dkFGfo^@&h)ofoS#2g(__(LgwQ#~G{>H)^BrZ~MVq>%{5T`=6=mpfl8 z3n(F`5X_Z)x@-t?ABo9f2Qw|EMWcbikW4!T0A(5OCqlgx!PgEV}q`BpL&GH5ja^1bsyC{+Pr26E5%H4)XqT znD>z=?{AIe{Zu9HPH-~sv6;M2pUr#C0^TpE<9+!e-q$VR{o19xr>^6D=k>e~ZRPzF z+jxHZ+GQW82x5_H_Cpy)#vkGQ_K5B z7xUhB3GbUO-ea@XQ|E?h&& z;fRYx>%J6OjC;nZ!u^+uXJk1!?vKLf(d1tvt8l+dn@HXdzI!TMFVA??Kncd3Yq8b> zPA|az$x^=^O|1zza$p2^DRhonzm zr`o&sj5^iceP`4ils-RM(D{9FPeIY7`V!pd`~?osq^}Fap=;B+?>m15-A@a;1JHR| z_k{B~=)QsD5`mnBK)vK7BXQ@-C|JywGt*gvtW5+kNbqZ;WsI{(R@!mE<3g{QFzUe^&C>ts;L=@*h}D{;QI|zK#5ol25dge@^n9S1=Y_ z-GQ824K{?O6}ZoxgoPfsJ?c=>hG1Rp)I_SBnXLFaM9(_s$Uw0J&pNXl%HIY5n&Y|P zgV+<`X9vkok^G!6c~9EEkAV%&mHgZ?@(ZQSymIgiNazh`{#fz|2>5ej>}2RT1n)!( zoqQ`ipIu*$>SLl)$!5SdMyJvCk6>?dmPTrv^XMM|hoAG==OA(e^sQF*Ed~BrXQAxd zPRZ9r*sfX(i{t`Oi=kdF0JRtv%LPy)7sC>deG9Yc$DC!63g-gW=j6TSG|Cup@?LW; zlySKS{2NY_Z2MD^zevX7GvJ?fF6NknpO^e4@hq5f^T!Zg<@Y81ix3{uY&*~KHH!< z6eWl#@RhMN!?aQJ)fhEA!2tfIieQcck5?0%ufW%45MWKw?CT!EIvk=2*v((B|)z;d$Nrnr@-H>A>g5dcD@-Wz(yf>s)OJT1)knQ z!1D*1Z(T=#&=Wk~o>m z3(@_v@OXJahVC`UeglBK2CL*lSTYkrvG3haaHp#G;sF9I40=5FIXc1g9FHEPljC#} zeh}w;6@YXS2`bZ<4$0Ky7~uxwZIntr$cc{r4ig<7YzkFPfrrp9aCsp-ItYHHz*Lvu zqyp1|1lTp9^FvkB!vJA8BbX5(z(bQ@rtHsj1W-d~kcSBXP$_bV#;BlpdFH&H3 zg$L%Np{hBt+33R@qECma-Y4cnai<|xM0r`LYOahCRs_MkprGN?p{jGm98^1(hFdVO zH$qi4(lDvOf|v{ow+$j#Rm=4f#)Fbh7BswOT5p42sO;j)f}AICQ=GE6X`Ry-6y^$gQB(c;#4bh47b@w+e2B@Z++h zmE*Y;!cQtqjB7mntOAv?&o3%4p@EuzRCOjc5nu;nXq8oM1h1p(KMYk)TEn3UEamXq z?z9kg^>p@UYqn<*uDUK!ClZ--SE?_U5?#H?0g*_wY}n9pO=4sFwXKPcYvQemgvchl zwx{wrk>8U|iF99{)f2hxTN9c7WOrigo_s1NGW~tqJn9Dfa_Mb-scs1piNU2yq|-8eWE>HWLK;;z-kl34YQ6FMXT1;MLxc% z$ZuL%+q$mkwjFa}gk;_Nb;S;?+}Kg#Y;BvG>XKPr z9$%GMm1tkLvUN*hZOg_hg%YgTv|$668Zj|NO$eXCe&Ud*VW&h68Wwy8cA-;iSG13sw~7Fg2J; z>_}#_>Ar1ZS0>q)$PT1(IHMHEccpzPXF5BO?jK0!_h3D2gIO+-?n(D`r*;dUA`D8< zwN>;cbG_(#qAQckr*tPwq%(_UM^RAgqlYI?yo7KDwy zP%a{6Dp?t|9Vs-ym6+I`+LIG~y$GYo%R3hd#wOQmF3~fP+$PeX=>aToAEo-bl36Yw zWye_19$PDgm77!T=+(QcA%TT0b=Y#)0u2c)Z8D8gAsI?!cht_{L!;QcJoX2+-VIpI zT#8~_u0N4WVSVSei>>{Gecg%f)GkC=?ns7%8Z~J5f5n zi9}96i*o%~XtKfdjVTNww>`0S5V2}+TO-ub@~ej&JT*l%Z^+Z}cFe167ZGz_6lPM6 zw8HZq)boX;C^TcD#Vh37f%kAxND*`JskpRSoWo}|3ZBzSrrV<3eAMwkkKn4uh1^7z z2F-h*%QW8%x?J;}pmEI)fnKBe1E4*c9|rB${0QicikIC&GRn3b50vRA`DRci#N<0c zKZk1!_#sdxSdhCODDxZg&7g;Ik?#a$c0+y$l*tYG1EAm2{4nUtnjZoEiQ*Y@@h`Z> zBK#icZ#91a^j%!=6ZFuJa?Lk`=eq~xouDk^zz;z_3;cNS!{FzGhm8#TBF%fCER~Qq z!=?#5ZHBFE3en> zA%}Ikb$b*w<1*{t1c($|6;}~t;d0Qd29dKDGy-}nf=Jm!baRFF$@MIoGWyE+v7flg z+VuLI3=Gql`mU zxc+|}=x04BjRTBHb|E=pIE&{jQXV8eGR;0c*Tz}PC!?7Q@oY@x7mGT+ALw@kc=QaL znp}Qhuq*Esro=lBUKV&a2@l0jMLaxfy=C4_H(#Q}+w*nIqacFu!pp2@s4{}OMr!@% zw6|=T7jIc{Wot*GZT-d$wBapU_jvsLx9(N9QZjWY@h&sVLR?f%A=}8M`?^wI zI)84?Q`Ks{8&c;Eq`Z7@%2W9$d&zOgj1)e4^Zk7}9Ya38k-#k|#@4W0=HXo-5yuOb zKXG(*`imWX)k@non*9*zWrVxdqp1#7Ina?ao<4Zy`?7kOsR>?uwl}d z@9)jkn7)cxtJSQYSY0V&RMHyQFB;4ZEJ8dpgWah`Thsa6BH0jL8tQt5ht-lF9O%Q6 zR__sAh+;m8ch#j!yc!C3TTSZ8K0}jQW7*3?sbt{(F;yHr(hpcPc;|V>2y`0n&G+he z*Y{|zH+!i}4l4uO<&0B$b>shjQX9@ZsWtX|6!QKBx^F%8EDJ8XY)O4_Ozht2lU{fo zC^bCW)R(?kSdlG#|I!m;E*!g~_4Pe0rA;%d>`kNg)>LByR-Q2fN+nx8+bU^nIP)rD z)lC0cy=MBYu`q)@OD~k_4EAU7Py5sSpS}u>moya+e@$uAWuE^f2Hy_;CyUBE-@|&w zc~N}FtMwK)SOX}$)*?nl!#epQTAZNwI+Y4-883Y}ovgMBuhnSFFsx&mQEW>tSpT)# zvgC_p(eh93Rq;i&*7F0v%BOu2Q)lgb^#sk;dZ&F8K{(OBS}%w9mi`{@{RJ50&HBro z{~fOmZ?yOzr@!j4rD8fDJI&W0{f6V|bgT*#SMWMqSuH~*=X?UZpW)Gl87O6~%EtL5 z@FT)GKu8_&^TIjEM6pxjp9$v(v&dcpQ;&9N??#04B=K$oBh%(bOQ~-X&NF-yJD~AS z;S4jY#G8=Re@ZwnQ-4(BsFSaC|@ zF5#R)f1H@cw;_)vZqoQE{5ct)T%BeE!=KZp@rZC|;BCW+8yH!)vqj-xK)5l)$IF?cKcMjsgc-^@xuf)A(NDHp8Ajbm4r3ejwbHXwUTw zjP~3bjo%e+6Z+>i8JPNJjp+|-(TyvNzb3eC_(<<=(Rhz=*GvZPRO1hSK{&ODm)mRT zSwE}sF}R}rZp(hi(9?dO#-sRiIqmmb_V*il+8%03 z!TE|3v%Zc;^drJOLcNZM#MJBYMh^-1Ui#DH5xN9)f1@Xb`wZ4guu1tZYZ2}X{uwit zKd%VlB{KTw_@E%qB)`5-gXp(AB!a;I7ImEes2GRuFb*Bya&W+v=6cE8j)mJ&eW`(T zSE=GO%f3`TjjPlulkOYbT`FSsDF1|lKcApUyd5pfWEvZgN8nUuzGS3 z2516`4nqkBW9Ku6x-ew?^NC7BfpYn7`s1fs)`7$~MJ>ER>z8^&_m{#6Rg~9$3&Vl^3cf92Xxf~R2nX)G#lzpS0)K#Pe7Fv^=7s~e z-clD13^`tC=Jn8dp;>S@5p+^`CTLw~N_cKC5-JaT`4%tegeC>PPlvOm=rJw&2Z(0P zkhRW1EqV!s8^eKj_IhX|@G%E1{C4jaHoYGW%_?o6Dm*7NqdqiQ`8*!fiFTl zZ;ces!_c7)e19)v6L=IF1nsrGS711SuQ>UTbDJ9|eE8#>oUuF*6r(54q`_*yKf5@b zU0;64(Eiepj~McI4EZaD9A}2_$1&x@MLG9fp?sq#=lS9n2Oo!gKRh=I<(~|BTR|$s ze-`EL2}6FYC=ZzOpBVCC!~WNX{C-2u&J;cvS@NifeIEAm0P(R;A&>dINg*$MIWy#! zKnRstc>ahvc%aE0X=vDw6y(^nC50yy3V+QZf3NGGb+lt&eE*C&suwW(V`4l*__eN} zXHH}4@r>pPBrgzgJ}y&#AuxUTXUG~$ztO_iTDS)o&*egW9D*hO@3t`K&usr&7Jk{n zuUYu#rP#qU#`K5Z7L{WBI;cdy)WZ0oL5coy3%6SMN(*0Q;msEQfQ7p(oVIYkg$FIn zuenD2oDW*~b_;*p!uMGC(-wZn!jD?`ix&Q>g?V{=9{UEqol<=wIMRmi{eEf2ve3&ugQ8aB8W&{E?5TuebEpdI|D*Y1(&K zxYNQJ3tQ_WXswUne#`zr3m>#F*N54kVGF-t;a4pDx`nOv5d34QKE&sr(O#&^!t*R_ z#WTd`msx+gh1Xj68Vjc^ywk!rTlfwO-)G^6E&P~;t@APTT}yB6uh594x6Z#1b3SAI zVdfDg9%o@|y@sv$h8J7*%Pib(Ve32#GaoS9-)Uhho?$DVVJn_tE1qF1p5bp={=Z{k zE1uyuEd5CfThEIK&pu;3k!lND@rx|6^j1C*vGS{kwH_l@{32F96&bSpf84?kSeWOb z*?(()NB-W@ThHT&m48LvwCvw5#ZjKkMte~!e$g40eu0G>Exf|QaSMOI!Z%uYpM|aU z6@A3gKV{+XS(wiQV|-=Sek-f6^nBi#_B9s1z{1w~Rkq&JUuWU8g?Cxl%IC_yWa*Du z*xD~;)_GobvedrZ%BRY$@t0fqRQda?`qp_~Zk;#fS6KE|eqG*e>33RquZ5W}81qqn zzl9&Qu$AAITkE6TdLEYl*sA}FQY`bGNst9`p~(Nv!S^qXMJ;&lAs;tenCsuvcUm}W z;UNp}x9|ZAAF}YUg^yc!#KI>^F}H`=Uw$ty!JdWdE!=G3xP?0{oVDIwKj zk00*}{H!KZx4dIj9fAIld)aLjlP|2@{WDVsh-G?6%*JU!hb|m<-82qPz;{P-- z%;{*(?9&PzcrkNjU&7{(M*tTb@?}$FmgjVAV3_SUwJ0cFh*{q5pgV zcDM%KqrUvU>DMKV76Jc@D*yI*rm~3n4hz>kpL_l|{rZ%jhs$r@*F(f2-(Si2_T*Vi z%$)gb_4#~fF~%#gZ%=R+E)z=wbqhYI!5xN>tZ7f)#D-~z?*}OSJ8DTW?XRRkiM9a3 z%s)}e-%_-2H|_b&>1^?DQZ>enfHMBRogY8OzaE$GkGxST`M!!0nXPEy?%R{{ox;Zj z1I1Los_59CSqjts5OjXOEVE@?n=BqK_J1rc7PJ3+r#1aa19hACq@sm&i+^lx@Cd@ literal 0 HcmV?d00001 diff --git a/segments/input/bpf/flow_exporter.go b/segments/input/bpf/flow_exporter.go new file mode 100644 index 0000000..54da853 --- /dev/null +++ b/segments/input/bpf/flow_exporter.go @@ -0,0 +1,205 @@ +package bpf + +import ( + "fmt" + "log" + "net" + "sync" + "time" + + "github.com/bwNetFlow/flowpipeline/pb" +) + +type FlowKey struct { + SrcAddr string + DstAddr string + SrcPort uint16 + DstPort uint16 + Proto uint32 + IPTos uint8 + InIface uint32 +} + +type FlowExporter struct { + activeTimeout time.Duration + inactiveTimeout time.Duration + samplerAddress net.IP + + Flows chan *pb.EnrichedFlow + + mutex *sync.RWMutex + stop chan bool + cache map[FlowKey]*FlowRecord +} + +type FlowRecord struct { + TimeReceived time.Time + LastUpdated time.Time + SamplerAddress net.IP + Packets []Packet +} + +func NewFlowExporter(activeTimeout string, inactiveTimeout string) (*FlowExporter, error) { + activeTimeoutDuration, err := time.ParseDuration(activeTimeout) + if err != nil { + return nil, fmt.Errorf("active timeout misconfigured") + } + inactiveTimeoutDuration, err := time.ParseDuration(inactiveTimeout) + if err != nil { + return nil, fmt.Errorf("inactive timeout misconfigured") + } + + fe := &FlowExporter{activeTimeout: activeTimeoutDuration, inactiveTimeout: inactiveTimeoutDuration} + fe.Flows = make(chan *pb.EnrichedFlow) + + fe.mutex = &sync.RWMutex{} + fe.cache = make(map[FlowKey]*FlowRecord) + + return fe, nil +} + +func (f *FlowExporter) Start(samplerAddress net.IP) { + log.Println("[info] FlowExporter: Starting export goroutines.") + + f.samplerAddress = samplerAddress + f.stop = make(chan bool) + go f.exportInactive() + go f.exportActive() +} + +func (f *FlowExporter) Stop() { + log.Println("[info] FlowExporter: Stopping export goroutines.") + close(f.stop) +} + +func (f *FlowExporter) exportInactive() { + ticker := time.NewTicker(f.inactiveTimeout) + for { + select { + case <-ticker.C: + now := time.Now() + + f.mutex.Lock() + for key, record := range f.cache { + if now.Sub(record.LastUpdated) > f.inactiveTimeout { + f.export(key) + } + } + f.mutex.Unlock() + case <-f.stop: + ticker.Stop() + return + } + } +} + +func (f *FlowExporter) exportActive() { + ticker := time.NewTicker(f.activeTimeout) + for { + select { + case <-ticker.C: + now := time.Now() + + f.mutex.Lock() + for key, record := range f.cache { + if now.Sub(record.TimeReceived) > f.activeTimeout { + f.export(key) + } + } + f.mutex.Unlock() + case <-f.stop: + ticker.Stop() + return + } + } +} + +func (f *FlowExporter) export(key FlowKey) { + flowRecord := f.cache[key] + delete(f.cache, key) + + f.Flows <- BuildFlow(flowRecord) +} + +func BuildFlow(f *FlowRecord) *pb.EnrichedFlow { + msg := &pb.EnrichedFlow{} + msg.Type = pb.EnrichedFlow_EBPF + msg.SamplerAddress = f.SamplerAddress + msg.TimeReceived = uint64(f.TimeReceived.UnixNano()) + msg.TimeFlowStart = uint64(f.TimeReceived.UnixNano()) + msg.TimeFlowEnd = uint64(f.LastUpdated.UnixNano()) + for i, pkt := range f.Packets { + if i == 0 { + // flow key 7-tuple + msg.SrcAddr = pkt.SrcAddr + msg.DstAddr = pkt.DstAddr + msg.SrcPort = uint32(pkt.SrcPort) + msg.DstPort = uint32(pkt.DstPort) + msg.Proto = pkt.Proto + msg.IpTos = uint32(pkt.IPTos) + msg.InIf = pkt.InIf + + // other presumably static data, this will be set to the first packets fields + msg.OutIf = pkt.OutIf + msg.FlowDirection = uint32(pkt.FlowDirection) // this is derived from the packets type + msg.RemoteAddr = pb.EnrichedFlow_RemoteAddrType(pkt.RemoteAddr) // this is derived from the packets type + msg.Etype = pkt.Etype + msg.Ipv6FlowLabel = pkt.Ipv6FlowLabel // TODO: no differences possible? + msg.IpTtl = uint32(pkt.IPTtl) // TODO: set to lowest if differ? + msg.IcmpType = uint32(pkt.IcmpType) // TODO: differences could occur between packets + msg.IcmpCode = uint32(pkt.IcmpCode) // TODO: differences could occur between packets + } + // special handling + msg.TcpFlags = msg.TcpFlags | uint32(pkt.TcpFlags) + msg.Bytes += uint64(pkt.Bytes) + msg.Packets += 1 + } + return msg +} + +func (f *FlowExporter) ConsumeFrom(pkts chan Packet) { + for { + select { + case pkt, ok := <-pkts: + f.Insert(pkt) + if !ok { + return + } + case <-f.stop: + return + } + } +} + +func (f *FlowExporter) Insert(pkt Packet) { + key := NewFlowKey(pkt) + + var record *FlowRecord + var exists bool + + f.mutex.Lock() + if record, exists = f.cache[key]; !exists { + f.cache[key] = new(FlowRecord) + f.cache[key].TimeReceived = time.Now() + record = f.cache[key] + } + record.LastUpdated = time.Now() + record.SamplerAddress = f.samplerAddress + record.Packets = append(record.Packets, pkt) + if pkt.TcpFlags&0b1 == 1 { // short cut flow export if we see TCP FIN + f.export(key) + } + f.mutex.Unlock() +} + +func NewFlowKey(pkt Packet) FlowKey { + return FlowKey{ + SrcAddr: string(pkt.SrcAddr.To16()), + DstAddr: string(pkt.DstAddr.To16()), + SrcPort: pkt.SrcPort, + DstPort: pkt.DstPort, + Proto: pkt.Proto, + IPTos: pkt.IPTos, + InIface: pkt.InIf, + } +} diff --git a/segments/input/bpf/packet_dumper.go b/segments/input/bpf/packet_dumper.go new file mode 100644 index 0000000..c238399 --- /dev/null +++ b/segments/input/bpf/packet_dumper.go @@ -0,0 +1,289 @@ +//go:build linux +// +build linux + +// based on https://github.com/bwNetFlow/bpf_flowexport/blob/master/packetdump/packetdump.go +package bpf + +import ( + "bytes" + _ "embed" + "encoding/binary" + "errors" + "fmt" + "io" + "log" + "net" + "syscall" + + "github.com/cilium/ebpf" + "github.com/cilium/ebpf/perf" + "github.com/cilium/ebpf/rlimit" +) + +// $BPF_CLANG and $BPF_CFLAGS are set by the Makefile. +// +//go:generate go run github.com/cilium/ebpf/cmd/bpf2go -cc clang-13 -cflags "-O2 -g -Wall -Werror" bpf ./bpf/bpf.c +type rawPacket struct { + SrcAddrHi uint64 + SrcAddrLo uint64 + DstAddrHi uint64 + DstAddrLo uint64 + InIf uint32 + OutIf uint32 + Bytes uint32 + Etype uint32 + Proto uint32 + Ipv6FlowLabel uint32 + SrcAddr uint32 + DstAddr uint32 + SrcPort uint16 + DstPort uint16 + IPTtl uint8 + IPTos uint8 + IcmpType uint8 + IcmpCode uint8 + TcpFlags uint8 + FlowDirection uint8 + RemoteAddr uint8 +} + +type Packet struct { + SrcAddr net.IP + DstAddr net.IP + InIf uint32 + OutIf uint32 + Bytes uint32 + Etype uint32 + Proto uint32 + Ipv6FlowLabel uint32 + SrcPort uint16 + DstPort uint16 + IPTtl uint8 + IPTos uint8 + IcmpType uint8 + IcmpCode uint8 + TcpFlags uint8 + FlowDirection uint8 + RemoteAddr uint8 +} + +func parseRawPacket(rawPacket rawPacket) Packet { + var srcip, dstip net.IP + if rawPacket.Etype == 0x0800 { + srcip = make(net.IP, 4) + binary.BigEndian.PutUint32(srcip, rawPacket.SrcAddr) + dstip = make(net.IP, 4) + binary.BigEndian.PutUint32(dstip, rawPacket.DstAddr) + } else if rawPacket.Etype == 0x86dd { + srcip = make(net.IP, 16) + binary.BigEndian.PutUint64(srcip, rawPacket.SrcAddrHi) + binary.BigEndian.PutUint64(srcip[8:], rawPacket.SrcAddrLo) + dstip = make(net.IP, 16) + binary.BigEndian.PutUint64(dstip, rawPacket.DstAddrHi) + binary.BigEndian.PutUint64(dstip[8:], rawPacket.DstAddrLo) + } + return Packet{SrcAddr: srcip, + DstAddr: dstip, + InIf: rawPacket.InIf, + OutIf: rawPacket.OutIf, + Bytes: rawPacket.Bytes, + Etype: rawPacket.Etype, + Proto: rawPacket.Proto, + Ipv6FlowLabel: rawPacket.Ipv6FlowLabel, + SrcPort: rawPacket.SrcPort, + DstPort: rawPacket.DstPort, + IPTtl: rawPacket.IPTtl, + IPTos: rawPacket.IPTos, + IcmpType: rawPacket.IcmpType, + IcmpCode: rawPacket.IcmpCode, + TcpFlags: rawPacket.TcpFlags, + FlowDirection: rawPacket.FlowDirection, + RemoteAddr: rawPacket.RemoteAddr, + } +} + +type PacketDumper struct { + BufSize int // Determines kernel perf map allocation. It is rounded up to the nearest multiple of the current page size. + + packets chan Packet // exported through .Packets() + + // setup + objs bpfObjects + socketFilterFd int + iface *net.Interface + SamplerAddress net.IP + + // start + socketFd int + perfReader *perf.Reader +} + +func (b *PacketDumper) Packets() chan Packet { + if b.packets != nil { + return b.packets + } + b.packets = make(chan Packet) + go func() { + var rawPacket rawPacket + for { + record, err := b.perfReader.Read() + if err != nil { + if errors.Is(err, perf.ErrClosed) { + return + } + log.Printf("[error] BPF packet dump: Error reading from kernel perf event reader: %s", err) + continue + } + + if record.LostSamples != 0 { + log.Printf("[warning] BPF packet dump: Dropped %d samples from kernel perf buffer, consider increasing BufSize (currently %d bytes)", record.LostSamples, b.BufSize) + continue + } + + // Parse the perf event entry into an Event structure. + if err := binary.Read(bytes.NewBuffer(record.RawSample), binary.LittleEndian, &rawPacket); err != nil { + log.Printf("[error] BPF packet dump: Skipped 1 sample, error decoding raw perf event data: %s", err) + continue + } + b.packets <- parseRawPacket(rawPacket) + } + }() + return b.packets +} + +func (b *PacketDumper) Setup(device string) error { + // allow the current process to lock memory for eBPF resources + if err := rlimit.RemoveMemlock(); err != nil { + log.Fatalf("[error] BPF packet dump: Error during required memlock removal: %s", err) + } + + b.objs = bpfObjects{} // load pre-compiled programs and maps into the kernel + if err := loadBpfObjects(&b.objs, nil); err != nil { + log.Fatalf("[error] BPF packet dump: Error loading objects: %v", err) + } + + var err error + if b.iface, err = net.InterfaceByName(device); err != nil { + return fmt.Errorf("Unable to get interface, err: %v", err) + } + + var addrs []net.Addr + addrs, err = b.iface.Addrs() + for _, a := range addrs { + if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + b.SamplerAddress = ipnet.IP + break + } + } + + return nil +} + +func (b *PacketDumper) Start() error { + var err error + // 768 is the network byte order representation of 0x3 (constant syscall.ETH_P_ALL) + if b.socketFd, err = syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, 768); err != nil { + return fmt.Errorf("Unable to open raw socket, err: %v", err) + } + + sll := syscall.SockaddrLinklayer{ + Ifindex: b.iface.Index, + Protocol: 768, + } + if err := syscall.Bind(b.socketFd, &sll); err != nil { + return fmt.Errorf("Unable to bind interface to raw socket, err: %v", err) + } + + if err := syscall.SetsockoptInt(b.socketFd, syscall.SOL_SOCKET, 50, b.objs.PacketDump.FD()); err != nil { + return fmt.Errorf("Unable to attach BPF socket filter: %v", err) + } + + if b.BufSize == 0 { + // Set to a reasonably conservative value thats safe for + // client-side pps levels. + // Cilium docs set this to os.Getpagesize, which will return + // 4096 bytes on any resonably modern platform. This however + // leads to dropped samples in high load situations for dev + // machines and containers, so the default is to increase that + // by a factor of 2. + b.BufSize = 2 * 4096 + } + b.perfReader, err = perf.NewReader(b.objs.Packets, b.BufSize) + if err != nil { + return fmt.Errorf("Unable to connect kernel perf event reader: %s", err) + } + + return nil +} + +func (b *PacketDumper) Stop() { + b.objs.Close() + syscall.Close(b.socketFd) + b.perfReader.Close() +} + +// bpfObjects contains all objects after they have been loaded into the kernel. +// +// It can be passed to loadBpfObjects or ebpf.CollectionSpec.LoadAndAssign. +type bpfObjects struct { + bpfPrograms + bpfMaps +} +type bpfPrograms struct { + PacketDump *ebpf.Program `ebpf:"packet_dump"` +} + +// Close implements io.Closer. +func (b *bpfPrograms) Close() error { + panic("unimplemented") +} + +type bpfMaps struct { + Packets *ebpf.Map `ebpf:"packets"` +} + +// Close implements io.Closer. +func (b *bpfMaps) Close() error { + panic("unimplemented") +} + +func loadBpfObjects(obj interface{}, opts *ebpf.CollectionOptions) error { + spec, err := loadBpf() + if err != nil { + return err + } + + return spec.LoadAndAssign(obj, opts) +} + +// loadBpf returns the embedded CollectionSpec for bpf. +func loadBpf() (*ebpf.CollectionSpec, error) { + reader := bytes.NewReader(_BpfBytes) + spec, err := ebpf.LoadCollectionSpecFromReader(reader) + if err != nil { + return nil, fmt.Errorf("can't load bpf: %w", err) + } + + return spec, err +} + +func (o *bpfObjects) Close() error { + return _BpfClose( + &o.bpfPrograms, + &o.bpfMaps, + ) +} + +func _BpfClose(closers ...io.Closer) error { + for _, closer := range closers { + if err := closer.Close(); err != nil { + return err + } + } + return nil +} + +// Do not access this directly. +// +//go:embed bpf_bpfeb.o +var _BpfBytes []byte diff --git a/segments/input/goflow/goflow.go b/segments/input/goflow/goflow.go index d1799c6..fdb3e6a 100644 --- a/segments/input/goflow/goflow.go +++ b/segments/input/goflow/goflow.go @@ -8,7 +8,9 @@ import ( "context" "fmt" "log" + "log/slog" "net/url" + "os" "strconv" "strings" "sync" @@ -17,16 +19,26 @@ import ( "github.com/bwNetFlow/flowpipeline/segments" "google.golang.org/protobuf/proto" - "github.com/netsampler/goflow2/transport" - "github.com/netsampler/goflow2/utils" + _ "github.com/netsampler/goflow2/v2/format/binary" + "github.com/netsampler/goflow2/v2/utils/debug" + + "github.com/netsampler/goflow2/v2/transport" + _ "github.com/netsampler/goflow2/v2/transport/file" + _ "github.com/netsampler/goflow2/v2/transport/kafka" + + "github.com/netsampler/goflow2/v2/metrics" + rawproducer "github.com/netsampler/goflow2/v2/producer/raw" + "github.com/netsampler/goflow2/v2/utils" ) type Goflow struct { segments.BaseSegment - Listen []url.URL // optional, default config value for this slice is "sflow://:6343,netflow://:2055" - Workers uint64 // optional, amunt of workers to spawn for each endpoint, default is 1 - - goflow_in chan *pb.EnrichedFlow + Listen []url.URL // optional, default config value for this slice is "sflow://:6343,netflow://:2055" + Workers uint64 // optional, amunt of workers to spawn for each endpoint, default is 1 + Blocking bool //optional, default is false + QueueSize int //default is 1000000 + NumSockets int //default is 1 + goflow_in chan *pb.EnrichedFlow } func (segment Goflow) New(config map[string]string) segments.Segment { @@ -148,37 +160,72 @@ func (d *myProtobufDriver) Init(context.Context) error { return nil } func (segment *Goflow) startGoFlow(transport transport.TransportInterface) { formatter := &myProtobufDriver{} + var pipes []utils.FlowPipe for _, listenAddrUrl := range segment.Listen { go func(listenAddrUrl url.URL) { + var err error hostname := listenAddrUrl.Hostname() port, _ := strconv.ParseUint(listenAddrUrl.Port(), 10, 64) - var err error + if segment.NumSockets == 0 { + segment.NumSockets = 1 + } + + if segment.QueueSize == 0 { + segment.QueueSize = 1000000 + } + + cfg := &utils.UDPReceiverConfig{ + Sockets: segment.NumSockets, + Workers: int(segment.Workers), + QueueSize: segment.QueueSize, + Blocking: segment.Blocking, + ReceiverCallback: metrics.NewReceiverMetric(), + } + recv, err := utils.NewUDPReceiver(cfg) + if err != nil { + log.Println("error creating UDP receiver", slog.String("error", err.Error())) + os.Exit(1) + } + + if err != nil { + slog.Error("error transporter", slog.String("error", err.Error())) + os.Exit(1) + } + + cfgPipe := &utils.PipeConfig{ + Format: formatter, + Transport: transport, + Producer: &rawproducer.RawProducer{}, + NetFlowTemplater: metrics.NewDefaultPromTemplateSystem, // wrap template system to get Prometheus info + } + + var pipeline utils.FlowPipe switch scheme := listenAddrUrl.Scheme; scheme { case "netflow": - sNF := &utils.StateNetFlow{ - Format: formatter, - Transport: transport, - } + pipeline = utils.NewNetFlowPipe(cfgPipe) log.Printf("[info] Goflow: Listening for Netflow v9 on port %d...", port) - err = sNF.FlowRoutine(int(segment.Workers), hostname, int(port), false) case "sflow": - sSFlow := &utils.StateSFlow{ - Format: formatter, - Transport: transport, - } + pipeline = utils.NewSFlowPipe(cfgPipe) log.Printf("[info] Goflow: Listening for sflow on port %d...", port) - err = sSFlow.FlowRoutine(int(segment.Workers), hostname, int(port), false) - case "nfl": - sNFL := &utils.StateNFLegacy{ - Format: formatter, - Transport: transport, - } + case "flow": + pipeline = utils.NewFlowPipe(cfgPipe) log.Printf("[info] Goflow: Listening for netflow legacy on port %d...", port) - err = sNFL.FlowRoutine(int(segment.Workers), hostname, int(port), false) + default: + log.Fatal("scheme does not exist", slog.String("error", listenAddrUrl.Scheme)) } + + decodeFunc := pipeline.DecodeFlow + // intercept panic and generate error + decodeFunc = debug.PanicDecoderWrapper(decodeFunc) + // wrap decoder with Prometheus metrics + decodeFunc = metrics.PromDecoderWrapper(decodeFunc, listenAddrUrl.Scheme) + pipes = append(pipes, pipeline) + + err = recv.Start(hostname, int(port), decodeFunc) + if err != nil { log.Fatalf("[error] Goflow: %s", err.Error()) } @@ -186,8 +233,3 @@ func (segment *Goflow) startGoFlow(transport transport.TransportInterface) { }(listenAddrUrl) } } - -func init() { - segment := &Goflow{} - segments.RegisterSegment("goflow", segment) -} diff --git a/segments/input/kafkaconsumer/handler.go b/segments/input/kafkaconsumer/handler.go index cc26337..b6477be 100644 --- a/segments/input/kafkaconsumer/handler.go +++ b/segments/input/kafkaconsumer/handler.go @@ -1,12 +1,14 @@ package kafkaconsumer import ( + "bytes" "context" "log" + "log/slog" "github.com/Shopify/sarama" "github.com/bwNetFlow/flowpipeline/pb" - "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/encoding/protodelim" ) // Handler represents a Sarama consumer group consumer @@ -33,17 +35,17 @@ func (h *Handler) Cleanup(sarama.ConsumerGroupSession) error { } // ConsumeClaim must start a consumer loop of ConsumerGroupClaim's Messages(). + func (h *Handler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error { for { select { case message := <-claim.Messages(): - session.MarkMessage(message, "") - flowMsg := new(pb.EnrichedFlow) - if err := proto.Unmarshal(message.Value, flowMsg); err == nil { - h.flows <- flowMsg - } else { - log.Printf("[warning] KafkaConsumer: Error decoding flow, this might be due to the use of Goflow custom fields. Original error:\n %s", err) + var msg pb.ProtoProducerMessage + if err := protodelim.UnmarshalFrom(bytes.NewReader(message.Value), &msg); err != nil { + slog.Error("error unmarshalling message", slog.String("error", err.Error())) + continue } + h.flows <- &msg.EnrichedFlow case <-session.Context().Done(): return nil } diff --git a/segments/modify/aslookup/aslookup.go b/segments/modify/aslookup/aslookup.go index a3ddb37..533392e 100644 --- a/segments/modify/aslookup/aslookup.go +++ b/segments/modify/aslookup/aslookup.go @@ -1,75 +1,74 @@ package aslookup import ( - "os" "log" - "net" + "net" + "os" "sync" - "github.com/banviktor/asnlookup/pkg/database" + "github.com/banviktor/asnlookup/pkg/database" "github.com/bwNetFlow/flowpipeline/segments" ) type AsLookup struct { segments.BaseSegment - FileName string - Type string + FileName string + Type string - asDatabase database.Database + asDatabase database.Database } func (segment AsLookup) New(config map[string]string) segments.Segment { - newSegment := &AsLookup{} + newSegment := &AsLookup{} - // parse options + // parse options if config["filename"] == "" { log.Println("[error] AsLookup: This segment requires a 'filename' parameter.") return nil } - newSegment.FileName = config["filename"] + newSegment.FileName = config["filename"] - if config["type"] == "db" { - newSegment.Type = "db" - } else if config["type"] == "mrt" { - newSegment.Type = "mrt" - } else { + if config["type"] == "db" { + newSegment.Type = "db" + } else if config["type"] == "mrt" { + newSegment.Type = "mrt" + } else { log.Println("[info] AsLookup: 'type' set to default 'db'.") - newSegment.Type = "db" - } + newSegment.Type = "db" + } - // open lookup file + // open lookup file lookupfile, err := os.OpenFile(config["filename"], os.O_RDONLY, 0) if err != nil { log.Printf("[error] AsLookup: Error opening lookup file: %s", err) return nil } - defer lookupfile.Close() + defer lookupfile.Close() // lookup file can either be an MRT file or a lookup database generated with asnlookup - // see: https://github.com/banviktor/asnlookup - if newSegment.Type == "db" { - // open lookup db - db, err := database.NewFromDump(lookupfile) - if err != nil { - log.Printf("[error] AsLookup: Error parsing database file: %s", err) - } - newSegment.asDatabase = db - } else { - // parse with asnlookup - builder := database.NewBuilder() - if err = builder.ImportMRT(lookupfile); err != nil { - log.Printf("[error] AsLookup: Error parsing MRT file: %s", err) - } - - // build lookup database - db, err := builder.Build() - if err != nil { - log.Printf("[error] AsLookup: Error building lookup database: %s", err) - } - newSegment.asDatabase = db - } - + // see: https://github.com/banviktor/asnlookup + if newSegment.Type == "db" { + // open lookup db + db, err := database.NewFromDump(lookupfile) + if err != nil { + log.Printf("[error] AsLookup: Error parsing database file: %s", err) + } + newSegment.asDatabase = db + } else { + // parse with asnlookup + builder := database.NewBuilder() + if err = builder.ImportMRT(lookupfile); err != nil { + log.Printf("[error] AsLookup: Error parsing MRT file: %s", err) + } + + // build lookup database + db, err := builder.Build() + if err != nil { + log.Printf("[error] AsLookup: Error building lookup database: %s", err) + } + newSegment.asDatabase = db + } return newSegment } @@ -81,24 +80,24 @@ func (segment *AsLookup) Run(wg *sync.WaitGroup) { }() for msg := range segment.In { // Look up destination AS - dstIp := net.ParseIP(msg.DstAddrObj().String()) - dstAs, err := segment.asDatabase.Lookup(dstIp) - if err != nil { - log.Printf("[warning] AsLookup: Failed to look up ASN for %s: %s", msg.DstAddrObj().String(), err) - segment.Out <- msg - continue - } - msg.DstAS = dstAs.Number + dstIp := net.ParseIP(msg.DstAddrObj().String()) + dstAs, err := segment.asDatabase.Lookup(dstIp) + if err != nil { + log.Printf("[warning] AsLookup: Failed to look up ASN for %s: %s", msg.DstAddrObj().String(), err) + segment.Out <- msg + continue + } + msg.DstAs = dstAs.Number // Look up source AS - srcIp := net.ParseIP(msg.SrcAddrObj().String()) - srcAs, err := segment.asDatabase.Lookup(srcIp) - if err != nil { - log.Printf("[warning] AsLookup: Failed to look up ASN for %s: %s", msg.SrcAddrObj().String(), err) - segment.Out <- msg - continue - } - msg.SrcAS = srcAs.Number + srcIp := net.ParseIP(msg.SrcAddrObj().String()) + srcAs, err := segment.asDatabase.Lookup(srcIp) + if err != nil { + log.Printf("[warning] AsLookup: Failed to look up ASN for %s: %s", msg.SrcAddrObj().String(), err) + segment.Out <- msg + continue + } + msg.SrcAs = srcAs.Number segment.Out <- msg } diff --git a/segments/modify/aslookup/aslookup_test.go b/segments/modify/aslookup/aslookup_test.go index 80b3f57..ccd34c7 100644 --- a/segments/modify/aslookup/aslookup_test.go +++ b/segments/modify/aslookup/aslookup_test.go @@ -9,23 +9,23 @@ import ( // TODO: write tests for this func TestSegment_AsLookup_existingIp(t *testing.T) { - result := segments.TestSegment("aslookup", map[string]string{"filename": "../../../examples/enricher/lookup.db", "type": "db"}, + result := segments.TestSegment("aslookup", map[string]string{"filename": "../../../examples/enricher/lookup.db", "type": "db"}, &pb.EnrichedFlow{SrcAddr: []byte{192, 168, 1, 10}, DstAddr: []byte{192, 168, 1, 10}}) - if result.SrcAS != 65015 { + if result.SrcAs != 65015 { t.Error("Segment AsLookup is not setting the source AS when the corresponding IP exists in the lookup database") } - if result.DstAS != 65015 { + if result.DstAs != 65015 { t.Error("Segment AsLookup is not setting the destination AS when the corresponding IP exists in the lookup database") } } func TestSegment_AsLookup_nonexistingIp(t *testing.T) { - result := segments.TestSegment("aslookup", map[string]string{"filename": "../../../examples/enricher/lookup.db", "type": "db"}, + result := segments.TestSegment("aslookup", map[string]string{"filename": "../../../examples/enricher/lookup.db", "type": "db"}, &pb.EnrichedFlow{SrcAddr: []byte{2, 125, 160, 218}, DstAddr: []byte{2, 125, 160, 218}}) - if result.SrcAS != 0 { + if result.SrcAs != 0 { t.Error("Segment AsLookup is setting the source AS when the corresponding IP does not exist in the lookup database.") } - if result.DstAS != 0 { + if result.DstAs != 0 { t.Error("Segment AsLookup is setting the destination AS when the corresponding IP does not exist in the lookup database.") } } diff --git a/segments/modify/bgp/bgp.go b/segments/modify/bgp/bgp.go index 3de8589..830afa7 100644 --- a/segments/modify/bgp/bgp.go +++ b/segments/modify/bgp/bgp.go @@ -92,7 +92,7 @@ func (segment *Bgp) Run(wg *sync.WaitGroup) { if !path.Best { continue } - msg.ASPath = path.AsPath + msg.AsPath = path.AsPath msg.Med = path.Med msg.LocalPref = path.LocalPref switch path.Validation { @@ -106,8 +106,8 @@ func (segment *Bgp) Run(wg *sync.WaitGroup) { msg.ValidationStatus = pb.EnrichedFlow_Unknown } // for router exported netflow, the following are likely overwriting their own annotations - msg.DstAS = path.AsPath[len(path.AsPath)-1] - msg.NextHopAS = path.AsPath[0] + msg.DstAs = path.AsPath[len(path.AsPath)-1] + msg.NextHopAs = path.AsPath[0] if nh := net.ParseIP(path.NextHop); nh != nil { msg.NextHop = nh } diff --git a/segments/output/kafkaproducer/kafkaproducer.go b/segments/output/kafkaproducer/kafkaproducer.go index f731b58..64a55d3 100644 --- a/segments/output/kafkaproducer/kafkaproducer.go +++ b/segments/output/kafkaproducer/kafkaproducer.go @@ -16,7 +16,6 @@ import ( "github.com/Shopify/sarama" "github.com/bwNetFlow/flowpipeline/pb" "github.com/bwNetFlow/flowpipeline/segments" - "google.golang.org/protobuf/proto" ) // All configuration parameters are the same as in the kafkaconsumer segment, @@ -163,7 +162,9 @@ func (segment *KafkaProducer) Run(wg *sync.WaitGroup) { for msg := range segment.In { segment.Out <- msg var binary []byte - if binary, err = proto.Marshal(msg); err != nil { + protoProducerMessage := pb.ProtoProducerMessage{} + protoProducerMessage.EnrichedFlow = *msg + if binary, err = protoProducerMessage.MarshalBinary(); err != nil { log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) continue } diff --git a/segments/print/printflowdump/printflowdump.go b/segments/print/printflowdump/printflowdump.go index 743004b..2f0891b 100644 --- a/segments/print/printflowdump/printflowdump.go +++ b/segments/print/printflowdump/printflowdump.go @@ -91,11 +91,11 @@ func (segment PrintFlowdump) format_flow(flowmsg *pb.EnrichedFlow) string { var srcas, dstas string if segment.Verbose { - if flowmsg.SrcAS != 0 { - srcas = fmt.Sprintf("AS%d/", flowmsg.SrcAS) + if flowmsg.SrcAs != 0 { + srcas = fmt.Sprintf("AS%d/", flowmsg.SrcAs) } - if flowmsg.DstAS != 0 { - dstas = fmt.Sprintf("AS%d/", flowmsg.DstAS) + if flowmsg.DstAs != 0 { + dstas = fmt.Sprintf("AS%d/", flowmsg.DstAs) } } var proto string From 5761694aefeb2ac1b33e5b48bf50552f8c3b8d85 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Mon, 4 Nov 2024 16:47:56 +0100 Subject: [PATCH 06/18] Added kafka legacy mode goflow2 change the format of kafka messages. To ensure the functionallity of existing 3rd party software a legacy flag was added --- segments/input/kafkaconsumer/handler.go | 22 ++++++++++--- segments/input/kafkaconsumer/kafkaconsumer.go | 18 +++++++++-- .../output/kafkaproducer/kafkaproducer.go | 31 ++++++++++++++++--- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/segments/input/kafkaconsumer/handler.go b/segments/input/kafkaconsumer/handler.go index b6477be..1d18b7f 100644 --- a/segments/input/kafkaconsumer/handler.go +++ b/segments/input/kafkaconsumer/handler.go @@ -9,12 +9,14 @@ import ( "github.com/Shopify/sarama" "github.com/bwNetFlow/flowpipeline/pb" "google.golang.org/protobuf/encoding/protodelim" + "google.golang.org/protobuf/proto" ) // Handler represents a Sarama consumer group consumer type Handler struct { ready chan bool flows chan *pb.EnrichedFlow + legacy bool cancel context.CancelFunc } @@ -40,12 +42,22 @@ func (h *Handler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama for { select { case message := <-claim.Messages(): - var msg pb.ProtoProducerMessage - if err := protodelim.UnmarshalFrom(bytes.NewReader(message.Value), &msg); err != nil { - slog.Error("error unmarshalling message", slog.String("error", err.Error())) - continue + if h.legacy { + session.MarkMessage(message, "") + flowMsg := new(pb.EnrichedFlow) + if err := proto.Unmarshal(message.Value, flowMsg); err == nil { + h.flows <- flowMsg + } else { + log.Printf("[warning] KafkaConsumer: Error decoding flow, this might be due to the use of Goflow custom fields. Original error:\n %s", err) + } + } else { + var msg pb.ProtoProducerMessage + if err := protodelim.UnmarshalFrom(bytes.NewReader(message.Value), &msg); err != nil { + slog.Error("error unmarshalling message", slog.String("error", err.Error())) + continue + } + h.flows <- &msg.EnrichedFlow } - h.flows <- &msg.EnrichedFlow case <-session.Context().Done(): return nil } diff --git a/segments/input/kafkaconsumer/kafkaconsumer.go b/segments/input/kafkaconsumer/kafkaconsumer.go index dccda25..79afb3f 100644 --- a/segments/input/kafkaconsumer/kafkaconsumer.go +++ b/segments/input/kafkaconsumer/kafkaconsumer.go @@ -30,6 +30,7 @@ type KafkaConsumer struct { Auth bool // optional, default is true StartAt string // optional, one of "oldest" or "newest", default is "newest" Timeout time.Duration // optional, default is 15s, any parsable duration + Legacy bool //optional, default is false startingOffset int64 saramaConfig *sarama.Config @@ -49,6 +50,18 @@ func (segment KafkaConsumer) New(config map[string]string) segments.Segment { newsegment.Group = config["group"] } + var legacy bool = false + if config["legacy"] != "" { + if parsedTls, err := strconv.ParseBool(config["legacy"]); err == nil { + legacy = parsedTls + } else { + log.Println("[Error] KafkaConsumer: Could not parse 'legacy' parameter, using default false.") + } + } else { + log.Println("[Debug] KafkaConsumer: 'legacy' set to default false.") + } + newsegment.Legacy = legacy + // set some unconfigurable defaults // newsegment.saramaConfig.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategySticky newsegment.saramaConfig.Consumer.Group.Rebalance.GroupStrategies = []sarama.BalanceStrategy{sarama.BalanceStrategySticky} @@ -170,8 +183,9 @@ func (segment *KafkaConsumer) Run(wg *sync.WaitGroup) { handlerCtx, handlerCancel := context.WithCancel(context.Background()) var handler = &Handler{ - ready: make(chan bool), - flows: make(chan *pb.EnrichedFlow), + ready: make(chan bool), + flows: make(chan *pb.EnrichedFlow), + legacy: segment.Legacy, } handlerWg := sync.WaitGroup{} handlerWg.Add(1) diff --git a/segments/output/kafkaproducer/kafkaproducer.go b/segments/output/kafkaproducer/kafkaproducer.go index 64a55d3..3fd553a 100644 --- a/segments/output/kafkaproducer/kafkaproducer.go +++ b/segments/output/kafkaproducer/kafkaproducer.go @@ -16,6 +16,7 @@ import ( "github.com/Shopify/sarama" "github.com/bwNetFlow/flowpipeline/pb" "github.com/bwNetFlow/flowpipeline/segments" + "google.golang.org/protobuf/proto" ) // All configuration parameters are the same as in the kafkaconsumer segment, @@ -39,6 +40,7 @@ type KafkaProducer struct { Pass string // required if auth is true Tls bool // optional, default is true Auth bool // optional, default is true + Legacy bool // optional, default is false saramaConfig *sarama.Config } @@ -56,6 +58,18 @@ func (segment KafkaProducer) New(config map[string]string) segments.Segment { newsegment.Topic = config["topic"] } + var legacy bool = false + if config["legacy"] != "" { + if parsedTls, err := strconv.ParseBool(config["legacy"]); err == nil { + legacy = parsedTls + } else { + log.Println("[Error] KafkaProducer: Could not parse 'legacy' parameter, using default false.") + } + } else { + log.Println("[Debug] KafkaProducer: 'legacy' set to default false.") + } + newsegment.Legacy = legacy + // set some unconfigurable defaults newsegment.saramaConfig.Producer.RequiredAcks = sarama.WaitForLocal // Only wait for the leader to ack newsegment.saramaConfig.Producer.Compression = sarama.CompressionSnappy // Compress messages @@ -162,11 +176,18 @@ func (segment *KafkaProducer) Run(wg *sync.WaitGroup) { for msg := range segment.In { segment.Out <- msg var binary []byte - protoProducerMessage := pb.ProtoProducerMessage{} - protoProducerMessage.EnrichedFlow = *msg - if binary, err = protoProducerMessage.MarshalBinary(); err != nil { - log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) - continue + if segment.Legacy { + if binary, err = proto.Marshal(msg); err != nil { + log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) + continue + } + } else { + protoProducerMessage := pb.ProtoProducerMessage{} + protoProducerMessage.EnrichedFlow = *msg + if binary, err = protoProducerMessage.MarshalBinary(); err != nil { + log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) + continue + } } if segment.TopicSuffix == "" { From 9632a6dc2596ba9fbc408dc814a083ec141e56b1 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Wed, 20 Nov 2024 08:57:43 +0100 Subject: [PATCH 07/18] Bugfix: missing timestamps flowmessages didnt contain start/end timestamps --- go.mod | 3 +- go.sum | 22 +- pb/enrichedflow.pb.go | 995 ++++++---- pb/enrichedflow.proto | 36 +- pb/legacyconverter.go | 294 +++ pb/legacyenrichedflow.pb.go | 1630 +++++++++++++++++ pb/legacyenrichedflow.proto | 225 +++ segments/input/kafkaconsumer/handler.go | 8 +- segments/output/csv/csv.go | 2 +- .../output/kafkaproducer/kafkaproducer.go | 3 +- segments/output/sqlite/sqlite.go | 2 +- 11 files changed, 2825 insertions(+), 395 deletions(-) create mode 100644 pb/legacyconverter.go create mode 100644 pb/legacyenrichedflow.pb.go create mode 100644 pb/legacyenrichedflow.proto diff --git a/go.mod b/go.mod index 4cb0a73..70e6a23 100644 --- a/go.mod +++ b/go.mod @@ -31,6 +31,8 @@ require ( ) require ( + github.com/golang/protobuf v1.5.3 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect github.com/montanaflynn/stats v0.7.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect @@ -58,7 +60,6 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.6.1 // indirect - github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.3.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect diff --git a/go.sum b/go.sum index ea4bdb0..1491e18 100644 --- a/go.sum +++ b/go.sum @@ -214,8 +214,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -298,6 +296,7 @@ github.com/jcmturner/gokrb5/v8 v8.4.3 h1:iTonLeSJOn7MVUtyMT+arAn5AKAPrkilzhGw8wE github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -559,15 +558,22 @@ github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207 h1:nn7SOQy8xCu3i github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -602,6 +608,8 @@ golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -636,6 +644,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -675,6 +684,7 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= @@ -708,10 +718,13 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7 h1:ZrnxWX62AgTKOSagEqxvb3ffipvEDX2pl7E1TdqLqIc= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -766,6 +779,7 @@ golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -789,10 +803,13 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -848,6 +865,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pb/enrichedflow.pb.go b/pb/enrichedflow.pb.go index cd38533..972f97f 100644 --- a/pb/enrichedflow.pb.go +++ b/pb/enrichedflow.pb.go @@ -78,6 +78,92 @@ func (EnrichedFlow_FlowType) EnumDescriptor() ([]byte, []int) { return file_enrichedflow_proto_rawDescGZIP(), []int{0, 0} } +// Encapsulation +type EnrichedFlow_LayerStack int32 + +const ( + EnrichedFlow_Ethernet EnrichedFlow_LayerStack = 0 + EnrichedFlow_IPv4 EnrichedFlow_LayerStack = 1 + EnrichedFlow_IPv6 EnrichedFlow_LayerStack = 2 + EnrichedFlow_TCP EnrichedFlow_LayerStack = 3 + EnrichedFlow_UDP EnrichedFlow_LayerStack = 4 + EnrichedFlow_MPLS EnrichedFlow_LayerStack = 5 + EnrichedFlow_Dot1Q EnrichedFlow_LayerStack = 6 + EnrichedFlow_ICMP EnrichedFlow_LayerStack = 7 + EnrichedFlow_ICMPv6 EnrichedFlow_LayerStack = 8 + EnrichedFlow_GRE EnrichedFlow_LayerStack = 9 + EnrichedFlow_IPv6HeaderRouting EnrichedFlow_LayerStack = 10 + EnrichedFlow_IPv6HeaderFragment EnrichedFlow_LayerStack = 11 + EnrichedFlow_Geneve EnrichedFlow_LayerStack = 12 + EnrichedFlow_Teredo EnrichedFlow_LayerStack = 13 + EnrichedFlow_Custom EnrichedFlow_LayerStack = 99 // todo: add nsh +) + +// Enum value maps for EnrichedFlow_LayerStack. +var ( + EnrichedFlow_LayerStack_name = map[int32]string{ + 0: "Ethernet", + 1: "IPv4", + 2: "IPv6", + 3: "TCP", + 4: "UDP", + 5: "MPLS", + 6: "Dot1Q", + 7: "ICMP", + 8: "ICMPv6", + 9: "GRE", + 10: "IPv6HeaderRouting", + 11: "IPv6HeaderFragment", + 12: "Geneve", + 13: "Teredo", + 99: "Custom", + } + EnrichedFlow_LayerStack_value = map[string]int32{ + "Ethernet": 0, + "IPv4": 1, + "IPv6": 2, + "TCP": 3, + "UDP": 4, + "MPLS": 5, + "Dot1Q": 6, + "ICMP": 7, + "ICMPv6": 8, + "GRE": 9, + "IPv6HeaderRouting": 10, + "IPv6HeaderFragment": 11, + "Geneve": 12, + "Teredo": 13, + "Custom": 99, + } +) + +func (x EnrichedFlow_LayerStack) Enum() *EnrichedFlow_LayerStack { + p := new(EnrichedFlow_LayerStack) + *p = x + return p +} + +func (x EnrichedFlow_LayerStack) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EnrichedFlow_LayerStack) Descriptor() protoreflect.EnumDescriptor { + return file_enrichedflow_proto_enumTypes[1].Descriptor() +} + +func (EnrichedFlow_LayerStack) Type() protoreflect.EnumType { + return &file_enrichedflow_proto_enumTypes[1] +} + +func (x EnrichedFlow_LayerStack) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EnrichedFlow_LayerStack.Descriptor instead. +func (EnrichedFlow_LayerStack) EnumDescriptor() ([]byte, []int) { + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 1} +} + // modify/anonymize type EnrichedFlow_AnonymizedType int32 @@ -109,11 +195,11 @@ func (x EnrichedFlow_AnonymizedType) String() string { } func (EnrichedFlow_AnonymizedType) Descriptor() protoreflect.EnumDescriptor { - return file_enrichedflow_proto_enumTypes[1].Descriptor() + return file_enrichedflow_proto_enumTypes[2].Descriptor() } func (EnrichedFlow_AnonymizedType) Type() protoreflect.EnumType { - return &file_enrichedflow_proto_enumTypes[1] + return &file_enrichedflow_proto_enumTypes[2] } func (x EnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { @@ -122,7 +208,7 @@ func (x EnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_AnonymizedType.Descriptor instead. func (EnrichedFlow_AnonymizedType) EnumDescriptor() ([]byte, []int) { - return file_enrichedflow_proto_rawDescGZIP(), []int{0, 1} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 2} } type EnrichedFlow_ValidationStatusType int32 @@ -161,11 +247,11 @@ func (x EnrichedFlow_ValidationStatusType) String() string { } func (EnrichedFlow_ValidationStatusType) Descriptor() protoreflect.EnumDescriptor { - return file_enrichedflow_proto_enumTypes[2].Descriptor() + return file_enrichedflow_proto_enumTypes[3].Descriptor() } func (EnrichedFlow_ValidationStatusType) Type() protoreflect.EnumType { - return &file_enrichedflow_proto_enumTypes[2] + return &file_enrichedflow_proto_enumTypes[3] } func (x EnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { @@ -174,7 +260,7 @@ func (x EnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_ValidationStatusType.Descriptor instead. func (EnrichedFlow_ValidationStatusType) EnumDescriptor() ([]byte, []int) { - return file_enrichedflow_proto_rawDescGZIP(), []int{0, 2} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 3} } // modify/normalize @@ -208,11 +294,11 @@ func (x EnrichedFlow_NormalizedType) String() string { } func (EnrichedFlow_NormalizedType) Descriptor() protoreflect.EnumDescriptor { - return file_enrichedflow_proto_enumTypes[3].Descriptor() + return file_enrichedflow_proto_enumTypes[4].Descriptor() } func (EnrichedFlow_NormalizedType) Type() protoreflect.EnumType { - return &file_enrichedflow_proto_enumTypes[3] + return &file_enrichedflow_proto_enumTypes[4] } func (x EnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { @@ -221,7 +307,7 @@ func (x EnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_NormalizedType.Descriptor instead. func (EnrichedFlow_NormalizedType) EnumDescriptor() ([]byte, []int) { - return file_enrichedflow_proto_rawDescGZIP(), []int{0, 3} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 4} } // modify/remoteaddress @@ -258,11 +344,11 @@ func (x EnrichedFlow_RemoteAddrType) String() string { } func (EnrichedFlow_RemoteAddrType) Descriptor() protoreflect.EnumDescriptor { - return file_enrichedflow_proto_enumTypes[4].Descriptor() + return file_enrichedflow_proto_enumTypes[5].Descriptor() } func (EnrichedFlow_RemoteAddrType) Type() protoreflect.EnumType { - return &file_enrichedflow_proto_enumTypes[4] + return &file_enrichedflow_proto_enumTypes[5] } func (x EnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { @@ -271,7 +357,7 @@ func (x EnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_RemoteAddrType.Descriptor instead. func (EnrichedFlow_RemoteAddrType) EnumDescriptor() ([]byte, []int) { - return file_enrichedflow_proto_rawDescGZIP(), []int{0, 4} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 5} } type EnrichedFlow struct { @@ -279,15 +365,17 @@ type EnrichedFlow struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type EnrichedFlow_FlowType `protobuf:"varint,1,opt,name=type,proto3,enum=flowpb.EnrichedFlow_FlowType" json:"type,omitempty"` - TimeReceived uint64 `protobuf:"varint,2,opt,name=time_received,json=timeReceived,proto3" json:"time_received,omitempty"` - SequenceNum uint32 `protobuf:"varint,4,opt,name=sequence_num,json=sequenceNum,proto3" json:"sequence_num,omitempty"` - SamplingRate uint64 `protobuf:"varint,3,opt,name=sampling_rate,json=samplingRate,proto3" json:"sampling_rate,omitempty"` - FlowDirection uint32 `protobuf:"varint,42,opt,name=flow_direction,json=flowDirection,proto3" json:"flow_direction,omitempty"` + Type EnrichedFlow_FlowType `protobuf:"varint,1,opt,name=type,proto3,enum=flowpb.EnrichedFlow_FlowType" json:"type,omitempty"` + TimeReceived uint64 `protobuf:"varint,2,opt,name=time_received,json=timeReceived,proto3" json:"time_received,omitempty"` + TimeReceivedNs uint64 `protobuf:"varint,110,opt,name=time_received_ns,json=timeReceivedNs,proto3" json:"time_received_ns,omitempty"` + SequenceNum uint32 `protobuf:"varint,4,opt,name=sequence_num,json=sequenceNum,proto3" json:"sequence_num,omitempty"` + SamplingRate uint64 `protobuf:"varint,3,opt,name=sampling_rate,json=samplingRate,proto3" json:"sampling_rate,omitempty"` + FlowDirection uint32 `protobuf:"varint,42,opt,name=flow_direction,json=flowDirection,proto3" json:"flow_direction,omitempty"` + TimeFlowStartNs uint64 `protobuf:"varint,111,opt,name=time_flow_start_ns,json=timeFlowStartNs,proto3" json:"time_flow_start_ns,omitempty"` + TimeFlowEndNs uint64 `protobuf:"varint,112,opt,name=time_flow_end_ns,json=timeFlowEndNs,proto3" json:"time_flow_end_ns,omitempty"` // Sampler information SamplerAddress []byte `protobuf:"bytes,11,opt,name=sampler_address,json=samplerAddress,proto3" json:"sampler_address,omitempty"` // Found inside packet - TimeFlowStart uint64 `protobuf:"varint,38,opt,name=time_flow_start,json=timeFlowStart,proto3" json:"time_flow_start,omitempty"` TimeFlowEnd uint64 `protobuf:"varint,5,opt,name=time_flow_end,json=timeFlowEnd,proto3" json:"time_flow_end,omitempty"` TimeFlowStartMs uint64 `protobuf:"varint,63,opt,name=time_flow_start_ms,json=timeFlowStartMs,proto3" json:"time_flow_start_ms,omitempty"` TimeFlowEndMs uint64 `protobuf:"varint,64,opt,name=time_flow_end_ms,json=timeFlowEndMs,proto3" json:"time_flow_end_ms,omitempty"` @@ -322,6 +410,7 @@ type EnrichedFlow struct { IpTos uint32 `protobuf:"varint,23,opt,name=ip_tos,json=ipTos,proto3" json:"ip_tos,omitempty"` ForwardingStatus uint32 `protobuf:"varint,24,opt,name=forwarding_status,json=forwardingStatus,proto3" json:"forwarding_status,omitempty"` IpTtl uint32 `protobuf:"varint,25,opt,name=ip_ttl,json=ipTtl,proto3" json:"ip_ttl,omitempty"` + IpFlags uint32 `protobuf:"varint,38,opt,name=ip_flags,json=ipFlags,proto3" json:"ip_flags,omitempty"` TcpFlags uint32 `protobuf:"varint,26,opt,name=tcp_flags,json=tcpFlags,proto3" json:"tcp_flags,omitempty"` IcmpType uint32 `protobuf:"varint,31,opt,name=icmp_type,json=icmpType,proto3" json:"icmp_type,omitempty"` IcmpCode uint32 `protobuf:"varint,32,opt,name=icmp_code,json=icmpCode,proto3" json:"icmp_code,omitempty"` @@ -343,47 +432,54 @@ type EnrichedFlow struct { BgpCommunities []uint32 `protobuf:"varint,101,rep,packed,name=bgp_communities,json=bgpCommunities,proto3" json:"bgp_communities,omitempty"` AsPath []uint32 `protobuf:"varint,102,rep,packed,name=as_path,json=asPath,proto3" json:"as_path,omitempty"` // MPLS information - HasMpls bool `protobuf:"varint,53,opt,name=has_mpls,json=hasMpls,proto3" json:"has_mpls,omitempty"` - MplsCount uint32 `protobuf:"varint,54,opt,name=mpls_count,json=mplsCount,proto3" json:"mpls_count,omitempty"` - Mpls_1Ttl uint32 `protobuf:"varint,55,opt,name=mpls_1_ttl,json=mpls1Ttl,proto3" json:"mpls_1_ttl,omitempty"` // First TTL - Mpls_1Label uint32 `protobuf:"varint,56,opt,name=mpls_1_label,json=mpls1Label,proto3" json:"mpls_1_label,omitempty"` // First Label - Mpls_2Ttl uint32 `protobuf:"varint,57,opt,name=mpls_2_ttl,json=mpls2Ttl,proto3" json:"mpls_2_ttl,omitempty"` // Second TTL - Mpls_2Label uint32 `protobuf:"varint,58,opt,name=mpls_2_label,json=mpls2Label,proto3" json:"mpls_2_label,omitempty"` // Second Label - Mpls_3Ttl uint32 `protobuf:"varint,59,opt,name=mpls_3_ttl,json=mpls3Ttl,proto3" json:"mpls_3_ttl,omitempty"` // Third TTL - Mpls_3Label uint32 `protobuf:"varint,60,opt,name=mpls_3_label,json=mpls3Label,proto3" json:"mpls_3_label,omitempty"` // Third Label - MplsLastTtl uint32 `protobuf:"varint,61,opt,name=mpls_last_ttl,json=mplsLastTtl,proto3" json:"mpls_last_ttl,omitempty"` // Last TTL - MplsLastLabel uint32 `protobuf:"varint,62,opt,name=mpls_last_label,json=mplsLastLabel,proto3" json:"mpls_last_label,omitempty"` // Last Label - MplsLabelIp []byte `protobuf:"bytes,65,opt,name=mpls_label_ip,json=mplsLabelIp,proto3" json:"mpls_label_ip,omitempty"` // MPLS TOP Label IP - ObservationDomainId uint32 `protobuf:"varint,70,opt,name=observation_domain_id,json=observationDomainId,proto3" json:"observation_domain_id,omitempty"` - ObservationPointId uint32 `protobuf:"varint,71,opt,name=observation_point_id,json=observationPointId,proto3" json:"observation_point_id,omitempty"` - SrcCountry string `protobuf:"bytes,1000,opt,name=src_country,json=srcCountry,proto3" json:"src_country,omitempty"` - DstCountry string `protobuf:"bytes,1001,opt,name=dst_country,json=dstCountry,proto3" json:"dst_country,omitempty"` - PacketBytesMin uint32 `protobuf:"varint,2100,opt,name=PacketBytesMin,proto3" json:"PacketBytesMin,omitempty"` // new, single packet means uint32 < MTU - PacketBytesMax uint32 `protobuf:"varint,2101,opt,name=PacketBytesMax,proto3" json:"PacketBytesMax,omitempty"` // new - PacketBytesMean uint32 `protobuf:"varint,2102,opt,name=PacketBytesMean,proto3" json:"PacketBytesMean,omitempty"` // new - PacketBytesStdDev uint32 `protobuf:"varint,2103,opt,name=PacketBytesStdDev,proto3" json:"PacketBytesStdDev,omitempty"` // new - PacketIATMin uint64 `protobuf:"varint,2110,opt,name=PacketIATMin,proto3" json:"PacketIATMin,omitempty"` // new - PacketIATMax uint64 `protobuf:"varint,2111,opt,name=PacketIATMax,proto3" json:"PacketIATMax,omitempty"` // new - PacketIATMean uint64 `protobuf:"varint,2112,opt,name=PacketIATMean,proto3" json:"PacketIATMean,omitempty"` // new - PacketIATStdDev uint64 `protobuf:"varint,2113,opt,name=PacketIATStdDev,proto3" json:"PacketIATStdDev,omitempty"` // new - HeaderBytes uint32 `protobuf:"varint,2120,opt,name=HeaderBytes,proto3" json:"HeaderBytes,omitempty"` // new - FINFlagCount uint64 `protobuf:"varint,2130,opt,name=FINFlagCount,proto3" json:"FINFlagCount,omitempty"` // new - SYNFlagCount uint64 `protobuf:"varint,2131,opt,name=SYNFlagCount,proto3" json:"SYNFlagCount,omitempty"` // new - RSTFlagCount uint64 `protobuf:"varint,2132,opt,name=RSTFlagCount,proto3" json:"RSTFlagCount,omitempty"` // new - PSHFlagCount uint64 `protobuf:"varint,2133,opt,name=PSHFlagCount,proto3" json:"PSHFlagCount,omitempty"` // new - ACKFlagCount uint64 `protobuf:"varint,2134,opt,name=ACKFlagCount,proto3" json:"ACKFlagCount,omitempty"` // new - URGFlagCount uint64 `protobuf:"varint,2135,opt,name=URGFlagCount,proto3" json:"URGFlagCount,omitempty"` // new - CWRFlagCount uint64 `protobuf:"varint,2136,opt,name=CWRFlagCount,proto3" json:"CWRFlagCount,omitempty"` // new - ECEFlagCount uint64 `protobuf:"varint,2137,opt,name=ECEFlagCount,proto3" json:"ECEFlagCount,omitempty"` // new - PayloadPackets uint64 `protobuf:"varint,2140,opt,name=PayloadPackets,proto3" json:"PayloadPackets,omitempty"` // new - TimeActiveMin uint64 `protobuf:"varint,2150,opt,name=TimeActiveMin,proto3" json:"TimeActiveMin,omitempty"` // new - TimeActiveMax uint64 `protobuf:"varint,2151,opt,name=TimeActiveMax,proto3" json:"TimeActiveMax,omitempty"` // new - TimeActiveMean uint64 `protobuf:"varint,2152,opt,name=TimeActiveMean,proto3" json:"TimeActiveMean,omitempty"` // new - TimeActiveStdDev uint64 `protobuf:"varint,2153,opt,name=TimeActiveStdDev,proto3" json:"TimeActiveStdDev,omitempty"` // new - TimeIdleMin uint64 `protobuf:"varint,2154,opt,name=TimeIdleMin,proto3" json:"TimeIdleMin,omitempty"` // new - TimeIdleMax uint64 `protobuf:"varint,2155,opt,name=TimeIdleMax,proto3" json:"TimeIdleMax,omitempty"` // new - TimeIdleMean uint64 `protobuf:"varint,2156,opt,name=TimeIdleMean,proto3" json:"TimeIdleMean,omitempty"` // new - TimeIdleStdDev uint64 `protobuf:"varint,2157,opt,name=TimeIdleStdDev,proto3" json:"TimeIdleStdDev,omitempty"` // new + MplsTtl []uint32 `protobuf:"varint,80,rep,packed,name=mpls_ttl,json=mplsTtl,proto3" json:"mpls_ttl,omitempty"` + MplsLabel []uint32 `protobuf:"varint,81,rep,packed,name=mpls_label,json=mplsLabel,proto3" json:"mpls_label,omitempty"` + MplsIp [][]byte `protobuf:"bytes,82,rep,name=mpls_ip,json=mplsIp,proto3" json:"mpls_ip,omitempty"` + HasMpls bool `protobuf:"varint,53,opt,name=has_mpls,json=hasMpls,proto3" json:"has_mpls,omitempty"` + MplsCount uint32 `protobuf:"varint,54,opt,name=mpls_count,json=mplsCount,proto3" json:"mpls_count,omitempty"` + Mpls_1Ttl uint32 `protobuf:"varint,55,opt,name=mpls_1_ttl,json=mpls1Ttl,proto3" json:"mpls_1_ttl,omitempty"` // First TTL + Mpls_1Label uint32 `protobuf:"varint,56,opt,name=mpls_1_label,json=mpls1Label,proto3" json:"mpls_1_label,omitempty"` // First Label + Mpls_2Ttl uint32 `protobuf:"varint,57,opt,name=mpls_2_ttl,json=mpls2Ttl,proto3" json:"mpls_2_ttl,omitempty"` // Second TTL + Mpls_2Label uint32 `protobuf:"varint,58,opt,name=mpls_2_label,json=mpls2Label,proto3" json:"mpls_2_label,omitempty"` // Second Label + Mpls_3Ttl uint32 `protobuf:"varint,59,opt,name=mpls_3_ttl,json=mpls3Ttl,proto3" json:"mpls_3_ttl,omitempty"` // Third TTL + Mpls_3Label uint32 `protobuf:"varint,60,opt,name=mpls_3_label,json=mpls3Label,proto3" json:"mpls_3_label,omitempty"` // Third Label + MplsLastTtl uint32 `protobuf:"varint,61,opt,name=mpls_last_ttl,json=mplsLastTtl,proto3" json:"mpls_last_ttl,omitempty"` // Last TTL + MplsLastLabel uint32 `protobuf:"varint,62,opt,name=mpls_last_label,json=mplsLastLabel,proto3" json:"mpls_last_label,omitempty"` // Last Label + MplsLabelIp []byte `protobuf:"bytes,65,opt,name=mpls_label_ip,json=mplsLabelIp,proto3" json:"mpls_label_ip,omitempty"` // MPLS TOP Label IP + ObservationDomainId uint32 `protobuf:"varint,70,opt,name=observation_domain_id,json=observationDomainId,proto3" json:"observation_domain_id,omitempty"` + ObservationPointId uint32 `protobuf:"varint,71,opt,name=observation_point_id,json=observationPointId,proto3" json:"observation_point_id,omitempty"` + SrcCountry string `protobuf:"bytes,1000,opt,name=src_country,json=srcCountry,proto3" json:"src_country,omitempty"` + DstCountry string `protobuf:"bytes,1001,opt,name=dst_country,json=dstCountry,proto3" json:"dst_country,omitempty"` + LayerStack []EnrichedFlow_LayerStack `protobuf:"varint,103,rep,packed,name=layer_stack,json=layerStack,proto3,enum=flowpb.EnrichedFlow_LayerStack" json:"layer_stack,omitempty"` + LayerSize []uint32 `protobuf:"varint,104,rep,packed,name=layer_size,json=layerSize,proto3" json:"layer_size,omitempty"` + Ipv6RoutingHeaderAddresses [][]byte `protobuf:"bytes,105,rep,name=ipv6_routing_header_addresses,json=ipv6RoutingHeaderAddresses,proto3" json:"ipv6_routing_header_addresses,omitempty"` // SRv6 + Ipv6RoutingHeaderSegLeft uint32 `protobuf:"varint,106,opt,name=ipv6_routing_header_seg_left,json=ipv6RoutingHeaderSegLeft,proto3" json:"ipv6_routing_header_seg_left,omitempty"` // SRv6 + PacketBytesMin uint32 `protobuf:"varint,2100,opt,name=PacketBytesMin,proto3" json:"PacketBytesMin,omitempty"` // new, single packet means uint32 < MTU + PacketBytesMax uint32 `protobuf:"varint,2101,opt,name=PacketBytesMax,proto3" json:"PacketBytesMax,omitempty"` // new + PacketBytesMean uint32 `protobuf:"varint,2102,opt,name=PacketBytesMean,proto3" json:"PacketBytesMean,omitempty"` // new + PacketBytesStdDev uint32 `protobuf:"varint,2103,opt,name=PacketBytesStdDev,proto3" json:"PacketBytesStdDev,omitempty"` // new + PacketIATMin uint64 `protobuf:"varint,2110,opt,name=PacketIATMin,proto3" json:"PacketIATMin,omitempty"` // new + PacketIATMax uint64 `protobuf:"varint,2111,opt,name=PacketIATMax,proto3" json:"PacketIATMax,omitempty"` // new + PacketIATMean uint64 `protobuf:"varint,2112,opt,name=PacketIATMean,proto3" json:"PacketIATMean,omitempty"` // new + PacketIATStdDev uint64 `protobuf:"varint,2113,opt,name=PacketIATStdDev,proto3" json:"PacketIATStdDev,omitempty"` // new + HeaderBytes uint32 `protobuf:"varint,2120,opt,name=HeaderBytes,proto3" json:"HeaderBytes,omitempty"` // new + FINFlagCount uint64 `protobuf:"varint,2130,opt,name=FINFlagCount,proto3" json:"FINFlagCount,omitempty"` // new + SYNFlagCount uint64 `protobuf:"varint,2131,opt,name=SYNFlagCount,proto3" json:"SYNFlagCount,omitempty"` // new + RSTFlagCount uint64 `protobuf:"varint,2132,opt,name=RSTFlagCount,proto3" json:"RSTFlagCount,omitempty"` // new + PSHFlagCount uint64 `protobuf:"varint,2133,opt,name=PSHFlagCount,proto3" json:"PSHFlagCount,omitempty"` // new + ACKFlagCount uint64 `protobuf:"varint,2134,opt,name=ACKFlagCount,proto3" json:"ACKFlagCount,omitempty"` // new + URGFlagCount uint64 `protobuf:"varint,2135,opt,name=URGFlagCount,proto3" json:"URGFlagCount,omitempty"` // new + CWRFlagCount uint64 `protobuf:"varint,2136,opt,name=CWRFlagCount,proto3" json:"CWRFlagCount,omitempty"` // new + ECEFlagCount uint64 `protobuf:"varint,2137,opt,name=ECEFlagCount,proto3" json:"ECEFlagCount,omitempty"` // new + PayloadPackets uint64 `protobuf:"varint,2140,opt,name=PayloadPackets,proto3" json:"PayloadPackets,omitempty"` // new + TimeActiveMin uint64 `protobuf:"varint,2150,opt,name=TimeActiveMin,proto3" json:"TimeActiveMin,omitempty"` // new + TimeActiveMax uint64 `protobuf:"varint,2151,opt,name=TimeActiveMax,proto3" json:"TimeActiveMax,omitempty"` // new + TimeActiveMean uint64 `protobuf:"varint,2152,opt,name=TimeActiveMean,proto3" json:"TimeActiveMean,omitempty"` // new + TimeActiveStdDev uint64 `protobuf:"varint,2153,opt,name=TimeActiveStdDev,proto3" json:"TimeActiveStdDev,omitempty"` // new + TimeIdleMin uint64 `protobuf:"varint,2154,opt,name=TimeIdleMin,proto3" json:"TimeIdleMin,omitempty"` // new + TimeIdleMax uint64 `protobuf:"varint,2155,opt,name=TimeIdleMax,proto3" json:"TimeIdleMax,omitempty"` // new + TimeIdleMean uint64 `protobuf:"varint,2156,opt,name=TimeIdleMean,proto3" json:"TimeIdleMean,omitempty"` // new + TimeIdleStdDev uint64 `protobuf:"varint,2157,opt,name=TimeIdleStdDev,proto3" json:"TimeIdleStdDev,omitempty"` // new // modify/addcid Cid uint32 `protobuf:"varint,2000,opt,name=Cid,proto3" json:"Cid,omitempty"` // TODO: deprecate and provide as helper? CidString string `protobuf:"bytes,2001,opt,name=CidString,proto3" json:"CidString,omitempty"` // deprecated, delete for v1.0.0 @@ -435,6 +531,8 @@ type EnrichedFlow struct { // VRF IngressVrfIDBW uint32 `protobuf:"varint,2539,opt,name=IngressVrfIDBW,proto3" json:"IngressVrfIDBW,omitempty"` EgressVrfIDBW uint32 `protobuf:"varint,2540,opt,name=EgressVrfIDBW,proto3" json:"EgressVrfIDBW,omitempty"` + // Replaced by ns values + TimeFlowStart uint64 `protobuf:"varint,2538,opt,name=TimeFlowStart,proto3" json:"TimeFlowStart,omitempty"` } func (x *EnrichedFlow) Reset() { @@ -481,6 +579,13 @@ func (x *EnrichedFlow) GetTimeReceived() uint64 { return 0 } +func (x *EnrichedFlow) GetTimeReceivedNs() uint64 { + if x != nil { + return x.TimeReceivedNs + } + return 0 +} + func (x *EnrichedFlow) GetSequenceNum() uint32 { if x != nil { return x.SequenceNum @@ -502,20 +607,27 @@ func (x *EnrichedFlow) GetFlowDirection() uint32 { return 0 } -func (x *EnrichedFlow) GetSamplerAddress() []byte { +func (x *EnrichedFlow) GetTimeFlowStartNs() uint64 { if x != nil { - return x.SamplerAddress + return x.TimeFlowStartNs } - return nil + return 0 } -func (x *EnrichedFlow) GetTimeFlowStart() uint64 { +func (x *EnrichedFlow) GetTimeFlowEndNs() uint64 { if x != nil { - return x.TimeFlowStart + return x.TimeFlowEndNs } return 0 } +func (x *EnrichedFlow) GetSamplerAddress() []byte { + if x != nil { + return x.SamplerAddress + } + return nil +} + func (x *EnrichedFlow) GetTimeFlowEnd() uint64 { if x != nil { return x.TimeFlowEnd @@ -677,6 +789,13 @@ func (x *EnrichedFlow) GetIpTtl() uint32 { return 0 } +func (x *EnrichedFlow) GetIpFlags() uint32 { + if x != nil { + return x.IpFlags + } + return 0 +} + func (x *EnrichedFlow) GetTcpFlags() uint32 { if x != nil { return x.TcpFlags @@ -789,6 +908,27 @@ func (x *EnrichedFlow) GetAsPath() []uint32 { return nil } +func (x *EnrichedFlow) GetMplsTtl() []uint32 { + if x != nil { + return x.MplsTtl + } + return nil +} + +func (x *EnrichedFlow) GetMplsLabel() []uint32 { + if x != nil { + return x.MplsLabel + } + return nil +} + +func (x *EnrichedFlow) GetMplsIp() [][]byte { + if x != nil { + return x.MplsIp + } + return nil +} + func (x *EnrichedFlow) GetHasMpls() bool { if x != nil { return x.HasMpls @@ -894,6 +1034,34 @@ func (x *EnrichedFlow) GetDstCountry() string { return "" } +func (x *EnrichedFlow) GetLayerStack() []EnrichedFlow_LayerStack { + if x != nil { + return x.LayerStack + } + return nil +} + +func (x *EnrichedFlow) GetLayerSize() []uint32 { + if x != nil { + return x.LayerSize + } + return nil +} + +func (x *EnrichedFlow) GetIpv6RoutingHeaderAddresses() [][]byte { + if x != nil { + return x.Ipv6RoutingHeaderAddresses + } + return nil +} + +func (x *EnrichedFlow) GetIpv6RoutingHeaderSegLeft() uint32 { + if x != nil { + return x.Ipv6RoutingHeaderSegLeft + } + return 0 +} + func (x *EnrichedFlow) GetPacketBytesMin() uint32 { if x != nil { return x.PacketBytesMin @@ -1363,326 +1531,384 @@ func (x *EnrichedFlow) GetEgressVrfIDBW() uint32 { return 0 } +func (x *EnrichedFlow) GetTimeFlowStart() uint64 { + if x != nil { + return x.TimeFlowStart + } + return 0 +} + var File_enrichedflow_proto protoreflect.FileDescriptor var file_enrichedflow_proto_rawDesc = []byte{ 0x0a, 0x12, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x22, 0xf5, 0x26, 0x0a, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x22, 0x9f, 0x2d, 0x0a, 0x0c, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x31, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x2a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x5f, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x73, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x4e, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, + 0x75, 0x6d, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x77, 0x5f, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, + 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x6e, 0x73, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, + 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x6e, 0x73, 0x18, + 0x70, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, + 0x6e, 0x64, 0x4e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, - 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x26, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, - 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x69, - 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6d, 0x73, 0x18, - 0x3f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x4d, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, - 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x4d, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, - 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x73, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, - 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x64, 0x73, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x74, 0x79, 0x70, 0x65, 0x18, 0x1e, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x65, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, - 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x13, 0x0a, 0x05, 0x69, 0x6e, 0x5f, 0x69, 0x66, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x69, 0x6e, 0x49, 0x66, 0x12, 0x15, 0x0a, 0x06, - 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6f, 0x75, - 0x74, 0x49, 0x66, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x1b, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, - 0x64, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, - 0x73, 0x74, 0x4d, 0x61, 0x63, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x76, 0x6c, 0x61, - 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, - 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x76, 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x76, - 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x6c, - 0x61, 0x6e, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, - 0x76, 0x72, 0x66, 0x5f, 0x69, 0x64, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x69, 0x6e, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x65, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x72, 0x66, 0x5f, 0x69, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x64, 0x12, 0x15, - 0x0a, 0x06, 0x69, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x69, 0x70, 0x54, 0x6f, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x10, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x70, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x19, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x69, 0x70, 0x54, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x63, 0x70, - 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x74, 0x63, - 0x70, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, 0x6d, 0x70, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x69, 0x70, 0x76, 0x36, 0x46, - 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x66, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x24, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x69, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x62, - 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, - 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x73, 0x72, 0x63, 0x41, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x73, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x64, 0x73, 0x74, 0x41, 0x73, 0x12, 0x19, 0x0a, 0x08, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x6e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x68, 0x6f, 0x70, 0x5f, 0x61, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, - 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6e, - 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4e, 0x65, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x06, 0x64, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x62, 0x67, 0x70, - 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0a, 0x62, 0x67, 0x70, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x62, - 0x67, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x65, - 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x62, 0x67, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x66, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x61, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, - 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x70, 0x6c, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x68, 0x61, 0x73, 0x4d, 0x70, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x70, - 0x6c, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, - 0x31, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, - 0x73, 0x31, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x31, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, - 0x73, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, - 0x32, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, - 0x73, 0x32, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x32, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, - 0x73, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, - 0x33, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, - 0x73, 0x33, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x33, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, - 0x73, 0x33, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x5f, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, - 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x74, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x6d, - 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x5f, 0x69, 0x70, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6d, 0x70, 0x6c, 0x73, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x49, 0x70, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x46, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x73, 0x72, 0x63, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xe8, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xe9, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x4d, 0x69, 0x6e, 0x18, 0xb4, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xb5, 0x10, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x4d, 0x61, 0x78, 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xb6, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, - 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, - 0x44, 0x65, 0x76, 0x18, 0xb7, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, - 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xbe, 0x10, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, - 0x69, 0x6e, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, - 0x61, 0x78, 0x18, 0xbf, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, - 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, - 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xc0, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, - 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, - 0x76, 0x18, 0xc1, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0xc8, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, - 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd2, 0x10, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0xd3, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, - 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, - 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd4, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, - 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, - 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd5, 0x10, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x23, 0x0a, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0xd6, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, - 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, - 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd8, 0x10, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x23, 0x0a, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0xd9, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0xdc, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, - 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xe6, - 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x4d, 0x61, 0x78, 0x18, 0xe7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, - 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, - 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xe8, 0x10, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2b, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xe9, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, - 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, - 0x18, 0xea, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, - 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, - 0x4d, 0x61, 0x78, 0x18, 0xeb, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, - 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, - 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xec, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, - 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, - 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xed, - 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, - 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xd0, 0x0f, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x43, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0xd1, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, - 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, - 0x64, 0x18, 0xdc, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, - 0x12, 0x17, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x18, 0xdd, 0x0f, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x72, 0x63, - 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0xf0, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, - 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, - 0x6e, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, - 0x18, 0xf1, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, - 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, - 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, - 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, - 0x18, 0xf2, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, - 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x4c, 0x65, 0x6e, 0x18, 0xf3, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, - 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, - 0x4e, 0x0a, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, - 0x6f, 0x6e, 0x18, 0xf4, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x22, 0x0a, + 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, + 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x74, + 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x73, 0x12, 0x27, + 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x5f, + 0x6d, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, + 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x4d, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x72, 0x63, 0x41, 0x64, + 0x64, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x64, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x74, 0x79, 0x70, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x65, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x13, 0x0a, 0x05, 0x69, 0x6e, 0x5f, 0x69, 0x66, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x69, 0x6e, 0x49, 0x66, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x66, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6f, 0x75, 0x74, 0x49, 0x66, 0x12, 0x17, 0x0a, 0x07, 0x73, + 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x72, + 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x12, 0x19, 0x0a, + 0x08, 0x73, 0x72, 0x63, 0x5f, 0x76, 0x6c, 0x61, 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x73, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, + 0x76, 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x56, + 0x6c, 0x61, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x76, 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x1d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x72, 0x66, 0x5f, 0x69, 0x64, 0x18, 0x27, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, + 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x72, 0x66, + 0x5f, 0x69, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x56, 0x72, 0x66, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x70, 0x5f, 0x74, 0x6f, 0x73, + 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x70, 0x54, 0x6f, 0x73, 0x12, 0x2b, 0x0a, + 0x11, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x70, + 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x70, 0x54, 0x74, + 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x70, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x26, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x69, 0x70, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x74, 0x63, 0x70, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x74, 0x63, 0x70, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, + 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, + 0x6d, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, 0x6d, 0x70, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x66, 0x6c, 0x6f, 0x77, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x69, 0x70, + 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, + 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x24, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x69, 0x5f, 0x66, 0x6c, 0x6f, 0x77, + 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0f, 0x62, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x73, 0x72, 0x63, 0x41, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, + 0x61, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x64, 0x73, 0x74, 0x41, 0x73, 0x12, + 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x6e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x5f, 0x61, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x6e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, + 0x63, 0x5f, 0x6e, 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, 0x72, 0x63, + 0x4e, 0x65, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x74, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x64, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0c, + 0x62, 0x67, 0x70, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x64, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x67, 0x70, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x27, + 0x0a, 0x0f, 0x62, 0x67, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x62, 0x67, 0x70, 0x43, 0x6f, 0x6d, 0x6d, + 0x75, 0x6e, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x73, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x61, 0x73, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x50, 0x20, 0x03, + 0x28, 0x0d, 0x52, 0x07, 0x6d, 0x70, 0x6c, 0x73, 0x54, 0x74, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x51, 0x20, 0x03, 0x28, 0x0d, 0x52, + 0x09, 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x70, + 0x6c, 0x73, 0x5f, 0x69, 0x70, 0x18, 0x52, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x06, 0x6d, 0x70, 0x6c, + 0x73, 0x49, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x70, 0x6c, 0x73, 0x18, + 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x4d, 0x70, 0x6c, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x36, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x70, 0x6c, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, + 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x31, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x37, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, 0x73, 0x31, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, + 0x70, 0x6c, 0x73, 0x5f, 0x31, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, + 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x32, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, 0x73, 0x32, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, + 0x70, 0x6c, 0x73, 0x5f, 0x32, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, + 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x33, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3b, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, 0x73, 0x33, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, + 0x70, 0x6c, 0x73, 0x5f, 0x33, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x33, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, + 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x74, + 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x70, 0x6c, 0x73, + 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x70, 0x6c, + 0x73, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x69, 0x70, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0b, 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x49, 0x70, 0x12, 0x32, 0x0a, + 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x49, + 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x72, 0x63, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x73, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x40, 0x0a, 0x0b, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x67, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x66, + 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, + 0x6f, 0x77, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x0a, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x68, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x09, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x41, 0x0a, 0x1d, 0x69, 0x70, 0x76, 0x36, + 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x69, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x1a, 0x69, 0x70, 0x76, 0x36, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x69, + 0x70, 0x76, 0x36, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x67, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x6a, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x18, 0x69, 0x70, 0x76, 0x36, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x53, 0x65, 0x67, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x18, 0xb4, 0x10, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xb5, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x12, 0x29, 0x0a, + 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, + 0x18, 0xb6, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xb7, 0x10, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xbe, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x12, 0x23, 0x0a, 0x0c, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, 0x18, 0xbf, 0x10, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, + 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, + 0x61, 0x6e, 0x18, 0xc0, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xc1, 0x10, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, + 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x18, 0xc8, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, + 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd2, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x46, + 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x53, + 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd3, 0x10, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0xd4, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd5, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x53, + 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x41, 0x43, + 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd6, 0x10, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0xd7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd8, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x43, 0x57, 0x52, + 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x45, 0x43, 0x45, + 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd9, 0x10, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, + 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x18, 0xdc, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xe6, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x25, + 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x18, + 0xe7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xe8, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, + 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2b, + 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, + 0x65, 0x76, 0x18, 0xe9, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x54, + 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xea, 0x10, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x21, + 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x18, 0xeb, 0x10, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, + 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, + 0x6e, 0x18, 0xec, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, + 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, + 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xed, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, + 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xd0, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x43, + 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, + 0xd1, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x18, 0xdc, 0x0f, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x06, 0x44, 0x73, + 0x74, 0x43, 0x69, 0x64, 0x18, 0xdd, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x44, 0x73, 0x74, + 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, + 0x6f, 0x6e, 0x18, 0xf0, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, - 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, - 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, - 0x4d, 0x0a, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, - 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x4c, 0x65, 0x6e, 0x18, 0xf5, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, + 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, + 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0b, 0x44, + 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0xf1, 0x10, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, + 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, + 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, + 0x6e, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0xf2, 0x10, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, + 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0xf3, 0x10, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x4e, 0x0a, 0x0f, 0x53, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0xf4, 0x10, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, + 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, + 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x11, - 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0xfc, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x4d, 0x65, - 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x18, 0xfd, - 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, - 0x12, 0x56, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0xfe, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, - 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, - 0x77, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xda, 0x0f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x23, 0x0a, 0x0c, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x18, - 0xde, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x72, 0x79, 0x42, 0x57, 0x12, 0x23, 0x0a, 0x0c, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x72, 0x79, 0x42, 0x57, 0x18, 0xdf, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x44, 0x73, 0x74, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x12, 0x44, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, - 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0xd2, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x18, 0xf5, + 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x46, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, + 0x48, 0x6f, 0x70, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0xf6, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, - 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, - 0x1d, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xd9, 0x0f, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, - 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xdb, 0x0f, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, - 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x84, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x48, - 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, - 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x85, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, - 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x4e, 0x65, - 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x86, 0x11, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x87, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x88, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x89, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, - 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x53, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x8a, 0x11, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0xd3, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, - 0x63, 0x18, 0xd4, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, - 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, - 0x64, 0x18, 0xd5, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, - 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0xd6, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, - 0x18, 0xd7, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, - 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, - 0x18, 0xd8, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xe0, 0x0f, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x50, 0x18, 0xf2, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x18, 0xf3, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, - 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x18, 0xf4, 0x11, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x18, 0xf5, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x18, 0xf6, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x18, 0xf7, 0x11, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, - 0x49, 0x44, 0x42, 0x57, 0x18, 0xeb, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x49, 0x6e, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x12, 0x25, 0x0a, 0x0d, 0x45, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x18, 0xec, 0x13, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, - 0x42, 0x57, 0x22, 0x5d, 0x0a, 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, + 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x6e, 0x6f, 0x6e, + 0x12, 0x45, 0x0a, 0x1d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x6e, 0x6f, 0x6e, 0x50, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, + 0x6e, 0x18, 0xf7, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, + 0x70, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x11, 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0xfc, + 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x4d, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x18, 0xfd, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x12, 0x56, 0x0a, 0x10, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xfe, 0x10, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, + 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x18, 0xda, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0c, 0x53, 0x72, 0x63, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x18, 0xde, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x12, 0x23, 0x0a, + 0x0c, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x18, 0xdf, 0x0f, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, + 0x42, 0x57, 0x12, 0x44, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x18, 0xd2, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, + 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x4e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x4e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xd9, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xdb, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, + 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, + 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, + 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x84, 0x11, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x85, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x86, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4e, + 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x87, 0x11, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x88, 0x11, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0d, + 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x89, 0x11, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x8a, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x53, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xd3, 0x0f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x18, 0xd4, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, + 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0xd5, 0x0f, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, + 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xd6, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, + 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x18, 0xd7, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x44, + 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0xd8, 0x0f, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x13, 0x0a, 0x04, + 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xe0, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x74, + 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x18, 0xf2, 0x11, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x25, + 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x18, + 0xf3, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, + 0x49, 0x50, 0x18, 0xf4, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, + 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, + 0x50, 0x18, 0xf5, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, + 0x18, 0xf6, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, + 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x41, 0x43, 0x18, 0xf7, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x44, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x49, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x18, 0xeb, 0x13, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, + 0x49, 0x44, 0x42, 0x57, 0x12, 0x25, 0x0a, 0x0d, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, + 0x66, 0x49, 0x44, 0x42, 0x57, 0x18, 0xec, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x45, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x12, 0x25, 0x0a, 0x0d, 0x54, + 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0xea, 0x13, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x22, 0x5d, 0x0a, 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4c, 0x4f, 0x57, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x35, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x35, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x39, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x50, 0x46, 0x49, 0x58, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x42, 0x50, 0x46, 0x10, - 0x05, 0x22, 0x32, 0x0a, 0x0e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, - 0x69, 0x7a, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, - 0x50, 0x41, 0x4e, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, - 0x64, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x03, - 0x22, 0x21, 0x0a, 0x0e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x65, - 0x73, 0x10, 0x01, 0x22, 0x2f, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, - 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, - 0x73, 0x74, 0x10, 0x02, 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x62, 0x77, 0x4e, 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, 0x6c, 0x6f, - 0x77, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x66, 0x6c, 0x6f, - 0x77, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x05, 0x22, 0xc7, 0x01, 0x0a, 0x0a, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x49, 0x50, 0x76, 0x34, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x50, 0x76, 0x36, + 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x55, + 0x44, 0x50, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x50, 0x4c, 0x53, 0x10, 0x05, 0x12, 0x09, + 0x0a, 0x05, 0x44, 0x6f, 0x74, 0x31, 0x51, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x43, 0x4d, + 0x50, 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x43, 0x4d, 0x50, 0x76, 0x36, 0x10, 0x08, 0x12, + 0x07, 0x0a, 0x03, 0x47, 0x52, 0x45, 0x10, 0x09, 0x12, 0x15, 0x0a, 0x11, 0x49, 0x50, 0x76, 0x36, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x0a, 0x12, + 0x16, 0x0a, 0x12, 0x49, 0x50, 0x76, 0x36, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x10, 0x0b, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x65, 0x6e, 0x65, 0x76, + 0x65, 0x10, 0x0c, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x65, 0x72, 0x65, 0x64, 0x6f, 0x10, 0x0d, 0x12, + 0x0a, 0x0a, 0x06, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x10, 0x63, 0x22, 0x32, 0x0a, 0x0e, 0x41, + 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, + 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x50, 0x41, 0x4e, 0x10, 0x01, 0x22, + 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x01, 0x12, + 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x03, 0x22, 0x21, 0x0a, 0x0e, 0x4e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x06, 0x0a, 0x02, + 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x65, 0x73, 0x10, 0x01, 0x22, 0x2f, 0x0a, + 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, + 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x73, 0x74, 0x10, 0x02, 0x42, 0x2d, + 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x77, 0x4e, + 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1697,29 +1923,32 @@ func file_enrichedflow_proto_rawDescGZIP() []byte { return file_enrichedflow_proto_rawDescData } -var file_enrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_enrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 6) var file_enrichedflow_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_enrichedflow_proto_goTypes = []any{ (EnrichedFlow_FlowType)(0), // 0: flowpb.EnrichedFlow.FlowType - (EnrichedFlow_AnonymizedType)(0), // 1: flowpb.EnrichedFlow.AnonymizedType - (EnrichedFlow_ValidationStatusType)(0), // 2: flowpb.EnrichedFlow.ValidationStatusType - (EnrichedFlow_NormalizedType)(0), // 3: flowpb.EnrichedFlow.NormalizedType - (EnrichedFlow_RemoteAddrType)(0), // 4: flowpb.EnrichedFlow.RemoteAddrType - (*EnrichedFlow)(nil), // 5: flowpb.EnrichedFlow + (EnrichedFlow_LayerStack)(0), // 1: flowpb.EnrichedFlow.LayerStack + (EnrichedFlow_AnonymizedType)(0), // 2: flowpb.EnrichedFlow.AnonymizedType + (EnrichedFlow_ValidationStatusType)(0), // 3: flowpb.EnrichedFlow.ValidationStatusType + (EnrichedFlow_NormalizedType)(0), // 4: flowpb.EnrichedFlow.NormalizedType + (EnrichedFlow_RemoteAddrType)(0), // 5: flowpb.EnrichedFlow.RemoteAddrType + (*EnrichedFlow)(nil), // 6: flowpb.EnrichedFlow } var file_enrichedflow_proto_depIdxs = []int32{ 0, // 0: flowpb.EnrichedFlow.type:type_name -> flowpb.EnrichedFlow.FlowType - 1, // 1: flowpb.EnrichedFlow.SrcAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType - 1, // 2: flowpb.EnrichedFlow.DstAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType - 1, // 3: flowpb.EnrichedFlow.SamplerAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType - 2, // 4: flowpb.EnrichedFlow.ValidationStatus:type_name -> flowpb.EnrichedFlow.ValidationStatusType - 3, // 5: flowpb.EnrichedFlow.Normalized:type_name -> flowpb.EnrichedFlow.NormalizedType - 4, // 6: flowpb.EnrichedFlow.RemoteAddr:type_name -> flowpb.EnrichedFlow.RemoteAddrType - 7, // [7:7] is the sub-list for method output_type - 7, // [7:7] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 1, // 1: flowpb.EnrichedFlow.layer_stack:type_name -> flowpb.EnrichedFlow.LayerStack + 2, // 2: flowpb.EnrichedFlow.SrcAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType + 2, // 3: flowpb.EnrichedFlow.DstAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType + 2, // 4: flowpb.EnrichedFlow.SamplerAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType + 2, // 5: flowpb.EnrichedFlow.NextHopAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType + 3, // 6: flowpb.EnrichedFlow.ValidationStatus:type_name -> flowpb.EnrichedFlow.ValidationStatusType + 4, // 7: flowpb.EnrichedFlow.Normalized:type_name -> flowpb.EnrichedFlow.NormalizedType + 5, // 8: flowpb.EnrichedFlow.RemoteAddr:type_name -> flowpb.EnrichedFlow.RemoteAddrType + 9, // [9:9] is the sub-list for method output_type + 9, // [9:9] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_enrichedflow_proto_init() } @@ -1732,7 +1961,7 @@ func file_enrichedflow_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_enrichedflow_proto_rawDesc, - NumEnums: 5, + NumEnums: 6, NumMessages: 1, NumExtensions: 0, NumServices: 0, diff --git a/pb/enrichedflow.proto b/pb/enrichedflow.proto index 70b78dc..fe9d911 100644 --- a/pb/enrichedflow.proto +++ b/pb/enrichedflow.proto @@ -16,16 +16,18 @@ message EnrichedFlow { FlowType type = 1; uint64 time_received = 2; + uint64 time_received_ns = 110; uint32 sequence_num = 4; uint64 sampling_rate = 3; uint32 flow_direction = 42; + uint64 time_flow_start_ns = 111; + uint64 time_flow_end_ns = 112; // Sampler information bytes sampler_address = 11; // Found inside packet - uint64 time_flow_start = 38; uint64 time_flow_end = 5; uint64 time_flow_start_ms = 63; uint64 time_flow_end_ms = 64; @@ -70,6 +72,7 @@ message EnrichedFlow { uint32 ip_tos = 23; uint32 forwarding_status = 24; uint32 ip_ttl = 25; + uint32 ip_flags = 38; uint32 tcp_flags = 26; uint32 icmp_type = 31; uint32 icmp_code = 32; @@ -96,6 +99,9 @@ message EnrichedFlow { repeated uint32 as_path = 102; // MPLS information + repeated uint32 mpls_ttl = 80; + repeated uint32 mpls_label = 81; + repeated bytes mpls_ip = 82; bool has_mpls = 53; uint32 mpls_count = 54; uint32 mpls_1_ttl = 55; // First TTL @@ -114,6 +120,31 @@ message EnrichedFlow { string src_country = 1000; string dst_country = 1001; + // Encapsulation + enum LayerStack { + Ethernet = 0; + IPv4 = 1; + IPv6 = 2; + TCP = 3; + UDP = 4; + MPLS = 5; + Dot1Q = 6; + ICMP = 7; + ICMPv6 = 8; + GRE = 9; + IPv6HeaderRouting = 10; + IPv6HeaderFragment = 11; + Geneve = 12; + Teredo = 13; + Custom = 99; + // todo: add nsh + } + repeated LayerStack layer_stack = 103; + repeated uint32 layer_size = 104; + + repeated bytes ipv6_routing_header_addresses = 105; // SRv6 + uint32 ipv6_routing_header_seg_left = 106; // SRv6 + // bwNET custom fields: // input/bpf: @@ -242,6 +273,7 @@ uint32 IngressVrfIDBW = 2539; uint32 EgressVrfIDBW = 2540; // Replaced by ns values -// uint64 TimeFlowStart = 2538; +uint64 TimeFlowStart = 2538; // uint64 TimeFlowEnd = 2505; +// Kept for legacy support } \ No newline at end of file diff --git a/pb/legacyconverter.go b/pb/legacyconverter.go new file mode 100644 index 0000000..eb24cc4 --- /dev/null +++ b/pb/legacyconverter.go @@ -0,0 +1,294 @@ +package pb + +import "math" + +func (legacy *LegacyEnrichedFlow) ConvertToEnrichedFlow() *EnrichedFlow { + enrichedFlow := EnrichedFlow{ + Type: EnrichedFlow_FlowType(legacy.Type), + TimeReceived: legacy.TimeReceived, + SequenceNum: legacy.SequenceNum, + SamplingRate: legacy.SamplingRate, + FlowDirection: legacy.FlowDirection, + SamplerAddress: legacy.SamplerAddress, + TimeFlowStart: legacy.TimeFlowStart, + TimeFlowEnd: legacy.TimeFlowEnd, + Bytes: legacy.Bytes, + Packets: legacy.Packets, + SrcAddr: legacy.SrcAddr, + DstAddr: legacy.DstAddr, + Etype: legacy.Etype, + Proto: legacy.Proto, + SrcPort: legacy.SrcPort, + DstPort: legacy.DstPort, + InIf: legacy.InIf, + OutIf: legacy.OutIf, + SrcMac: legacy.SrcMac, + DstMac: legacy.DstMac, + SrcVlan: legacy.SrcVlan, + DstVlan: legacy.DstVlan, + VlanId: legacy.VlanId, + IngressVrfId: legacy.IngressVrfID, + EgressVrfId: legacy.EgressVrfID, + IpTos: legacy.IPTos, + ForwardingStatus: legacy.ForwardingStatus, + IpTtl: legacy.IPTTL, + TcpFlags: legacy.TCPFlags, + IcmpType: legacy.IcmpType, + IcmpCode: legacy.IcmpCode, + Ipv6FlowLabel: legacy.IPv6FlowLabel, + FragmentId: legacy.FragmentId, + FragmentOffset: legacy.FragmentOffset, + BiFlowDirection: legacy.BiFlowDirection, + SrcAs: legacy.SrcAS, + DstAs: legacy.DstAS, + NextHop: legacy.NextHop, + NextHopAs: legacy.NextHopAS, + SrcNet: legacy.SrcNet, + DstNet: legacy.DstNet, + HasMpls: legacy.HasMPLS, + MplsCount: legacy.MPLSCount, + Mpls_1Ttl: legacy.MPLS1TTL, + Mpls_1Label: legacy.MPLS1Label, + Mpls_2Ttl: legacy.MPLS2TTL, + Mpls_2Label: legacy.MPLS2Label, + Mpls_3Ttl: legacy.MPLS3TTL, + Mpls_3Label: legacy.MPLS3Label, + MplsLastTtl: legacy.MPLSLastTTL, + MplsLastLabel: legacy.MPLSLastLabel, + SrcCountry: legacy.SrcCountry, + DstCountry: legacy.DstCountry, + + AsPath: legacy.ASPath, + //state: legacy.state, + sizeCache: legacy.sizeCache, + unknownFields: legacy.unknownFields, + PacketBytesMin: legacy.PacketBytesMin, + PacketBytesMax: legacy.PacketBytesMax, + PacketBytesMean: legacy.PacketBytesMean, + PacketBytesStdDev: legacy.PacketBytesStdDev, + PacketIATMin: legacy.PacketIATMin, + PacketIATMax: legacy.PacketIATMax, + PacketIATMean: legacy.PacketIATMean, + PacketIATStdDev: legacy.PacketIATStdDev, + HeaderBytes: legacy.HeaderBytes, + FINFlagCount: legacy.FINFlagCount, + SYNFlagCount: legacy.SYNFlagCount, + RSTFlagCount: legacy.RSTFlagCount, + PSHFlagCount: legacy.PSHFlagCount, + ACKFlagCount: legacy.ACKFlagCount, + URGFlagCount: legacy.URGFlagCount, + CWRFlagCount: legacy.CWRFlagCount, + ECEFlagCount: legacy.ECEFlagCount, + PayloadPackets: legacy.PayloadPackets, + TimeActiveMin: legacy.TimeActiveMin, + TimeActiveMax: legacy.TimeActiveMax, + TimeActiveMean: legacy.TimeActiveMean, + TimeActiveStdDev: legacy.TimeActiveStdDev, + TimeIdleMin: legacy.TimeIdleMin, + TimeIdleMax: legacy.TimeIdleMax, + TimeIdleMean: legacy.TimeIdleMean, + TimeIdleStdDev: legacy.TimeIdleStdDev, + Cid: legacy.Cid, + CidString: legacy.CidString, + SrcCid: legacy.SrcCid, + DstCid: legacy.DstCid, + SrcAddrAnon: EnrichedFlow_AnonymizedType(legacy.SrcAddrAnon), + DstAddrAnon: EnrichedFlow_AnonymizedType(legacy.DstAddrAnon), + SrcAddrPreservedLen: legacy.SrcAddrPreservedLen, + DstAddrPreservedLen: legacy.DstAddrPreservedLen, + SamplerAddrAnon: EnrichedFlow_AnonymizedType(legacy.SamplerAddrAnon), + SamplerAddrAnonPreservedPrefixLen: legacy.SamplerAddrAnonPreservedPrefixLen, + Med: legacy.Med, + LocalPref: legacy.LocalPref, + ValidationStatus: EnrichedFlow_ValidationStatusType(legacy.ValidationStatus), + RemoteCountry: legacy.RemoteCountry, + Normalized: EnrichedFlow_NormalizedType(legacy.Normalized), + ProtoName: legacy.ProtoName, + RemoteAddr: EnrichedFlow_RemoteAddrType(legacy.RemoteAddr), + SrcHostName: legacy.SrcHostName, + DstHostName: legacy.DstHostName, + NextHopHostName: legacy.NextHopHostName, + SrcASName: legacy.SrcASName, + DstASName: legacy.DstASName, + NextHopASName: legacy.NextHopASName, + SamplerHostName: legacy.SamplerHostName, + SrcIfName: legacy.SrcIfName, + SrcIfDesc: legacy.SrcIfDesc, + SrcIfSpeed: legacy.SrcIfSpeed, + DstIfName: legacy.DstIfName, + DstIfDesc: legacy.DstIfDesc, + DstIfSpeed: legacy.DstIfSpeed, + Note: legacy.Note, + SourceIP: legacy.SourceIP, + DestinationIP: legacy.DestinationIP, + NextHopIP: legacy.NextHopIP, + SamplerIP: legacy.SamplerIP, + SourceMAC: legacy.SourceMAC, + DestinationMAC: legacy.DestinationMAC, + } + enrichedFlow.SyncMissingTimeStamps() + return &enrichedFlow +} + +func (flow *EnrichedFlow) ConvertToLegacyEnrichedFlow() *LegacyEnrichedFlow { + flow.SyncMissingTimeStamps() + + legacyFlow := LegacyEnrichedFlow{ + Type: LegacyEnrichedFlow_FlowType(flow.Type), + TimeReceived: flow.TimeReceived, + SequenceNum: flow.SequenceNum, + SamplingRate: flow.SamplingRate, + FlowDirection: flow.FlowDirection, + SamplerAddress: flow.SamplerAddress, + Bytes: flow.Bytes, + Packets: flow.Packets, + SrcAddr: flow.SrcAddr, + DstAddr: flow.DstAddr, + Etype: flow.Etype, + Proto: flow.Proto, + SrcPort: flow.SrcPort, + DstPort: flow.DstPort, + InIf: flow.InIf, + OutIf: flow.OutIf, + SrcMac: flow.SrcMac, + DstMac: flow.DstMac, + SrcVlan: flow.SrcVlan, + DstVlan: flow.DstVlan, + VlanId: flow.VlanId, + IngressVrfID: flow.IngressVrfId, + EgressVrfID: flow.EgressVrfId, + IPTos: flow.IpTos, + ForwardingStatus: flow.ForwardingStatus, + IPTTL: flow.IpTtl, + TCPFlags: flow.TcpFlags, + IcmpType: flow.IcmpType, + IcmpCode: flow.IcmpCode, + IPv6FlowLabel: flow.Ipv6FlowLabel, + FragmentId: flow.FragmentId, + FragmentOffset: flow.FragmentOffset, + BiFlowDirection: flow.BiFlowDirection, + SrcAS: flow.SrcAs, + DstAS: flow.DstAs, + NextHop: flow.NextHop, + NextHopAS: flow.NextHopAs, + SrcNet: flow.SrcNet, + DstNet: flow.DstNet, + HasMPLS: flow.HasMpls, + MPLSCount: flow.MplsCount, + MPLS1TTL: flow.Mpls_1Ttl, + MPLS1Label: flow.Mpls_1Label, + MPLS2TTL: flow.Mpls_2Ttl, + MPLS2Label: flow.Mpls_2Label, + MPLS3TTL: flow.Mpls_3Ttl, + MPLS3Label: flow.Mpls_3Label, + MPLSLastTTL: flow.MplsLastTtl, + MPLSLastLabel: flow.MplsLastLabel, + SrcCountry: flow.SrcCountry, + DstCountry: flow.DstCountry, + + TimeFlowStart: flow.TimeFlowStart, + TimeFlowEnd: flow.TimeFlowStart, + + ASPath: flow.AsPath, + sizeCache: flow.sizeCache, + unknownFields: flow.unknownFields, + PacketBytesMin: flow.PacketBytesMin, + PacketBytesMax: flow.PacketBytesMax, + PacketBytesMean: flow.PacketBytesMean, + PacketBytesStdDev: flow.PacketBytesStdDev, + PacketIATMin: flow.PacketIATMin, + PacketIATMax: flow.PacketIATMax, + PacketIATMean: flow.PacketIATMean, + PacketIATStdDev: flow.PacketIATStdDev, + HeaderBytes: flow.HeaderBytes, + FINFlagCount: flow.FINFlagCount, + SYNFlagCount: flow.SYNFlagCount, + RSTFlagCount: flow.RSTFlagCount, + PSHFlagCount: flow.PSHFlagCount, + ACKFlagCount: flow.ACKFlagCount, + URGFlagCount: flow.URGFlagCount, + CWRFlagCount: flow.CWRFlagCount, + ECEFlagCount: flow.ECEFlagCount, + PayloadPackets: flow.PayloadPackets, + TimeActiveMin: flow.TimeActiveMin, + TimeActiveMax: flow.TimeActiveMax, + TimeActiveMean: flow.TimeActiveMean, + TimeActiveStdDev: flow.TimeActiveStdDev, + TimeIdleMin: flow.TimeIdleMin, + TimeIdleMax: flow.TimeIdleMax, + TimeIdleMean: flow.TimeIdleMean, + TimeIdleStdDev: flow.TimeIdleStdDev, + Cid: flow.Cid, + CidString: flow.CidString, + SrcCid: flow.SrcCid, + DstCid: flow.DstCid, + SrcAddrAnon: LegacyEnrichedFlow_AnonymizedType(flow.SrcAddrAnon), + DstAddrAnon: LegacyEnrichedFlow_AnonymizedType(flow.DstAddrAnon), + SrcAddrPreservedLen: flow.SrcAddrPreservedLen, + DstAddrPreservedLen: flow.DstAddrPreservedLen, + SamplerAddrAnon: LegacyEnrichedFlow_AnonymizedType(flow.SamplerAddrAnon), + SamplerAddrAnonPreservedPrefixLen: flow.SamplerAddrAnonPreservedPrefixLen, + Med: flow.Med, + LocalPref: flow.LocalPref, + ValidationStatus: LegacyEnrichedFlow_ValidationStatusType(flow.ValidationStatus), + RemoteCountry: flow.RemoteCountry, + Normalized: LegacyEnrichedFlow_NormalizedType(flow.Normalized), + ProtoName: flow.ProtoName, + RemoteAddr: LegacyEnrichedFlow_RemoteAddrType(flow.RemoteAddr), + SrcHostName: flow.SrcHostName, + DstHostName: flow.DstHostName, + NextHopHostName: flow.NextHopHostName, + SrcASName: flow.SrcASName, + DstASName: flow.DstASName, + NextHopASName: flow.NextHopASName, + SamplerHostName: flow.SamplerHostName, + SrcIfName: flow.SrcIfName, + SrcIfDesc: flow.SrcIfDesc, + SrcIfSpeed: flow.SrcIfSpeed, + DstIfName: flow.DstIfName, + DstIfDesc: flow.DstIfDesc, + DstIfSpeed: flow.DstIfSpeed, + Note: flow.Note, + SourceIP: flow.SourceIP, + DestinationIP: flow.DestinationIP, + NextHopIP: flow.NextHopIP, + SamplerIP: flow.SamplerIP, + SourceMAC: flow.SourceMAC, + DestinationMAC: flow.DestinationMAC, + } + return &legacyFlow + +} + +func (flow *EnrichedFlow) SyncMissingTimeStamps() { + fillTimeIfEmptyWithFallback(&flow.TimeFlowEnd, &flow.TimeFlowEndNs, 1e-9, &flow.TimeFlowEndMs, 1e-3) + fillTimeIfEmptyWithFallback(&flow.TimeFlowEndMs, &flow.TimeFlowEndNs, 1e-6, &flow.TimeFlowEnd, 1e3) + fillTimeIfEmptyWithFallback(&flow.TimeFlowEndNs, &flow.TimeFlowEndMs, 1e6, &flow.TimeFlowEnd, 1e9) + + fillTimeIfEmptyWithFallback(&flow.TimeFlowStart, &flow.TimeFlowStartNs, 1e-9, &flow.TimeFlowStartMs, 1e-3) + fillTimeIfEmptyWithFallback(&flow.TimeFlowStartMs, &flow.TimeFlowStartNs, 1e-6, &flow.TimeFlowStart, 1e3) + fillTimeIfEmptyWithFallback(&flow.TimeFlowStartNs, &flow.TimeFlowStartMs, 1e6, &flow.TimeFlowStart, 1e9) + + fillTimeIfEmpty(&flow.TimeReceived, &flow.TimeReceivedNs, 1e-9) + fillTimeIfEmpty(&flow.TimeReceivedNs, &flow.TimeReceived, 1e9) +} + +/** +** Fills time1 with the value of time2 using factor12 and time3 as fallback if time2 is empty +**/ +func fillTimeIfEmptyWithFallback(time1 *uint64, time2 *uint64, factor12 float64, time3 *uint64, factor13 float64) { + fillTimeIfEmpty(time1, time2, factor12) + fillTimeIfEmpty(time1, time3, factor13) +} + +/** +** Fills time1 with the value of time2 using factor12 +**/ +func fillTimeIfEmpty(time1 *uint64, time2 *uint64, factor12 float64) { + if *time1 != 0 { + return + } + if *time2 != 0 { + *time1 = uint64(math.Round(float64(*time2) * factor12)) + } +} diff --git a/pb/legacyenrichedflow.pb.go b/pb/legacyenrichedflow.pb.go new file mode 100644 index 0000000..6764dc7 --- /dev/null +++ b/pb/legacyenrichedflow.pb.go @@ -0,0 +1,1630 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.1 +// protoc v3.21.12 +// source: legacyenrichedflow.proto + +package pb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type LegacyEnrichedFlow_FlowType int32 + +const ( + LegacyEnrichedFlow_FLOWUNKNOWN LegacyEnrichedFlow_FlowType = 0 + LegacyEnrichedFlow_SFLOW_5 LegacyEnrichedFlow_FlowType = 1 + LegacyEnrichedFlow_NETFLOW_V5 LegacyEnrichedFlow_FlowType = 2 + LegacyEnrichedFlow_NETFLOW_V9 LegacyEnrichedFlow_FlowType = 3 + LegacyEnrichedFlow_IPFIX LegacyEnrichedFlow_FlowType = 4 + LegacyEnrichedFlow_EBPF LegacyEnrichedFlow_FlowType = 5 +) + +// Enum value maps for LegacyEnrichedFlow_FlowType. +var ( + LegacyEnrichedFlow_FlowType_name = map[int32]string{ + 0: "FLOWUNKNOWN", + 1: "SFLOW_5", + 2: "NETFLOW_V5", + 3: "NETFLOW_V9", + 4: "IPFIX", + 5: "EBPF", + } + LegacyEnrichedFlow_FlowType_value = map[string]int32{ + "FLOWUNKNOWN": 0, + "SFLOW_5": 1, + "NETFLOW_V5": 2, + "NETFLOW_V9": 3, + "IPFIX": 4, + "EBPF": 5, + } +) + +func (x LegacyEnrichedFlow_FlowType) Enum() *LegacyEnrichedFlow_FlowType { + p := new(LegacyEnrichedFlow_FlowType) + *p = x + return p +} + +func (x LegacyEnrichedFlow_FlowType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LegacyEnrichedFlow_FlowType) Descriptor() protoreflect.EnumDescriptor { + return file_legacyenrichedflow_proto_enumTypes[0].Descriptor() +} + +func (LegacyEnrichedFlow_FlowType) Type() protoreflect.EnumType { + return &file_legacyenrichedflow_proto_enumTypes[0] +} + +func (x LegacyEnrichedFlow_FlowType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LegacyEnrichedFlow_FlowType.Descriptor instead. +func (LegacyEnrichedFlow_FlowType) EnumDescriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0, 0} +} + +// modify/anonymize +type LegacyEnrichedFlow_AnonymizedType int32 + +const ( + LegacyEnrichedFlow_NotAnonymized LegacyEnrichedFlow_AnonymizedType = 0 + LegacyEnrichedFlow_CryptoPAN LegacyEnrichedFlow_AnonymizedType = 1 +) + +// Enum value maps for LegacyEnrichedFlow_AnonymizedType. +var ( + LegacyEnrichedFlow_AnonymizedType_name = map[int32]string{ + 0: "NotAnonymized", + 1: "CryptoPAN", + } + LegacyEnrichedFlow_AnonymizedType_value = map[string]int32{ + "NotAnonymized": 0, + "CryptoPAN": 1, + } +) + +func (x LegacyEnrichedFlow_AnonymizedType) Enum() *LegacyEnrichedFlow_AnonymizedType { + p := new(LegacyEnrichedFlow_AnonymizedType) + *p = x + return p +} + +func (x LegacyEnrichedFlow_AnonymizedType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LegacyEnrichedFlow_AnonymizedType) Descriptor() protoreflect.EnumDescriptor { + return file_legacyenrichedflow_proto_enumTypes[1].Descriptor() +} + +func (LegacyEnrichedFlow_AnonymizedType) Type() protoreflect.EnumType { + return &file_legacyenrichedflow_proto_enumTypes[1] +} + +func (x LegacyEnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LegacyEnrichedFlow_AnonymizedType.Descriptor instead. +func (LegacyEnrichedFlow_AnonymizedType) EnumDescriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0, 1} +} + +type LegacyEnrichedFlow_ValidationStatusType int32 + +const ( + LegacyEnrichedFlow_Unknown LegacyEnrichedFlow_ValidationStatusType = 0 + LegacyEnrichedFlow_Valid LegacyEnrichedFlow_ValidationStatusType = 1 + LegacyEnrichedFlow_NotFound LegacyEnrichedFlow_ValidationStatusType = 2 + LegacyEnrichedFlow_Invalid LegacyEnrichedFlow_ValidationStatusType = 3 +) + +// Enum value maps for LegacyEnrichedFlow_ValidationStatusType. +var ( + LegacyEnrichedFlow_ValidationStatusType_name = map[int32]string{ + 0: "Unknown", + 1: "Valid", + 2: "NotFound", + 3: "Invalid", + } + LegacyEnrichedFlow_ValidationStatusType_value = map[string]int32{ + "Unknown": 0, + "Valid": 1, + "NotFound": 2, + "Invalid": 3, + } +) + +func (x LegacyEnrichedFlow_ValidationStatusType) Enum() *LegacyEnrichedFlow_ValidationStatusType { + p := new(LegacyEnrichedFlow_ValidationStatusType) + *p = x + return p +} + +func (x LegacyEnrichedFlow_ValidationStatusType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LegacyEnrichedFlow_ValidationStatusType) Descriptor() protoreflect.EnumDescriptor { + return file_legacyenrichedflow_proto_enumTypes[2].Descriptor() +} + +func (LegacyEnrichedFlow_ValidationStatusType) Type() protoreflect.EnumType { + return &file_legacyenrichedflow_proto_enumTypes[2] +} + +func (x LegacyEnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LegacyEnrichedFlow_ValidationStatusType.Descriptor instead. +func (LegacyEnrichedFlow_ValidationStatusType) EnumDescriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0, 2} +} + +// modify/normalize +type LegacyEnrichedFlow_NormalizedType int32 + +const ( + LegacyEnrichedFlow_No LegacyEnrichedFlow_NormalizedType = 0 + LegacyEnrichedFlow_Yes LegacyEnrichedFlow_NormalizedType = 1 +) + +// Enum value maps for LegacyEnrichedFlow_NormalizedType. +var ( + LegacyEnrichedFlow_NormalizedType_name = map[int32]string{ + 0: "No", + 1: "Yes", + } + LegacyEnrichedFlow_NormalizedType_value = map[string]int32{ + "No": 0, + "Yes": 1, + } +) + +func (x LegacyEnrichedFlow_NormalizedType) Enum() *LegacyEnrichedFlow_NormalizedType { + p := new(LegacyEnrichedFlow_NormalizedType) + *p = x + return p +} + +func (x LegacyEnrichedFlow_NormalizedType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LegacyEnrichedFlow_NormalizedType) Descriptor() protoreflect.EnumDescriptor { + return file_legacyenrichedflow_proto_enumTypes[3].Descriptor() +} + +func (LegacyEnrichedFlow_NormalizedType) Type() protoreflect.EnumType { + return &file_legacyenrichedflow_proto_enumTypes[3] +} + +func (x LegacyEnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LegacyEnrichedFlow_NormalizedType.Descriptor instead. +func (LegacyEnrichedFlow_NormalizedType) EnumDescriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0, 3} +} + +// modify/remoteaddress +type LegacyEnrichedFlow_RemoteAddrType int32 + +const ( + LegacyEnrichedFlow_Neither LegacyEnrichedFlow_RemoteAddrType = 0 + LegacyEnrichedFlow_Src LegacyEnrichedFlow_RemoteAddrType = 1 + LegacyEnrichedFlow_Dst LegacyEnrichedFlow_RemoteAddrType = 2 +) + +// Enum value maps for LegacyEnrichedFlow_RemoteAddrType. +var ( + LegacyEnrichedFlow_RemoteAddrType_name = map[int32]string{ + 0: "Neither", + 1: "Src", + 2: "Dst", + } + LegacyEnrichedFlow_RemoteAddrType_value = map[string]int32{ + "Neither": 0, + "Src": 1, + "Dst": 2, + } +) + +func (x LegacyEnrichedFlow_RemoteAddrType) Enum() *LegacyEnrichedFlow_RemoteAddrType { + p := new(LegacyEnrichedFlow_RemoteAddrType) + *p = x + return p +} + +func (x LegacyEnrichedFlow_RemoteAddrType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LegacyEnrichedFlow_RemoteAddrType) Descriptor() protoreflect.EnumDescriptor { + return file_legacyenrichedflow_proto_enumTypes[4].Descriptor() +} + +func (LegacyEnrichedFlow_RemoteAddrType) Type() protoreflect.EnumType { + return &file_legacyenrichedflow_proto_enumTypes[4] +} + +func (x LegacyEnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LegacyEnrichedFlow_RemoteAddrType.Descriptor instead. +func (LegacyEnrichedFlow_RemoteAddrType) EnumDescriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0, 4} +} + +type LegacyEnrichedFlow struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type LegacyEnrichedFlow_FlowType `protobuf:"varint,1,opt,name=Type,proto3,enum=flowpb.LegacyEnrichedFlow_FlowType" json:"Type,omitempty"` + TimeReceived uint64 `protobuf:"varint,2,opt,name=TimeReceived,proto3" json:"TimeReceived,omitempty"` + SequenceNum uint32 `protobuf:"varint,4,opt,name=SequenceNum,proto3" json:"SequenceNum,omitempty"` + SamplingRate uint64 `protobuf:"varint,3,opt,name=SamplingRate,proto3" json:"SamplingRate,omitempty"` + FlowDirection uint32 `protobuf:"varint,42,opt,name=FlowDirection,proto3" json:"FlowDirection,omitempty"` + // Sampler information + SamplerAddress []byte `protobuf:"bytes,11,opt,name=SamplerAddress,proto3" json:"SamplerAddress,omitempty"` + // Found inside packet + TimeFlowStart uint64 `protobuf:"varint,38,opt,name=TimeFlowStart,proto3" json:"TimeFlowStart,omitempty"` + TimeFlowEnd uint64 `protobuf:"varint,5,opt,name=TimeFlowEnd,proto3" json:"TimeFlowEnd,omitempty"` + // Size of the sampled packet + Bytes uint64 `protobuf:"varint,9,opt,name=Bytes,proto3" json:"Bytes,omitempty"` + Packets uint64 `protobuf:"varint,10,opt,name=Packets,proto3" json:"Packets,omitempty"` + // Source/destination addresses + SrcAddr []byte `protobuf:"bytes,6,opt,name=SrcAddr,proto3" json:"SrcAddr,omitempty"` + DstAddr []byte `protobuf:"bytes,7,opt,name=DstAddr,proto3" json:"DstAddr,omitempty"` + // Layer 3 protocol (IPv4/IPv6/ARP/MPLS...) + Etype uint32 `protobuf:"varint,30,opt,name=Etype,proto3" json:"Etype,omitempty"` + // Layer 4 protocol + Proto uint32 `protobuf:"varint,20,opt,name=Proto,proto3" json:"Proto,omitempty"` + // Ports for UDP and TCP + SrcPort uint32 `protobuf:"varint,21,opt,name=SrcPort,proto3" json:"SrcPort,omitempty"` + DstPort uint32 `protobuf:"varint,22,opt,name=DstPort,proto3" json:"DstPort,omitempty"` + // Interfaces + InIf uint32 `protobuf:"varint,18,opt,name=InIf,proto3" json:"InIf,omitempty"` + OutIf uint32 `protobuf:"varint,19,opt,name=OutIf,proto3" json:"OutIf,omitempty"` + // Ethernet information + SrcMac uint64 `protobuf:"varint,27,opt,name=SrcMac,proto3" json:"SrcMac,omitempty"` + DstMac uint64 `protobuf:"varint,28,opt,name=DstMac,proto3" json:"DstMac,omitempty"` + // Vlan + SrcVlan uint32 `protobuf:"varint,33,opt,name=SrcVlan,proto3" json:"SrcVlan,omitempty"` + DstVlan uint32 `protobuf:"varint,34,opt,name=DstVlan,proto3" json:"DstVlan,omitempty"` + // 802.1q VLAN in sampled packet + VlanId uint32 `protobuf:"varint,29,opt,name=VlanId,proto3" json:"VlanId,omitempty"` + // VRF + IngressVrfID uint32 `protobuf:"varint,39,opt,name=IngressVrfID,proto3" json:"IngressVrfID,omitempty"` + EgressVrfID uint32 `protobuf:"varint,40,opt,name=EgressVrfID,proto3" json:"EgressVrfID,omitempty"` + // IP and TCP special flags + IPTos uint32 `protobuf:"varint,23,opt,name=IPTos,proto3" json:"IPTos,omitempty"` + ForwardingStatus uint32 `protobuf:"varint,24,opt,name=ForwardingStatus,proto3" json:"ForwardingStatus,omitempty"` + IPTTL uint32 `protobuf:"varint,25,opt,name=IPTTL,proto3" json:"IPTTL,omitempty"` + TCPFlags uint32 `protobuf:"varint,26,opt,name=TCPFlags,proto3" json:"TCPFlags,omitempty"` + IcmpType uint32 `protobuf:"varint,31,opt,name=IcmpType,proto3" json:"IcmpType,omitempty"` + IcmpCode uint32 `protobuf:"varint,32,opt,name=IcmpCode,proto3" json:"IcmpCode,omitempty"` + IPv6FlowLabel uint32 `protobuf:"varint,37,opt,name=IPv6FlowLabel,proto3" json:"IPv6FlowLabel,omitempty"` + // Fragments (IPv4/IPv6) + FragmentId uint32 `protobuf:"varint,35,opt,name=FragmentId,proto3" json:"FragmentId,omitempty"` + FragmentOffset uint32 `protobuf:"varint,36,opt,name=FragmentOffset,proto3" json:"FragmentOffset,omitempty"` + BiFlowDirection uint32 `protobuf:"varint,41,opt,name=BiFlowDirection,proto3" json:"BiFlowDirection,omitempty"` + // Autonomous system information + SrcAS uint32 `protobuf:"varint,14,opt,name=SrcAS,proto3" json:"SrcAS,omitempty"` + DstAS uint32 `protobuf:"varint,15,opt,name=DstAS,proto3" json:"DstAS,omitempty"` + NextHop []byte `protobuf:"bytes,12,opt,name=NextHop,proto3" json:"NextHop,omitempty"` + NextHopAS uint32 `protobuf:"varint,13,opt,name=NextHopAS,proto3" json:"NextHopAS,omitempty"` + // Prefix size + SrcNet uint32 `protobuf:"varint,16,opt,name=SrcNet,proto3" json:"SrcNet,omitempty"` + DstNet uint32 `protobuf:"varint,17,opt,name=DstNet,proto3" json:"DstNet,omitempty"` + // MPLS information + HasMPLS bool `protobuf:"varint,53,opt,name=HasMPLS,proto3" json:"HasMPLS,omitempty"` + MPLSCount uint32 `protobuf:"varint,54,opt,name=MPLSCount,proto3" json:"MPLSCount,omitempty"` + MPLS1TTL uint32 `protobuf:"varint,55,opt,name=MPLS1TTL,proto3" json:"MPLS1TTL,omitempty"` // First TTL + MPLS1Label uint32 `protobuf:"varint,56,opt,name=MPLS1Label,proto3" json:"MPLS1Label,omitempty"` // First Label + MPLS2TTL uint32 `protobuf:"varint,57,opt,name=MPLS2TTL,proto3" json:"MPLS2TTL,omitempty"` // Second TTL + MPLS2Label uint32 `protobuf:"varint,58,opt,name=MPLS2Label,proto3" json:"MPLS2Label,omitempty"` // Second Label + MPLS3TTL uint32 `protobuf:"varint,59,opt,name=MPLS3TTL,proto3" json:"MPLS3TTL,omitempty"` // Third TTL + MPLS3Label uint32 `protobuf:"varint,60,opt,name=MPLS3Label,proto3" json:"MPLS3Label,omitempty"` // Third Label + MPLSLastTTL uint32 `protobuf:"varint,61,opt,name=MPLSLastTTL,proto3" json:"MPLSLastTTL,omitempty"` // Last TTL + MPLSLastLabel uint32 `protobuf:"varint,62,opt,name=MPLSLastLabel,proto3" json:"MPLSLastLabel,omitempty"` // Last Label + PacketBytesMin uint32 `protobuf:"varint,1100,opt,name=PacketBytesMin,proto3" json:"PacketBytesMin,omitempty"` // new, single packet means uint32 < MTU + PacketBytesMax uint32 `protobuf:"varint,1101,opt,name=PacketBytesMax,proto3" json:"PacketBytesMax,omitempty"` // new + PacketBytesMean uint32 `protobuf:"varint,1102,opt,name=PacketBytesMean,proto3" json:"PacketBytesMean,omitempty"` // new + PacketBytesStdDev uint32 `protobuf:"varint,1103,opt,name=PacketBytesStdDev,proto3" json:"PacketBytesStdDev,omitempty"` // new + PacketIATMin uint64 `protobuf:"varint,1110,opt,name=PacketIATMin,proto3" json:"PacketIATMin,omitempty"` // new + PacketIATMax uint64 `protobuf:"varint,1111,opt,name=PacketIATMax,proto3" json:"PacketIATMax,omitempty"` // new + PacketIATMean uint64 `protobuf:"varint,1112,opt,name=PacketIATMean,proto3" json:"PacketIATMean,omitempty"` // new + PacketIATStdDev uint64 `protobuf:"varint,1113,opt,name=PacketIATStdDev,proto3" json:"PacketIATStdDev,omitempty"` // new + HeaderBytes uint32 `protobuf:"varint,1120,opt,name=HeaderBytes,proto3" json:"HeaderBytes,omitempty"` // new + FINFlagCount uint64 `protobuf:"varint,1130,opt,name=FINFlagCount,proto3" json:"FINFlagCount,omitempty"` // new + SYNFlagCount uint64 `protobuf:"varint,1131,opt,name=SYNFlagCount,proto3" json:"SYNFlagCount,omitempty"` // new + RSTFlagCount uint64 `protobuf:"varint,1132,opt,name=RSTFlagCount,proto3" json:"RSTFlagCount,omitempty"` // new + PSHFlagCount uint64 `protobuf:"varint,1133,opt,name=PSHFlagCount,proto3" json:"PSHFlagCount,omitempty"` // new + ACKFlagCount uint64 `protobuf:"varint,1134,opt,name=ACKFlagCount,proto3" json:"ACKFlagCount,omitempty"` // new + URGFlagCount uint64 `protobuf:"varint,1135,opt,name=URGFlagCount,proto3" json:"URGFlagCount,omitempty"` // new + CWRFlagCount uint64 `protobuf:"varint,1136,opt,name=CWRFlagCount,proto3" json:"CWRFlagCount,omitempty"` // new + ECEFlagCount uint64 `protobuf:"varint,1137,opt,name=ECEFlagCount,proto3" json:"ECEFlagCount,omitempty"` // new + PayloadPackets uint64 `protobuf:"varint,1140,opt,name=PayloadPackets,proto3" json:"PayloadPackets,omitempty"` // new + TimeActiveMin uint64 `protobuf:"varint,1150,opt,name=TimeActiveMin,proto3" json:"TimeActiveMin,omitempty"` // new + TimeActiveMax uint64 `protobuf:"varint,1151,opt,name=TimeActiveMax,proto3" json:"TimeActiveMax,omitempty"` // new + TimeActiveMean uint64 `protobuf:"varint,1152,opt,name=TimeActiveMean,proto3" json:"TimeActiveMean,omitempty"` // new + TimeActiveStdDev uint64 `protobuf:"varint,1153,opt,name=TimeActiveStdDev,proto3" json:"TimeActiveStdDev,omitempty"` // new + TimeIdleMin uint64 `protobuf:"varint,1154,opt,name=TimeIdleMin,proto3" json:"TimeIdleMin,omitempty"` // new + TimeIdleMax uint64 `protobuf:"varint,1155,opt,name=TimeIdleMax,proto3" json:"TimeIdleMax,omitempty"` // new + TimeIdleMean uint64 `protobuf:"varint,1156,opt,name=TimeIdleMean,proto3" json:"TimeIdleMean,omitempty"` // new + TimeIdleStdDev uint64 `protobuf:"varint,1157,opt,name=TimeIdleStdDev,proto3" json:"TimeIdleStdDev,omitempty"` // new + // modify/addcid + Cid uint32 `protobuf:"varint,1000,opt,name=Cid,proto3" json:"Cid,omitempty"` // TODO: deprecate and provide as helper? + CidString string `protobuf:"bytes,1001,opt,name=CidString,proto3" json:"CidString,omitempty"` // deprecated, delete for v1.0.0 + SrcCid uint32 `protobuf:"varint,1012,opt,name=SrcCid,proto3" json:"SrcCid,omitempty"` + DstCid uint32 `protobuf:"varint,1013,opt,name=DstCid,proto3" json:"DstCid,omitempty"` + SrcAddrAnon LegacyEnrichedFlow_AnonymizedType `protobuf:"varint,1160,opt,name=SrcAddrAnon,proto3,enum=flowpb.LegacyEnrichedFlow_AnonymizedType" json:"SrcAddrAnon,omitempty"` + DstAddrAnon LegacyEnrichedFlow_AnonymizedType `protobuf:"varint,1161,opt,name=DstAddrAnon,proto3,enum=flowpb.LegacyEnrichedFlow_AnonymizedType" json:"DstAddrAnon,omitempty"` + SrcAddrPreservedLen uint32 `protobuf:"varint,1162,opt,name=SrcAddrPreservedLen,proto3" json:"SrcAddrPreservedLen,omitempty"` + DstAddrPreservedLen uint32 `protobuf:"varint,1163,opt,name=DstAddrPreservedLen,proto3" json:"DstAddrPreservedLen,omitempty"` + SamplerAddrAnon LegacyEnrichedFlow_AnonymizedType `protobuf:"varint,1164,opt,name=SamplerAddrAnon,proto3,enum=flowpb.LegacyEnrichedFlow_AnonymizedType" json:"SamplerAddrAnon,omitempty"` + SamplerAddrAnonPreservedPrefixLen uint32 `protobuf:"varint,1165,opt,name=SamplerAddrAnonPreservedPrefixLen,proto3" json:"SamplerAddrAnonPreservedPrefixLen,omitempty"` + // modify/bgp + // as done by a number of Netflow implementations, these refer to the destination + ASPath []uint32 `protobuf:"varint,1171,rep,packed,name=ASPath,proto3" json:"ASPath,omitempty"` + Med uint32 `protobuf:"varint,1172,opt,name=Med,proto3" json:"Med,omitempty"` + LocalPref uint32 `protobuf:"varint,1173,opt,name=LocalPref,proto3" json:"LocalPref,omitempty"` + ValidationStatus LegacyEnrichedFlow_ValidationStatusType `protobuf:"varint,1174,opt,name=ValidationStatus,proto3,enum=flowpb.LegacyEnrichedFlow_ValidationStatusType" json:"ValidationStatus,omitempty"` + // modify/geolocation + RemoteCountry string `protobuf:"bytes,1010,opt,name=RemoteCountry,proto3" json:"RemoteCountry,omitempty"` // TODO: deprecate and provide as helper + SrcCountry string `protobuf:"bytes,1014,opt,name=SrcCountry,proto3" json:"SrcCountry,omitempty"` + DstCountry string `protobuf:"bytes,1015,opt,name=DstCountry,proto3" json:"DstCountry,omitempty"` + Normalized LegacyEnrichedFlow_NormalizedType `protobuf:"varint,1002,opt,name=Normalized,proto3,enum=flowpb.LegacyEnrichedFlow_NormalizedType" json:"Normalized,omitempty"` // TODO: deprecate and replace with helper? + // modify/protomap + ProtoName string `protobuf:"bytes,1009,opt,name=ProtoName,proto3" json:"ProtoName,omitempty"` // TODO: deprecate and replace with helper, why lug a string along... + RemoteAddr LegacyEnrichedFlow_RemoteAddrType `protobuf:"varint,1011,opt,name=RemoteAddr,proto3,enum=flowpb.LegacyEnrichedFlow_RemoteAddrType" json:"RemoteAddr,omitempty"` // TODO: figure out a better system? applicable only to service providers right now... + // modify/reversedns + SrcHostName string `protobuf:"bytes,1180,opt,name=SrcHostName,proto3" json:"SrcHostName,omitempty"` + DstHostName string `protobuf:"bytes,1181,opt,name=DstHostName,proto3" json:"DstHostName,omitempty"` + NextHopHostName string `protobuf:"bytes,1182,opt,name=NextHopHostName,proto3" json:"NextHopHostName,omitempty"` + SrcASName string `protobuf:"bytes,1183,opt,name=SrcASName,proto3" json:"SrcASName,omitempty"` + DstASName string `protobuf:"bytes,1184,opt,name=DstASName,proto3" json:"DstASName,omitempty"` + NextHopASName string `protobuf:"bytes,1185,opt,name=NextHopASName,proto3" json:"NextHopASName,omitempty"` + SamplerHostName string `protobuf:"bytes,1186,opt,name=SamplerHostName,proto3" json:"SamplerHostName,omitempty"` + // modify/snmp + SrcIfName string `protobuf:"bytes,1003,opt,name=SrcIfName,proto3" json:"SrcIfName,omitempty"` // TODO: rename to match InIf and OutIf + SrcIfDesc string `protobuf:"bytes,1004,opt,name=SrcIfDesc,proto3" json:"SrcIfDesc,omitempty"` // TODO: rename to match InIf and OutIf + SrcIfSpeed uint32 `protobuf:"varint,1005,opt,name=SrcIfSpeed,proto3" json:"SrcIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf + DstIfName string `protobuf:"bytes,1006,opt,name=DstIfName,proto3" json:"DstIfName,omitempty"` // TODO: rename to match InIf and OutIf + DstIfDesc string `protobuf:"bytes,1007,opt,name=DstIfDesc,proto3" json:"DstIfDesc,omitempty"` // TODO: rename to match InIf and OutIf + DstIfSpeed uint32 `protobuf:"varint,1008,opt,name=DstIfSpeed,proto3" json:"DstIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf + // general + Note string `protobuf:"bytes,1016,opt,name=Note,proto3" json:"Note,omitempty"` // free-form field to implement anything + // modify/addrstrings + SourceIP string `protobuf:"bytes,1290,opt,name=SourceIP,proto3" json:"SourceIP,omitempty"` + DestinationIP string `protobuf:"bytes,1291,opt,name=DestinationIP,proto3" json:"DestinationIP,omitempty"` + NextHopIP string `protobuf:"bytes,1292,opt,name=NextHopIP,proto3" json:"NextHopIP,omitempty"` + SamplerIP string `protobuf:"bytes,1293,opt,name=SamplerIP,proto3" json:"SamplerIP,omitempty"` + SourceMAC string `protobuf:"bytes,1294,opt,name=SourceMAC,proto3" json:"SourceMAC,omitempty"` + DestinationMAC string `protobuf:"bytes,1295,opt,name=DestinationMAC,proto3" json:"DestinationMAC,omitempty"` +} + +func (x *LegacyEnrichedFlow) Reset() { + *x = LegacyEnrichedFlow{} + mi := &file_legacyenrichedflow_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LegacyEnrichedFlow) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LegacyEnrichedFlow) ProtoMessage() {} + +func (x *LegacyEnrichedFlow) ProtoReflect() protoreflect.Message { + mi := &file_legacyenrichedflow_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LegacyEnrichedFlow.ProtoReflect.Descriptor instead. +func (*LegacyEnrichedFlow) Descriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0} +} + +func (x *LegacyEnrichedFlow) GetType() LegacyEnrichedFlow_FlowType { + if x != nil { + return x.Type + } + return LegacyEnrichedFlow_FLOWUNKNOWN +} + +func (x *LegacyEnrichedFlow) GetTimeReceived() uint64 { + if x != nil { + return x.TimeReceived + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSequenceNum() uint32 { + if x != nil { + return x.SequenceNum + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSamplingRate() uint64 { + if x != nil { + return x.SamplingRate + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetFlowDirection() uint32 { + if x != nil { + return x.FlowDirection + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSamplerAddress() []byte { + if x != nil { + return x.SamplerAddress + } + return nil +} + +func (x *LegacyEnrichedFlow) GetTimeFlowStart() uint64 { + if x != nil { + return x.TimeFlowStart + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeFlowEnd() uint64 { + if x != nil { + return x.TimeFlowEnd + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetBytes() uint64 { + if x != nil { + return x.Bytes + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPackets() uint64 { + if x != nil { + return x.Packets + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcAddr() []byte { + if x != nil { + return x.SrcAddr + } + return nil +} + +func (x *LegacyEnrichedFlow) GetDstAddr() []byte { + if x != nil { + return x.DstAddr + } + return nil +} + +func (x *LegacyEnrichedFlow) GetEtype() uint32 { + if x != nil { + return x.Etype + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetProto() uint32 { + if x != nil { + return x.Proto + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcPort() uint32 { + if x != nil { + return x.SrcPort + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstPort() uint32 { + if x != nil { + return x.DstPort + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetInIf() uint32 { + if x != nil { + return x.InIf + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetOutIf() uint32 { + if x != nil { + return x.OutIf + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcMac() uint64 { + if x != nil { + return x.SrcMac + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstMac() uint64 { + if x != nil { + return x.DstMac + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcVlan() uint32 { + if x != nil { + return x.SrcVlan + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstVlan() uint32 { + if x != nil { + return x.DstVlan + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetVlanId() uint32 { + if x != nil { + return x.VlanId + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIngressVrfID() uint32 { + if x != nil { + return x.IngressVrfID + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetEgressVrfID() uint32 { + if x != nil { + return x.EgressVrfID + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIPTos() uint32 { + if x != nil { + return x.IPTos + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetForwardingStatus() uint32 { + if x != nil { + return x.ForwardingStatus + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIPTTL() uint32 { + if x != nil { + return x.IPTTL + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTCPFlags() uint32 { + if x != nil { + return x.TCPFlags + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIcmpType() uint32 { + if x != nil { + return x.IcmpType + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIcmpCode() uint32 { + if x != nil { + return x.IcmpCode + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIPv6FlowLabel() uint32 { + if x != nil { + return x.IPv6FlowLabel + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetFragmentId() uint32 { + if x != nil { + return x.FragmentId + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetFragmentOffset() uint32 { + if x != nil { + return x.FragmentOffset + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetBiFlowDirection() uint32 { + if x != nil { + return x.BiFlowDirection + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcAS() uint32 { + if x != nil { + return x.SrcAS + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstAS() uint32 { + if x != nil { + return x.DstAS + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetNextHop() []byte { + if x != nil { + return x.NextHop + } + return nil +} + +func (x *LegacyEnrichedFlow) GetNextHopAS() uint32 { + if x != nil { + return x.NextHopAS + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcNet() uint32 { + if x != nil { + return x.SrcNet + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstNet() uint32 { + if x != nil { + return x.DstNet + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetHasMPLS() bool { + if x != nil { + return x.HasMPLS + } + return false +} + +func (x *LegacyEnrichedFlow) GetMPLSCount() uint32 { + if x != nil { + return x.MPLSCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS1TTL() uint32 { + if x != nil { + return x.MPLS1TTL + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS1Label() uint32 { + if x != nil { + return x.MPLS1Label + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS2TTL() uint32 { + if x != nil { + return x.MPLS2TTL + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS2Label() uint32 { + if x != nil { + return x.MPLS2Label + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS3TTL() uint32 { + if x != nil { + return x.MPLS3TTL + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS3Label() uint32 { + if x != nil { + return x.MPLS3Label + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLSLastTTL() uint32 { + if x != nil { + return x.MPLSLastTTL + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLSLastLabel() uint32 { + if x != nil { + return x.MPLSLastLabel + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketBytesMin() uint32 { + if x != nil { + return x.PacketBytesMin + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketBytesMax() uint32 { + if x != nil { + return x.PacketBytesMax + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketBytesMean() uint32 { + if x != nil { + return x.PacketBytesMean + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketBytesStdDev() uint32 { + if x != nil { + return x.PacketBytesStdDev + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketIATMin() uint64 { + if x != nil { + return x.PacketIATMin + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketIATMax() uint64 { + if x != nil { + return x.PacketIATMax + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketIATMean() uint64 { + if x != nil { + return x.PacketIATMean + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketIATStdDev() uint64 { + if x != nil { + return x.PacketIATStdDev + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetHeaderBytes() uint32 { + if x != nil { + return x.HeaderBytes + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetFINFlagCount() uint64 { + if x != nil { + return x.FINFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSYNFlagCount() uint64 { + if x != nil { + return x.SYNFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetRSTFlagCount() uint64 { + if x != nil { + return x.RSTFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPSHFlagCount() uint64 { + if x != nil { + return x.PSHFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetACKFlagCount() uint64 { + if x != nil { + return x.ACKFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetURGFlagCount() uint64 { + if x != nil { + return x.URGFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetCWRFlagCount() uint64 { + if x != nil { + return x.CWRFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetECEFlagCount() uint64 { + if x != nil { + return x.ECEFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPayloadPackets() uint64 { + if x != nil { + return x.PayloadPackets + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeActiveMin() uint64 { + if x != nil { + return x.TimeActiveMin + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeActiveMax() uint64 { + if x != nil { + return x.TimeActiveMax + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeActiveMean() uint64 { + if x != nil { + return x.TimeActiveMean + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeActiveStdDev() uint64 { + if x != nil { + return x.TimeActiveStdDev + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeIdleMin() uint64 { + if x != nil { + return x.TimeIdleMin + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeIdleMax() uint64 { + if x != nil { + return x.TimeIdleMax + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeIdleMean() uint64 { + if x != nil { + return x.TimeIdleMean + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeIdleStdDev() uint64 { + if x != nil { + return x.TimeIdleStdDev + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetCid() uint32 { + if x != nil { + return x.Cid + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetCidString() string { + if x != nil { + return x.CidString + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcCid() uint32 { + if x != nil { + return x.SrcCid + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstCid() uint32 { + if x != nil { + return x.DstCid + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcAddrAnon() LegacyEnrichedFlow_AnonymizedType { + if x != nil { + return x.SrcAddrAnon + } + return LegacyEnrichedFlow_NotAnonymized +} + +func (x *LegacyEnrichedFlow) GetDstAddrAnon() LegacyEnrichedFlow_AnonymizedType { + if x != nil { + return x.DstAddrAnon + } + return LegacyEnrichedFlow_NotAnonymized +} + +func (x *LegacyEnrichedFlow) GetSrcAddrPreservedLen() uint32 { + if x != nil { + return x.SrcAddrPreservedLen + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstAddrPreservedLen() uint32 { + if x != nil { + return x.DstAddrPreservedLen + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSamplerAddrAnon() LegacyEnrichedFlow_AnonymizedType { + if x != nil { + return x.SamplerAddrAnon + } + return LegacyEnrichedFlow_NotAnonymized +} + +func (x *LegacyEnrichedFlow) GetSamplerAddrAnonPreservedPrefixLen() uint32 { + if x != nil { + return x.SamplerAddrAnonPreservedPrefixLen + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetASPath() []uint32 { + if x != nil { + return x.ASPath + } + return nil +} + +func (x *LegacyEnrichedFlow) GetMed() uint32 { + if x != nil { + return x.Med + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetLocalPref() uint32 { + if x != nil { + return x.LocalPref + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetValidationStatus() LegacyEnrichedFlow_ValidationStatusType { + if x != nil { + return x.ValidationStatus + } + return LegacyEnrichedFlow_Unknown +} + +func (x *LegacyEnrichedFlow) GetRemoteCountry() string { + if x != nil { + return x.RemoteCountry + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcCountry() string { + if x != nil { + return x.SrcCountry + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDstCountry() string { + if x != nil { + return x.DstCountry + } + return "" +} + +func (x *LegacyEnrichedFlow) GetNormalized() LegacyEnrichedFlow_NormalizedType { + if x != nil { + return x.Normalized + } + return LegacyEnrichedFlow_No +} + +func (x *LegacyEnrichedFlow) GetProtoName() string { + if x != nil { + return x.ProtoName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetRemoteAddr() LegacyEnrichedFlow_RemoteAddrType { + if x != nil { + return x.RemoteAddr + } + return LegacyEnrichedFlow_Neither +} + +func (x *LegacyEnrichedFlow) GetSrcHostName() string { + if x != nil { + return x.SrcHostName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDstHostName() string { + if x != nil { + return x.DstHostName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetNextHopHostName() string { + if x != nil { + return x.NextHopHostName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcASName() string { + if x != nil { + return x.SrcASName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDstASName() string { + if x != nil { + return x.DstASName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetNextHopASName() string { + if x != nil { + return x.NextHopASName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSamplerHostName() string { + if x != nil { + return x.SamplerHostName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcIfName() string { + if x != nil { + return x.SrcIfName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcIfDesc() string { + if x != nil { + return x.SrcIfDesc + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcIfSpeed() uint32 { + if x != nil { + return x.SrcIfSpeed + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstIfName() string { + if x != nil { + return x.DstIfName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDstIfDesc() string { + if x != nil { + return x.DstIfDesc + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDstIfSpeed() uint32 { + if x != nil { + return x.DstIfSpeed + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetNote() string { + if x != nil { + return x.Note + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSourceIP() string { + if x != nil { + return x.SourceIP + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDestinationIP() string { + if x != nil { + return x.DestinationIP + } + return "" +} + +func (x *LegacyEnrichedFlow) GetNextHopIP() string { + if x != nil { + return x.NextHopIP + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSamplerIP() string { + if x != nil { + return x.SamplerIP + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSourceMAC() string { + if x != nil { + return x.SourceMAC + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDestinationMAC() string { + if x != nil { + return x.DestinationMAC + } + return "" +} + +var File_legacyenrichedflow_proto protoreflect.FileDescriptor + +var file_legacyenrichedflow_proto_rawDesc = []byte{ + 0x0a, 0x18, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, + 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, + 0x70, 0x62, 0x22, 0xa1, 0x23, 0x0a, 0x12, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, + 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x37, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, + 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, + 0x6c, 0x6f, 0x77, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x69, + 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x26, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, + 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x44, + 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x44, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x44, + 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x18, 0x12, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x75, + 0x74, 0x49, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4f, 0x75, 0x74, 0x49, 0x66, + 0x12, 0x16, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x4d, + 0x61, 0x63, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x44, 0x73, 0x74, 0x4d, 0x61, 0x63, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x73, + 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x44, 0x73, 0x74, + 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x18, 0x1d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, + 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x18, 0x27, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, + 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x18, + 0x28, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, + 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x46, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x18, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x10, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x18, 0x19, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x43, + 0x50, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x54, 0x43, + 0x50, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x20, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x24, + 0x0a, 0x0d, 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, + 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x46, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0f, + 0x42, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x42, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, 0x12, 0x14, 0x0a, 0x05, + 0x44, 0x73, 0x74, 0x41, 0x53, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x44, 0x73, 0x74, + 0x41, 0x53, 0x12, 0x18, 0x0a, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1c, 0x0a, 0x09, + 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x72, + 0x63, 0x4e, 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x4e, + 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x61, + 0x73, 0x4d, 0x50, 0x4c, 0x53, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x61, 0x73, + 0x4d, 0x50, 0x4c, 0x53, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x18, 0x37, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x12, 0x1e, + 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1a, + 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x50, + 0x4c, 0x53, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x50, + 0x4c, 0x53, 0x33, 0x54, 0x54, 0x4c, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x50, + 0x4c, 0x53, 0x33, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x33, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, 0x4c, 0x53, + 0x33, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x50, 0x4c, 0x53, 0x4c, 0x61, + 0x73, 0x74, 0x54, 0x54, 0x4c, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, 0x50, 0x4c, + 0x53, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x54, 0x4c, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x50, 0x4c, 0x53, + 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0d, 0x4d, 0x50, 0x4c, 0x53, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x27, + 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, + 0x18, 0xcc, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xcd, 0x08, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, + 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, + 0x65, 0x61, 0x6e, 0x18, 0xce, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, 0x0a, 0x11, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, + 0x18, 0xcf, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xd6, 0x08, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x12, + 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, 0x18, + 0xd7, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, + 0x54, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, + 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xd8, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x0f, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xd9, + 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, + 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0xe0, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x46, 0x49, 0x4e, + 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xea, 0x08, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, + 0x0a, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xeb, + 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0xec, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, 0x53, 0x54, 0x46, + 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x53, 0x48, 0x46, + 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xed, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, + 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xee, 0x08, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0xef, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, + 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, + 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf0, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, + 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf1, 0x08, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x18, 0xf4, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, + 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xfe, 0x08, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, + 0x6e, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, + 0x61, 0x78, 0x18, 0xff, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0x80, 0x09, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, + 0x6e, 0x12, 0x2b, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, + 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x81, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x54, 0x69, + 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, + 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0x82, 0x09, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, + 0x6e, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, 0x78, + 0x18, 0x83, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, + 0x65, 0x4d, 0x61, 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, + 0x4d, 0x65, 0x61, 0x6e, 0x18, 0x84, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, 0x6d, + 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, + 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x85, 0x09, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, + 0x65, 0x76, 0x12, 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x03, 0x43, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x18, 0xf4, + 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x12, 0x17, 0x0a, + 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x18, 0xf5, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, + 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x12, 0x4c, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, + 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x88, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, + 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, + 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, + 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, + 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, + 0x6e, 0x6f, 0x6e, 0x18, 0x89, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x6f, + 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, + 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, + 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0x8a, 0x09, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0x8b, 0x09, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x54, 0x0a, 0x0f, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x8c, 0x09, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x67, 0x61, + 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, + 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x53, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x4d, + 0x0a, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, + 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x4c, 0x65, 0x6e, 0x18, 0x8d, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x17, 0x0a, + 0x06, 0x41, 0x53, 0x50, 0x61, 0x74, 0x68, 0x18, 0x93, 0x09, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, + 0x41, 0x53, 0x50, 0x61, 0x74, 0x68, 0x12, 0x11, 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0x94, 0x09, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x4d, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x18, 0x95, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x12, 0x5c, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x96, 0x09, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x67, + 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf2, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x0a, + 0x0a, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf6, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, + 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf7, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x4a, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0xea, 0x07, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, + 0x2e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xf1, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xf3, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, + 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9c, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, + 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, + 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9d, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, + 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x9e, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, + 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9f, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, + 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0xa0, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, + 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, + 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xa1, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, + 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0xa2, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, + 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, + 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, + 0x65, 0x73, 0x63, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, + 0x66, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, + 0x65, 0x65, 0x64, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, + 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, + 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, + 0x73, 0x63, 0x18, 0xef, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, + 0x44, 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, + 0x65, 0x64, 0x18, 0xf0, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, + 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xf8, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x18, 0x8a, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x18, 0x8b, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, + 0x0a, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x18, 0x8c, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, + 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x18, 0x8d, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x18, 0x8e, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x18, 0x8f, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x41, 0x43, 0x22, 0x5d, 0x0a, 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4c, 0x4f, 0x57, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x35, 0x10, 0x01, 0x12, 0x0e, + 0x0a, 0x0a, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x35, 0x10, 0x02, 0x12, 0x0e, + 0x0a, 0x0a, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x39, 0x10, 0x03, 0x12, 0x09, + 0x0a, 0x05, 0x49, 0x50, 0x46, 0x49, 0x58, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x42, 0x50, + 0x46, 0x10, 0x05, 0x22, 0x32, 0x0a, 0x0e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, + 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, + 0x74, 0x6f, 0x50, 0x41, 0x4e, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, + 0x75, 0x6e, 0x64, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x10, 0x03, 0x22, 0x21, 0x0a, 0x0e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, + 0x59, 0x65, 0x73, 0x10, 0x01, 0x22, 0x2f, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, + 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, + 0x65, 0x72, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, + 0x03, 0x44, 0x73, 0x74, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x77, 0x4e, 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, + 0x6c, 0x6f, 0x77, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_legacyenrichedflow_proto_rawDescOnce sync.Once + file_legacyenrichedflow_proto_rawDescData = file_legacyenrichedflow_proto_rawDesc +) + +func file_legacyenrichedflow_proto_rawDescGZIP() []byte { + file_legacyenrichedflow_proto_rawDescOnce.Do(func() { + file_legacyenrichedflow_proto_rawDescData = protoimpl.X.CompressGZIP(file_legacyenrichedflow_proto_rawDescData) + }) + return file_legacyenrichedflow_proto_rawDescData +} + +var file_legacyenrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_legacyenrichedflow_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_legacyenrichedflow_proto_goTypes = []any{ + (LegacyEnrichedFlow_FlowType)(0), // 0: flowpb.LegacyEnrichedFlow.FlowType + (LegacyEnrichedFlow_AnonymizedType)(0), // 1: flowpb.LegacyEnrichedFlow.AnonymizedType + (LegacyEnrichedFlow_ValidationStatusType)(0), // 2: flowpb.LegacyEnrichedFlow.ValidationStatusType + (LegacyEnrichedFlow_NormalizedType)(0), // 3: flowpb.LegacyEnrichedFlow.NormalizedType + (LegacyEnrichedFlow_RemoteAddrType)(0), // 4: flowpb.LegacyEnrichedFlow.RemoteAddrType + (*LegacyEnrichedFlow)(nil), // 5: flowpb.LegacyEnrichedFlow +} +var file_legacyenrichedflow_proto_depIdxs = []int32{ + 0, // 0: flowpb.LegacyEnrichedFlow.Type:type_name -> flowpb.LegacyEnrichedFlow.FlowType + 1, // 1: flowpb.LegacyEnrichedFlow.SrcAddrAnon:type_name -> flowpb.LegacyEnrichedFlow.AnonymizedType + 1, // 2: flowpb.LegacyEnrichedFlow.DstAddrAnon:type_name -> flowpb.LegacyEnrichedFlow.AnonymizedType + 1, // 3: flowpb.LegacyEnrichedFlow.SamplerAddrAnon:type_name -> flowpb.LegacyEnrichedFlow.AnonymizedType + 2, // 4: flowpb.LegacyEnrichedFlow.ValidationStatus:type_name -> flowpb.LegacyEnrichedFlow.ValidationStatusType + 3, // 5: flowpb.LegacyEnrichedFlow.Normalized:type_name -> flowpb.LegacyEnrichedFlow.NormalizedType + 4, // 6: flowpb.LegacyEnrichedFlow.RemoteAddr:type_name -> flowpb.LegacyEnrichedFlow.RemoteAddrType + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_legacyenrichedflow_proto_init() } +func file_legacyenrichedflow_proto_init() { + if File_legacyenrichedflow_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_legacyenrichedflow_proto_rawDesc, + NumEnums: 5, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_legacyenrichedflow_proto_goTypes, + DependencyIndexes: file_legacyenrichedflow_proto_depIdxs, + EnumInfos: file_legacyenrichedflow_proto_enumTypes, + MessageInfos: file_legacyenrichedflow_proto_msgTypes, + }.Build() + File_legacyenrichedflow_proto = out.File + file_legacyenrichedflow_proto_rawDesc = nil + file_legacyenrichedflow_proto_goTypes = nil + file_legacyenrichedflow_proto_depIdxs = nil +} diff --git a/pb/legacyenrichedflow.proto b/pb/legacyenrichedflow.proto new file mode 100644 index 0000000..6853040 --- /dev/null +++ b/pb/legacyenrichedflow.proto @@ -0,0 +1,225 @@ +syntax = "proto3"; +package flowpb; +option go_package = "github.com/bwNetFlow/flowpipeline/pb;"; + +message LegacyEnrichedFlow { + + enum FlowType { + FLOWUNKNOWN = 0; + SFLOW_5 = 1; + NETFLOW_V5 = 2; + NETFLOW_V9 = 3; + IPFIX = 4; + EBPF = 5; + } + FlowType Type = 1; + + uint64 TimeReceived = 2; + uint32 SequenceNum = 4; + uint64 SamplingRate = 3; + + uint32 FlowDirection = 42; + + // Sampler information + bytes SamplerAddress = 11; + + // Found inside packet + uint64 TimeFlowStart = 38; + uint64 TimeFlowEnd = 5; + + // Size of the sampled packet + uint64 Bytes = 9; + uint64 Packets = 10; + + // Source/destination addresses + bytes SrcAddr = 6; + bytes DstAddr = 7; + + // Layer 3 protocol (IPv4/IPv6/ARP/MPLS...) + uint32 Etype = 30; + + // Layer 4 protocol + uint32 Proto = 20; + + // Ports for UDP and TCP + uint32 SrcPort = 21; + uint32 DstPort = 22; + + // Interfaces + uint32 InIf = 18; + uint32 OutIf = 19; + + // Ethernet information + uint64 SrcMac = 27; + uint64 DstMac = 28; + + // Vlan + uint32 SrcVlan = 33; + uint32 DstVlan = 34; + // 802.1q VLAN in sampled packet + uint32 VlanId = 29; + + // VRF + uint32 IngressVrfID = 39; + uint32 EgressVrfID = 40; + + // IP and TCP special flags + uint32 IPTos = 23; + uint32 ForwardingStatus = 24; + uint32 IPTTL = 25; + uint32 TCPFlags = 26; + uint32 IcmpType = 31; + uint32 IcmpCode = 32; + uint32 IPv6FlowLabel = 37; + // Fragments (IPv4/IPv6) + uint32 FragmentId = 35; + uint32 FragmentOffset = 36; + uint32 BiFlowDirection = 41; + + // Autonomous system information + uint32 SrcAS = 14; + uint32 DstAS = 15; + + bytes NextHop = 12; + uint32 NextHopAS = 13; + + // Prefix size + uint32 SrcNet = 16; + uint32 DstNet = 17; + + // MPLS information + bool HasMPLS = 53; + uint32 MPLSCount = 54; + uint32 MPLS1TTL = 55; // First TTL + uint32 MPLS1Label = 56; // First Label + uint32 MPLS2TTL = 57; // Second TTL + uint32 MPLS2Label = 58; // Second Label + uint32 MPLS3TTL = 59; // Third TTL + uint32 MPLS3Label = 60; // Third Label + uint32 MPLSLastTTL = 61; // Last TTL + uint32 MPLSLastLabel = 62; // Last Label + + // bwNET custom fields: + + // input/bpf: + // Many of the above fields can not be filled when creating flows from eBPF. + // However, there are some additional packet level metrics available, + // inspired by this list: + // https://github.com/ahlashkari/CICFlowMeter/blob/master/ReadMe.txt + + uint32 PacketBytesMin = 1100; // new, single packet means uint32 < MTU + uint32 PacketBytesMax = 1101; // new + uint32 PacketBytesMean = 1102; // new + uint32 PacketBytesStdDev = 1103; // new + + uint64 PacketIATMin = 1110; // new + uint64 PacketIATMax = 1111; // new + uint64 PacketIATMean = 1112; // new + uint64 PacketIATStdDev = 1113; // new + + uint32 HeaderBytes = 1120; // new + + uint64 FINFlagCount = 1130; // new + uint64 SYNFlagCount = 1131; // new + uint64 RSTFlagCount = 1132; // new + uint64 PSHFlagCount = 1133; // new + uint64 ACKFlagCount = 1134; // new + uint64 URGFlagCount = 1135; // new + uint64 CWRFlagCount = 1136; // new + uint64 ECEFlagCount = 1137; // new + + uint64 PayloadPackets = 1140; // new + + uint64 TimeActiveMin = 1150; // new + uint64 TimeActiveMax = 1151; // new + uint64 TimeActiveMean = 1152; // new + uint64 TimeActiveStdDev = 1153; // new + uint64 TimeIdleMin = 1154; // new + uint64 TimeIdleMax = 1155; // new + uint64 TimeIdleMean = 1156; // new + uint64 TimeIdleStdDev = 1157; // new + + // modify/addcid + uint32 Cid = 1000; // TODO: deprecate and provide as helper? + string CidString = 1001; // deprecated, delete for v1.0.0 + uint32 SrcCid = 1012; + uint32 DstCid = 1013; + + // modify/anonymize + enum AnonymizedType { + NotAnonymized = 0; + CryptoPAN = 1; + } + AnonymizedType SrcAddrAnon = 1160; + AnonymizedType DstAddrAnon = 1161; + uint32 SrcAddrPreservedLen = 1162; + uint32 DstAddrPreservedLen = 1163; + + AnonymizedType SamplerAddrAnon = 1164; + uint32 SamplerAddrAnonPreservedPrefixLen = 1165; + + // modify/bgp + // as done by a number of Netflow implementations, these refer to the destination + repeated uint32 ASPath = 1171; + uint32 Med = 1172; + uint32 LocalPref = 1173; + enum ValidationStatusType { + Unknown = 0; + Valid = 1; + NotFound = 2; + Invalid = 3; + } + ValidationStatusType ValidationStatus = 1174; + + // modify/geolocation + string RemoteCountry = 1010; // TODO: deprecate and provide as helper + string SrcCountry = 1014; + string DstCountry = 1015; + + // modify/normalize + enum NormalizedType { + No = 0; + Yes = 1; + } + NormalizedType Normalized = 1002; // TODO: deprecate and replace with helper? + // TODO: if not, replace with OriginalSamplingRate instead and set SamplingRate to 1? + + // modify/protomap + string ProtoName = 1009; // TODO: deprecate and replace with helper, why lug a string along... + + // modify/remoteaddress + enum RemoteAddrType { + Neither = 0; + Src = 1; + Dst = 2; + } + RemoteAddrType RemoteAddr = 1011; // TODO: figure out a better system? applicable only to service providers right now... + + // modify/reversedns + string SrcHostName = 1180; + string DstHostName = 1181; + string NextHopHostName = 1182; + string SrcASName = 1183; + string DstASName = 1184; + string NextHopASName = 1185; + string SamplerHostName = 1186; + + // modify/snmp + string SrcIfName = 1003; // TODO: rename to match InIf and OutIf + string SrcIfDesc = 1004; // TODO: rename to match InIf and OutIf + uint32 SrcIfSpeed = 1005; // TODO: rename to match InIf and OutIf + string DstIfName = 1006; // TODO: rename to match InIf and OutIf + string DstIfDesc = 1007; // TODO: rename to match InIf and OutIf + uint32 DstIfSpeed = 1008; // TODO: rename to match InIf and OutIf + + // general + string Note = 1016; // free-form field to implement anything + + // modify/addrstrings + string SourceIP = 1290; + string DestinationIP = 1291; + string NextHopIP = 1292; + string SamplerIP = 1293; + string SourceMAC = 1294; + string DestinationMAC = 1295; +} \ No newline at end of file diff --git a/segments/input/kafkaconsumer/handler.go b/segments/input/kafkaconsumer/handler.go index 1d18b7f..551569c 100644 --- a/segments/input/kafkaconsumer/handler.go +++ b/segments/input/kafkaconsumer/handler.go @@ -44,15 +44,15 @@ func (h *Handler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama case message := <-claim.Messages(): if h.legacy { session.MarkMessage(message, "") - flowMsg := new(pb.EnrichedFlow) + flowMsg := new(pb.LegacyEnrichedFlow) if err := proto.Unmarshal(message.Value, flowMsg); err == nil { - h.flows <- flowMsg + h.flows <- flowMsg.ConvertToEnrichedFlow() } else { log.Printf("[warning] KafkaConsumer: Error decoding flow, this might be due to the use of Goflow custom fields. Original error:\n %s", err) } } else { - var msg pb.ProtoProducerMessage - if err := protodelim.UnmarshalFrom(bytes.NewReader(message.Value), &msg); err != nil { + msg := new(pb.ProtoProducerMessage) + if err := protodelim.UnmarshalFrom(bytes.NewReader(message.Value), msg); err != nil { slog.Error("error unmarshalling message", slog.String("error", err.Error())) continue } diff --git a/segments/output/csv/csv.go b/segments/output/csv/csv.go index 9a48d59..7e17a70 100644 --- a/segments/output/csv/csv.go +++ b/segments/output/csv/csv.go @@ -53,7 +53,7 @@ func (segment Csv) New(config map[string]string) segments.Segment { field = strings.TrimSpace(field) _, found := protofields.FieldByName(field) if !found { - log.Printf("[error] Csv: Field specified in 'fields' does not exist.") + log.Printf("[error] Csv: Field '%s' specified in 'fields' does not exist.", field) return nil } heading = append(heading, field) diff --git a/segments/output/kafkaproducer/kafkaproducer.go b/segments/output/kafkaproducer/kafkaproducer.go index 3fd553a..a8c7b32 100644 --- a/segments/output/kafkaproducer/kafkaproducer.go +++ b/segments/output/kafkaproducer/kafkaproducer.go @@ -177,7 +177,8 @@ func (segment *KafkaProducer) Run(wg *sync.WaitGroup) { segment.Out <- msg var binary []byte if segment.Legacy { - if binary, err = proto.Marshal(msg); err != nil { + legacyFlow := msg.ConvertToLegacyEnrichedFlow() + if binary, err = proto.Marshal(legacyFlow); err != nil { log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) continue } diff --git a/segments/output/sqlite/sqlite.go b/segments/output/sqlite/sqlite.go index 2c35a29..dc8d0fb 100644 --- a/segments/output/sqlite/sqlite.go +++ b/segments/output/sqlite/sqlite.go @@ -72,7 +72,7 @@ func (segment Sqlite) New(config map[string]string) segments.Segment { for _, field := range conffields { protofield, found := protofields.FieldByName(field) if !found { - log.Printf("[error] Csv: Field specified in 'fields' does not exist.") + log.Printf("[error] sqlite: Field '%s' specified in 'fields' does not exist.", field) return nil } newsegment.fieldNames = append(newsegment.fieldNames, field) From ada50470e812cbffc3a38247c3fe6fb2d939bf9a Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Tue, 5 Nov 2024 14:21:49 +0100 Subject: [PATCH 08/18] vacuum_interval for prometheus Export Added a parameter that defines a fixed intervall at which all prometheus exporter counters are getting reset --- go.mod | 29 ++++++++++--- go.sum | 55 ++++++++++++++++++++++++ segments/export/prometheus/exporter.go | 14 ++++++ segments/export/prometheus/prometheus.go | 54 +++++++++++++++++++---- 4 files changed, 136 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 1928f1a..dd39ce2 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,19 @@ require ( gopkg.in/yaml.v2 v2.4.0 ) +require ( + github.com/jonboulle/clockwork v0.4.0 // indirect + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + go.uber.org/atomic v1.10.0 // indirect + golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect +) + require ( github.com/ClickHouse/ch-go v0.53.0 // indirect github.com/alecthomas/participle/v2 v2.0.0-beta.1 // indirect @@ -46,11 +59,13 @@ require ( github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-co-op/gocron v1.37.0 + github.com/go-co-op/gocron/v2 v2.12.3 github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.6.1 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect @@ -64,7 +79,7 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/k-sone/critbitgo v1.4.0 // indirect github.com/kaorimatz/go-mrt v0.0.0-20210326003454-aa11f3646f93 // indirect - github.com/klauspost/compress v1.15.15 // indirect + github.com/klauspost/compress v1.15.15 github.com/libp2p/go-reuseport v0.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect @@ -94,11 +109,11 @@ require ( github.com/vishvananda/netns v0.0.4 // indirect go.opentelemetry.io/otel v1.13.0 // indirect go.opentelemetry.io/otel/trace v1.13.0 // indirect - golang.org/x/crypto v0.6.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/net v0.21.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.19.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec // indirect google.golang.org/grpc v1.53.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 5d47c55..ab27c23 100644 --- a/go.sum +++ b/go.sum @@ -151,6 +151,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= @@ -158,6 +159,10 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0= +github.com/go-co-op/gocron v1.37.0/go.mod h1:3L/n6BkO7ABj+TrfSVXLRzsP26zmikL4ISkLQ0O8iNY= +github.com/go-co-op/gocron/v2 v2.12.3 h1:3JkKjkFoAPp/i0YE+sonlF5gi+xnBChwYh75nX16MaE= +github.com/go-co-op/gocron/v2 v2.12.3/go.mod h1:xY7bJxGazKam1cz04EebrlP4S9q4iWdiAylMGP3jY9w= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= github.com/go-faster/errors v0.6.1 h1:nNIPOBkprlKzkThvS/0YaX8Zs9KewLCOSFQS5BU06FI= @@ -183,6 +188,7 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= @@ -254,6 +260,12 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -275,6 +287,7 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/influxdata/influxdb-client-go/v2 v2.11.0 h1:BrHYv38rWkAnp22gIaHFp5LpOCazOqRMRvVE1yW3ym8= @@ -295,6 +308,8 @@ github.com/jcmturner/gokrb5/v8 v8.4.3 h1:iTonLeSJOn7MVUtyMT+arAn5AKAPrkilzhGw8wE github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -376,11 +391,16 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/netsampler/goflow2 v1.1.1 h1:GpVlvPq4yRbyzoiz0Vp3XilNr5js/0UhHcQI7Ol/MDk= github.com/netsampler/goflow2 v1.1.1/go.mod h1:oNIeGj67SjwrRSTEukErjNT1zZ02W9+8M5mSgQCkZC8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/oschwald/maxminddb-golang v1.10.0 h1:Xp1u0ZhqkSuopaKmk1WwHtjF0H9Hd9181uj2MQ5Vndg= github.com/oschwald/maxminddb-golang v1.10.0/go.mod h1:Y2ELenReaLAZ0b400URyGwvYxHV1dLIxBuyOsyYjHK0= github.com/osrg/gobgp/v3 v3.7.0 h1:h+Liq90TsxNKTB/443V8b1o/pwOm94yIsm+gP0RHwOo= @@ -445,10 +465,13 @@ github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJf github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 h1:Lt9DzQALzHoDwMBGJ6v8ObDPR0dzr2a6sXTB1Fq7IHs= github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -491,6 +514,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= @@ -512,13 +538,17 @@ github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1Y github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -534,6 +564,9 @@ go.opentelemetry.io/otel/trace v1.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZ go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA= go.opentelemetry.io/otel/trace v1.13.0 h1:CBgRZ6ntv+Amuj1jDsMhZtlAPT6gbyIRdaIzFhfBSdY= go.opentelemetry.io/otel/trace v1.13.0/go.mod h1:muCvmmO9KKpvuXSf3KKAXXB2ygNYHQ+ZfI5X08d3tds= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -553,6 +586,8 @@ golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -563,6 +598,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -587,8 +624,10 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -626,11 +665,14 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -653,12 +695,16 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7 h1:ZrnxWX62AgTKOSagEqxvb3ffipvEDX2pl7E1TdqLqIc= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -711,6 +757,7 @@ golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -718,6 +765,8 @@ golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -728,10 +777,13 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -787,6 +839,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -902,8 +955,10 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/segments/export/prometheus/exporter.go b/segments/export/prometheus/exporter.go index 48e7f0b..2e1cd4a 100644 --- a/segments/export/prometheus/exporter.go +++ b/segments/export/prometheus/exporter.go @@ -51,6 +51,20 @@ func (e *Exporter) Initialize(labels []string) { } +func (e *Exporter) ResetCounter() { + log.Printf("[INFO] prometheus export: resetting counter") + e.kafkaOffsets.Reset() + e.flowBits.Reset() + + e.MetaReg.Unregister(e.kafkaMessageCount) + e.kafkaMessageCount = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "kafka_messages_total", + Help: "Number of Kafka messages", + }) + e.MetaReg.MustRegister(e.kafkaMessageCount) +} + // listen on given endpoint addr with Handler for metricPath and flowdataPath func (e *Exporter) ServeEndpoints(segment *Prometheus) { mux := http.NewServeMux() diff --git a/segments/export/prometheus/prometheus.go b/segments/export/prometheus/prometheus.go index c9779ba..c18d8c4 100644 --- a/segments/export/prometheus/prometheus.go +++ b/segments/export/prometheus/prometheus.go @@ -23,17 +23,20 @@ import ( "strconv" "strings" "sync" + "time" "github.com/bwNetFlow/flowpipeline/pb" "github.com/bwNetFlow/flowpipeline/segments" + "github.com/go-co-op/gocron/v2" ) type Prometheus struct { segments.BaseSegment - Endpoint string // optional, default value is ":8080" - MetricsPath string // optional, default is "/metrics" - FlowdataPath string // optional, default is "/flowdata" - Labels []string // optional, list of labels to be exported + Endpoint string // optional, default value is ":8080" + MetricsPath string // optional, default is "/metrics" + FlowdataPath string // optional, default is "/flowdata" + Labels []string // optional, list of labels to be exported + VacuumInterval *time.Duration // optional, intervall in which counters should be reset } func (segment Prometheus) New(config map[string]string) segments.Segment { @@ -55,11 +58,21 @@ func (segment Prometheus) New(config map[string]string) segments.Segment { } else { flowdataPath = config["flowdatapath"] } + var vacuumInterval *time.Duration + if config["vacuum_interval"] != "" { + vacuumIntervalDuration, err := time.ParseDuration(config["vacuum_interval"]) + if err != nil { + log.Println("[info] prometheus: Missing configuration parameter 'flowdatapath'. Using default path \"/flowdata\"") + } else { + vacuumInterval = &vacuumIntervalDuration + } + } newsegment := &Prometheus{ - Endpoint: endpoint, - MetricsPath: metricsPath, - FlowdataPath: flowdataPath, + Endpoint: endpoint, + MetricsPath: metricsPath, + FlowdataPath: flowdataPath, + VacuumInterval: vacuumInterval, } // set default labels if not configured @@ -90,8 +103,10 @@ func (segment *Prometheus) Run(wg *sync.WaitGroup) { }() var promExporter = Exporter{} - promExporter.Initialize(segment.Labels) - promExporter.ServeEndpoints(segment) + segment.initializeExporter(&promExporter) + if segment.VacuumInterval != nil { + segment.AddVacuumCronJob(&promExporter) + } for msg := range segment.In { labelset := make(map[string]string) @@ -120,6 +135,27 @@ func (segment *Prometheus) Run(wg *sync.WaitGroup) { } } +func (segment *Prometheus) initializeExporter(exporter *Exporter) { + exporter.Initialize(segment.Labels) + exporter.ServeEndpoints(segment) +} + +func (segment *Prometheus) AddVacuumCronJob(promExporter *Exporter) { + scheduler, err := gocron.NewScheduler() + if err != nil { + log.Printf("[Error] Failed inizialiozing prometheus exporter vacuum job: " + err.Error()) + } + _, err = scheduler.NewJob( + gocron.DurationJob(*segment.VacuumInterval), + gocron.NewTask(promExporter.ResetCounter), + ) + if err != nil { + log.Printf("[Error] Failed inizialiozing prometheus exporter vacuum job: " + err.Error()) + } + // start the scheduler + scheduler.Start() +} + func init() { segment := &Prometheus{} segments.RegisterSegment("prometheus", segment) From 2f61b068c713dbb1f0c2ae9887342f4e050b7d3d Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Thu, 21 Nov 2024 08:51:27 +0100 Subject: [PATCH 09/18] skip mongodb test if no db is available --- segments/output/mongodb/mongo_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/segments/output/mongodb/mongo_test.go b/segments/output/mongodb/mongo_test.go index af7bfbf..8f8c80f 100644 --- a/segments/output/mongodb/mongo_test.go +++ b/segments/output/mongodb/mongo_test.go @@ -22,6 +22,9 @@ func TestSegment_Mongodb_passthrough(t *testing.T) { // t.Error("Segment Mongodb is not passing through flows.") // } segment := Mongodb{}.New(map[string]string{"mongodb_uri": "mongodb://localhost:27017/", "database": "testing"}) + if segment == nil { + t.Skip() + } in, out := make(chan *pb.EnrichedFlow), make(chan *pb.EnrichedFlow) segment.Rewire(in, out) @@ -43,6 +46,9 @@ func BenchmarkMongodb_1000(b *testing.B) { os.Stdout, _ = os.Open(os.DevNull) segment := Mongodb{}.New(map[string]string{"mongodb_uri": "mongodb://localhost:27017/", "database": "testing"}) + if segment == nil { + b.Skip() + } in, out := make(chan *pb.EnrichedFlow), make(chan *pb.EnrichedFlow) segment.Rewire(in, out) @@ -64,6 +70,9 @@ func BenchmarkMongodb_10000(b *testing.B) { os.Stdout, _ = os.Open(os.DevNull) segment := Mongodb{}.New(map[string]string{"mongodb_uri": "mongodb://localhost:27017/", "database": "testing", "batchsize": "10000"}) + if segment == nil { + b.Skip() + } in, out := make(chan *pb.EnrichedFlow), make(chan *pb.EnrichedFlow) segment.Rewire(in, out) @@ -85,6 +94,9 @@ func BenchmarkMongodb_100000(b *testing.B) { os.Stdout, _ = os.Open(os.DevNull) segment := Mongodb{}.New(map[string]string{"mongodb_uri": "mongodb://localhost:27017/", "database": "testing", "batchsize": "100000"}) + if segment == nil { + b.Skip() + } in, out := make(chan *pb.EnrichedFlow), make(chan *pb.EnrichedFlow) segment.Rewire(in, out) @@ -106,6 +118,9 @@ func BenchmarkMongodb_100000_with_storage_limit(b *testing.B) { os.Stdout, _ = os.Open(os.DevNull) segment := Mongodb{}.New(map[string]string{"mongodb_uri": "mongodb://localhost:27017/", "database": "testing", "batchsize": "100000", "max_disk_usage": "100 MB"}) + if segment == nil { + b.Skip() + } in, out := make(chan *pb.EnrichedFlow), make(chan *pb.EnrichedFlow) segment.Rewire(in, out) From 1183aed95c34452049b990cf750e04a262e5e1d4 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Thu, 28 Nov 2024 14:18:19 +0100 Subject: [PATCH 10/18] also sync timefields when exporting without legacy flag --- pb/legacyconverter.go | 2 +- segments/output/kafkaproducer/kafkaproducer.go | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/pb/legacyconverter.go b/pb/legacyconverter.go index eb24cc4..788ebdd 100644 --- a/pb/legacyconverter.go +++ b/pb/legacyconverter.go @@ -187,7 +187,7 @@ func (flow *EnrichedFlow) ConvertToLegacyEnrichedFlow() *LegacyEnrichedFlow { DstCountry: flow.DstCountry, TimeFlowStart: flow.TimeFlowStart, - TimeFlowEnd: flow.TimeFlowStart, + TimeFlowEnd: flow.TimeFlowEnd, ASPath: flow.AsPath, sizeCache: flow.sizeCache, diff --git a/segments/output/kafkaproducer/kafkaproducer.go b/segments/output/kafkaproducer/kafkaproducer.go index a8c7b32..a31a6c9 100644 --- a/segments/output/kafkaproducer/kafkaproducer.go +++ b/segments/output/kafkaproducer/kafkaproducer.go @@ -183,10 +183,16 @@ func (segment *KafkaProducer) Run(wg *sync.WaitGroup) { continue } } else { - protoProducerMessage := pb.ProtoProducerMessage{} - protoProducerMessage.EnrichedFlow = *msg - if binary, err = protoProducerMessage.MarshalBinary(); err != nil { - log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) + if msg != nil { + protoProducerMessage := pb.ProtoProducerMessage{} + msg.SyncMissingTimeStamps() + protoProducerMessage.EnrichedFlow = *msg + if binary, err = protoProducerMessage.MarshalBinary(); err != nil { + log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) + continue + } + } else { + log.Printf("[error] KafkaProducer: Empty message") continue } } From b383cb4c7f6f91954987b4ea41d1ecab635ba0a3 Mon Sep 17 00:00:00 2001 From: Sebastian Neuner Date: Tue, 21 Jan 2025 17:12:54 +0100 Subject: [PATCH 11/18] projects moved from github.com/bwNetFlow to github.com/BelWue --- CONFIGURATION.md | 90 +++++++++---------- README.md | 20 ++--- examples/README.md | 18 ++-- examples/plugin/printcustom.go | 2 +- go.mod | 4 +- go.sum | 4 +- main.go | 74 +++++++-------- pb/enrichedflow.proto | 2 +- pipeline/config.go | 4 +- pipeline/pipeline.go | 12 +-- pipeline/pipeline_test.go | 14 +-- segments/alert/http/http.go | 2 +- segments/alert/http/http_test.go | 4 +- .../toptalkers_metrics/toptalkers_metrics.go | 2 +- segments/controlflow/branch/branch.go | 4 +- segments/controlflow/branch/branch_test.go | 4 +- segments/export/clickhouse/clickhouse.go | 4 +- segments/export/clickhouse/clickhouse_test.go | 2 +- segments/export/influx/connector.go | 2 +- segments/export/influx/influx.go | 4 +- segments/export/influx/influx_test.go | 4 +- segments/export/prometheus/prometheus.go | 4 +- segments/export/prometheus/prometheus_test.go | 4 +- segments/filter/aggregate/aggregate.go | 2 +- segments/filter/aggregate/flowcache.go | 2 +- segments/filter/drop/drop.go | 2 +- segments/filter/elephant/elephant.go | 2 +- segments/filter/elephant/elephant_test.go | 4 +- segments/filter/flowfilter/flowfilter.go | 10 +-- segments/filter/flowfilter/flowfilter_test.go | 4 +- segments/input/bpf/bpf.go | 2 +- segments/input/goflow/goflow.go | 4 +- segments/input/goflow/goflow_test.go | 4 +- segments/input/kafkaconsumer/handler.go | 2 +- segments/input/kafkaconsumer/kafkaconsumer.go | 4 +- segments/input/packet/packet.go | 4 +- segments/input/stdin/stdin.go | 4 +- segments/input/stdin/stdin_test.go | 4 +- segments/modify/addcid/addcid.go | 2 +- segments/modify/addcid/addcid_test.go | 4 +- segments/modify/addrstrings/addrstrings.go | 2 +- .../modify/addrstrings/addrstrings_test.go | 4 +- segments/modify/anonymize/anonymize.go | 2 +- segments/modify/anonymize/anonymize_test.go | 4 +- segments/modify/aslookup/aslookup.go | 2 +- segments/modify/aslookup/aslookup_test.go | 4 +- segments/modify/bgp/bgp.go | 4 +- segments/modify/dropfields/dropfields.go | 4 +- segments/modify/dropfields/dropfields_test.go | 4 +- segments/modify/geolocation/geolocation.go | 2 +- .../modify/geolocation/geolocation_test.go | 4 +- segments/modify/normalize/normalize.go | 2 +- segments/modify/normalize/normalize_test.go | 4 +- segments/modify/protomap/protomap.go | 2 +- segments/modify/protomap/protomap_test.go | 4 +- .../modify/remoteaddress/remoteaddress.go | 4 +- .../remoteaddress/remoteaddress_test.go | 4 +- segments/modify/reversedns/reversedns.go | 2 +- segments/modify/reversedns/reversedns_test.go | 4 +- segments/modify/snmp/snmp.go | 2 +- segments/output/csv/csv.go | 4 +- segments/output/csv/csv_test.go | 4 +- segments/output/json/json.go | 2 +- segments/output/json/json_test.go | 4 +- .../output/kafkaproducer/kafkaproducer.go | 4 +- segments/output/lumberjack/client.go | 2 +- segments/output/lumberjack/lumberjack.go | 4 +- segments/output/sqlite/sqlite.go | 4 +- segments/output/sqlite/sqlite_test.go | 4 +- segments/pass/pass.go | 2 +- segments/pass/pass_test.go | 4 +- segments/print/count/count.go | 2 +- segments/print/count/count_test.go | 4 +- segments/print/printdots/printdots.go | 2 +- segments/print/printdots/printdots_test.go | 4 +- segments/print/printflowdump/printflowdump.go | 6 +- .../print/printflowdump/printflowdump_test.go | 4 +- segments/print/toptalkers/toptalkers.go | 2 +- segments/segments.go | 2 +- segments/testing/generator/generator.go | 4 +- 80 files changed, 238 insertions(+), 238 deletions(-) diff --git a/CONFIGURATION.md b/CONFIGURATION.md index 5f43d84..77ffb62 100644 --- a/CONFIGURATION.md +++ b/CONFIGURATION.md @@ -15,7 +15,7 @@ even input or output segments can be chained to one another or be placed in the middle of a pipeline. A list of full configuration examples with their own explanations can be found -[here](https://github.com/bwNetFlow/flowpipeline/tree/master/examples). +[here](https://github.com/BelWue/flowpipeline/tree/master/examples). ## Variable Expansion @@ -47,7 +47,7 @@ config: In addition to this section the detailed godoc can be used to get an overview of available segments by going -[here](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline#section-directories) +[here](https://pkg.go.dev/github.com/BelWue/flowpipeline#section-directories) and clicking `Expand all` in the bottom right. ### Alert Group @@ -67,7 +67,7 @@ conditional, limiting payload data, and multiple receivers. url: https://example.com/postable-endpoint ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/alert/http) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/alert/http) [examples using this segment](https://github.com/search?q=%22segment%3A+http%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) ### Analysis Group @@ -116,7 +116,7 @@ can be used multiple times in one pipeline without metrics getting mixed up. relevantaddress: "destination" ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/analysis/toptalkers-metrics) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/analysis/toptalkers-metrics) [examples using this segment](https://github.com/search?q=%22segment%3A+toptalkers-metrics%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) ### Controlflow Group @@ -169,7 +169,7 @@ ones in a sqlite export: filename: tcponly.sqlite ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/controlflow/branch) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/controlflow/branch) [examples using this segment](https://github.com/search?q=%22segment%3A+branch%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) @@ -196,8 +196,8 @@ condition. invert: false ``` -[flowfilter syntax](https://github.com/bwNetFlow/flowfilter) -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/controlflow/skip) +[flowfilter syntax](https://github.com/BelWue/flowfilter) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/controlflow/skip) [examples using this segment](https://github.com/search?q=%22segment%3A+skip%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) ### Export Group @@ -210,7 +210,7 @@ among others. #### influx The `influx` segment provides a way to write into an Influxdb instance. The `tags` parameter allows any field to be used as a tag and takes a comma-separated list from any -field available in the [protobuf definition](https://github.com/bwNetFlow/flowpipeline/blob/master/pb/flow.proto). +field available in the [protobuf definition](https://github.com/BelWue/flowpipeline/blob/master/pb/flow.proto). The `fields` works in the exact same way, except that these protobuf fields won't be indexed by InfluxDB. Note that some of the above fields might not be present depending on the method @@ -229,7 +229,7 @@ in front of this export segment. fields: "Bytes,Packets" ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/export/prometheus) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/export/prometheus) [examples using this segment](https://github.com/search?q=%22segment%3A+prometheus%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) @@ -237,7 +237,7 @@ in front of this export segment. The `prometheus` segment provides a standard prometheus exporter, exporting its own monitoring info at `:8080/metrics` and its flow data at `:8080/flowdata` by default. The label set included with each metric is freely configurable with a -comma-separated list from any field available in the [protobuf definition](https://github.com/bwNetFlow/flowpipeline/blob/master/pb/flow.proto). +comma-separated list from any field available in the [protobuf definition](https://github.com/BelWue/flowpipeline/blob/master/pb/flow.proto). Note that some of the above fields might not be present depending on the method of flow export, the input segment used in this pipeline, or the modify segments @@ -253,7 +253,7 @@ in front of this export segment. flowdatapath: "/flowdata" ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/export/prometheus) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/export/prometheus) [examples using this segment](https://github.com/search?q=%22segment%3A+prometheus%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) ### Filter Group @@ -269,7 +269,7 @@ pipeline after it. In conjunction with `skip`, this can act as a `flowfilter`. - segment: drop ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/filter/drop) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/filter/drop) [examples using this segment](https://github.com/search?q=%22segment%3A+drop%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### elephant @@ -294,12 +294,12 @@ The ramp up time defults to 0 (disabled), but can be configured to wait for anal rampuptime: 0 ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/elephant) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/elephant) [examples using this segment](https://github.com/search?q=%22segment%3A+elephant%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### flowfilter The `flowfilter` segment uses -[flowfilter syntax](https://github.com/bwNetFlow/flowfilter) to drop flows +[flowfilter syntax](https://github.com/BelWue/flowfilter) to drop flows based on the evaluation value of the provided filter conditional against any flow passing through this segment. @@ -309,8 +309,8 @@ flow passing through this segment. filter: "proto tcp" ``` -[flowfilter syntax](https://github.com/bwNetFlow/flowfilter) -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/filter) +[flowfilter syntax](https://github.com/BelWue/flowfilter) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/filter) [examples using this segment](https://github.com/search?q=%22segment%3A+flowfilter%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) ### Input Group @@ -347,7 +347,7 @@ Roadmap: buffersize: 65536 ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/input/bpf) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/input/bpf) [examples using this segment](https://github.com/search?q=%22segment%3A+bpf%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### goflow @@ -369,7 +369,7 @@ exporters, for instance your network devices. ``` [goflow2 fields](https://github.com/netsampler/goflow2/blob/main/docs/protocols.md) -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/input/goflow) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/input/goflow) [examples using this segment](https://github.com/search?q=%22segment%3A+goflow%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### kafkaconsumer @@ -402,7 +402,7 @@ state for this specific user/topic/consumergroup combination. timeout: 15s ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/input/kafkaconsumer) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/input/kafkaconsumer) [examples using this segment](https://github.com/search?q=%22segment%3A+kafkaconsumer%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) ##### BelWü-connected Entities @@ -447,7 +447,7 @@ The filter parameter available for some methods will filter packets before they inactivetimeout: 15s ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/packet/bpf) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/packet/bpf) [examples using this segment](https://github.com/search?q=%22segment%3A+packet%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### stdin @@ -465,7 +465,7 @@ The `eofcloses` parameter can therefore be used to gracefully terminate the pipe eofcloses: false ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/input/stdin) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/input/stdin) [examples using this segment](https://github.com/search?q=%22segment%3A+stdin%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) ### Modify Group @@ -507,7 +507,7 @@ Roadmap: matchboth: false ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/addcid) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/addcid) [examples using this segment](https://github.com/search?q=%22segment%3A+addcid%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### addrstrings @@ -529,7 +529,7 @@ to remove the original fields. - segment: addrstrings ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/addrstrings) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/addrstrings) #### aslookup The `aslookup` segment can add AS numbers to flows using route collector dumps. @@ -549,7 +549,7 @@ however this is not recommended since this will significantly slow down lookup t ``` [MRT specification](https://datatracker.ietf.org/doc/html/rfc6396) [asnlookup](https://github.com/banviktor/asnlookup) -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/aslookup) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/aslookup) [examples using this segment](https://github.com/search?q=%22segment%3A+aslookup%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### bgp @@ -592,7 +592,7 @@ three are possibly overwritten from the original router export. usefallbackonly: 0 ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/bgp) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/bgp) [examples using this segment](https://github.com/search?q=%22segment%3A+bgp%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### anonymize @@ -612,7 +612,7 @@ Supported Fields for anonymization are `SrcAddr,DstAddr,SamplerAddress,NextHop` ``` [CryptoPan module](https://github.com/Yawning/cryptopan) -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/anonymize) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/anonymize) [examples using this segment](https://github.com/search?q=%22segment%3A+anonymize%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### dropfields @@ -631,7 +631,7 @@ fields parameter. For a list of fields, check our fields: "SrcAddr,DstAddr" ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/dropfields) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/dropfields) [examples using this segment](https://github.com/search?q=%22segment%3A+dropfields%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### geolocation @@ -656,7 +656,7 @@ be dropped. matchboth: false ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/geolocation) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/geolocation) [examples using this segment](https://github.com/search?q=%22segment%3A+geolocation%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### normalize @@ -676,7 +676,7 @@ Roadmap: fallback: 0 ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/normalize) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/normalize) [examples using this segment](https://github.com/search?q=%22segment%3A+normalize%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### protomap @@ -689,14 +689,14 @@ and storage size. - segment: protomap ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/protomap) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/protomap) [examples using this segment](https://github.com/search?q=%22segment%3A+protomap%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### remoteaddress The `remoteaddress` segment determines any given flows remote address and sets the RemoteAddress field up to indicate either SrcAddr or DstAddr as the remote address. This is done by different policies, see -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/remoteaddress) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/remoteaddress) for a detailed explanation. The short version is: @@ -726,7 +726,7 @@ Any optional parameters relate to the `cidr` policy only and behave as in the dropunmatched: false ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/remoteaddress) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/remoteaddress) [examples using this segment](https://github.com/search?q=%22segment%3A+remoteaddress%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### reversedns @@ -743,7 +743,7 @@ refresh interval setting pertains to the internal cache only. refreshinterval: 5m ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/reversedns) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/reversedns) [examples using this segment](https://github.com/search?q=%22segment%3A+reversedns%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### snmpinterface @@ -790,7 +790,7 @@ Roadmap: ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/modify/snmp) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/modify/snmp) [examples using this segment](https://github.com/search?q=%22segment%3A+snmp%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) ### Output Group @@ -814,7 +814,7 @@ By default all fields are exported. To reduce them, use a valid comma seperated fields: "" ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/output/csv) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/output/csv) [examples using this segment](https://github.com/search?q=%22segment%3A+csv%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) @@ -849,7 +849,7 @@ number of other things. topicsuffix: "" ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/output/kafkaproducer) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/output/kafkaproducer) [examples using this segment](https://github.com/search?q=%22segment%3A+kafkaproducer%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### sqlite @@ -876,7 +876,7 @@ throughput when setting this parameter. batchsize: 1000 ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/output/sqlite) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/output/sqlite) [examples using this segment](https://github.com/search?q=%22segment%3A+sqlite%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### json @@ -900,7 +900,7 @@ Simply use `zstdcat` to decompress the archive and remove the last line (`| head zstd: 0 ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/output/json) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/output/json) [examples using this segment](https://github.com/search?q=%22segment%3A+json%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### lumberjack (elastic beats) @@ -969,7 +969,7 @@ strings and [strconv.ParseBool](https://pkg.go.dev/strconv#ParseBool) for allowe queuestatusinterval: "0s" ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/output/lumberjack) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/output/lumberjack) ### Print Group Segments in this group serve to print flows immediately to the user. This is intended for ad-hoc applications and instant feedback use cases. @@ -990,7 +990,7 @@ The result is printed upon termination of the flowpipeline. prefix: "" ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/print/count) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/print/count) [examples using this segment](https://github.com/search?q=%22segment%3A+count%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### printdots @@ -1006,7 +1006,7 @@ necessary. flowsperdot: 5000 ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/print/printdots) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/print/printdots) [examples using this segment](https://github.com/search?q=%22segment%3A+printdots%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### printflowdump @@ -1034,7 +1034,7 @@ flowpipeline invocation's first argument as a filter. The parameter `verbose` changes some output elements, it will for instance add the decoded forwarding status (Cisco-style) in a human-readable manner. The `highlight` parameter causes the output of this segment to be printed in red, -see the [relevant example](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/highlighted_flowdump) +see the [relevant example](https://github.com/BelWue/flowpipeline/tree/master/examples/highlighted_flowdump) for an application. ```yaml @@ -1046,7 +1046,7 @@ for an application. highlight: false ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/print/printflowdump) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/print/printflowdump) [examples using this segment](https://github.com/search?q=%22segment%3A+printflowdump%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) #### toptalkers @@ -1081,7 +1081,7 @@ second are under their thresholds. thresholdpps: 0 topn: 10 ``` -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/print/toptalkers) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/print/toptalkers) [examples using this segment](https://github.com/search?q=%22segment%3A+toptalkers%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) ### Ungrouped @@ -1106,5 +1106,5 @@ Roadmap: ``` [any additional links](https://bwnet.belwue.de) -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline/segments/pass) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/pass) [examples using this segment](https://github.com/search?q=%22segment%3A+pass%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) diff --git a/README.md b/README.md index 807d3da..e436469 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Flow Pipeline -[godoc](https://pkg.go.dev/github.com/bwNetFlow/flowpipeline) +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline) ## About The Project @@ -17,10 +17,10 @@ processing stack into a single piece of software which can be configured to serve any function: * accepting raw Netflow (using [goflow2](https://github.com/netsampler/goflow2)) -* enriching the resulting flow messages ([examples/enricher](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/enricher)) -* writing to and reading from Kafka ([examples/localkafka](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/localkafka)) -* dumping flows to cli (e.g. [flowdump](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/flowdump)) -* providing metrics and insights ([examples/prometheus](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/prometheus)) +* enriching the resulting flow messages ([examples/enricher](https://github.com/BelWue/flowpipeline/tree/master/examples/enricher)) +* writing to and reading from Kafka ([examples/localkafka](https://github.com/BelWue/flowpipeline/tree/master/examples/localkafka)) +* dumping flows to cli (e.g. [flowdump](https://github.com/BelWue/flowpipeline/tree/master/examples/flowdump)) +* providing metrics and insights ([examples/prometheus](https://github.com/BelWue/flowpipeline/tree/master/examples/prometheus)) * and many more... ## Getting Started @@ -35,7 +35,7 @@ you'll either want to create one or call it from any example directory (and maybe follow the instructions there). ### Binary Releases -Download our [latest release](https://github.com/bwNetFlow/flowpipeline/releases) +Download our [latest release](https://github.com/BelWue/flowpipeline/releases) and run it, same as if you compiled it yourself. The default, dynamically linked version requires a reasonably recent system @@ -43,11 +43,11 @@ The default, dynamically linked version requires a reasonably recent system As a fallback option, the static binaries will work in older environments (CentOS 7, Debian 10, ...), but come without the segments that require CGO/dynamically linked code (`bpf`, `sqlite`, and plugin support, check -[CONFIGURATION.md](https://github.com/bwNetFlow/flowpipeline/blob/master/CONFIGURATION.md)). +[CONFIGURATION.md](https://github.com/BelWue/flowpipeline/blob/master/CONFIGURATION.md)). ### Container Releases A ready to use container is provided as `bwnetflow/flowpipeline`, you can check -it out on [GitHub container registry](https://github.com/bwNetFlow/flowpipeline/pkgs/container/flowpipeline). +it out on [GitHub container registry](https://github.com/BelWue/flowpipeline/pkgs/container/flowpipeline). Configurations referencing other files (geolocation databases for instance) will work in a container without extra edits. This is because the volume @@ -62,7 +62,7 @@ docker run -v ./examples/xy:/config flowpipeline ## Configuration -Refer to [CONFIGURATION.md](https://github.com/bwNetFlow/flowpipeline/blob/master/CONFIGURATION.md) +Refer to [CONFIGURATION.md](https://github.com/BelWue/flowpipeline/blob/master/CONFIGURATION.md) for the full guide. Other than that, looking at the examples should give you a good idea what the config looks like in detail and what the possible applications are. For sake of completeness, here's another minimal example @@ -85,7 +85,7 @@ If you find that the existing segments lack some functionality or you require some very specific behaviour, it is possible to include segments as a plugin. This is done using the `-p yourplugin.so` commandline option and your own custom module. See -[examples/plugin](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/plugin) +[examples/plugin](https://github.com/BelWue/flowpipeline/tree/master/examples/plugin) for a basic example and instructions on how to compile your plugin. Note that this requires CGO and thus will not work using the static binary diff --git a/examples/README.md b/examples/README.md index 3ecc72d..52f01c7 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,7 +2,7 @@ This collection of example configs is supposed to help users get started using different use cases. A grouped and alphabetically sorted -[reference](https://github.com/bwNetFlow/flowpipeline/blob/master/CONFIGURATION.md), +[reference](https://github.com/BelWue/flowpipeline/blob/master/CONFIGURATION.md), might be the best resource when trying to achieve a specific outcome, this short guide however tries to give new users some idea of what is possible with this tool and present existing users with additional options. @@ -17,7 +17,7 @@ all inputs. This segment accesses local network interfaces using raw sockets, as for instance tcpdump does. Relevant examples are: -* [./flowdump/bpf.yml](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/flowdump/bpf.yml) -- create a tcpdump style view with custom filtering from CLI using local +* [./flowdump/bpf.yml](https://github.com/BelWue/flowpipeline/tree/master/examples/flowdump/bpf.yml) -- create a tcpdump style view with custom filtering from CLI using local interfaces @@ -25,7 +25,7 @@ Relevant examples are: This segment allows listening for raw IPFIX, Netflow, or sFlow by using goflow2's API. Relevant examples are: -* [./localkafka/write.yml](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/localkafka) -- emulate plain goflow2 and write flows to a Kafka topic for the following section to use +* [./localkafka/write.yml](https://github.com/BelWue/flowpipeline/tree/master/examples/localkafka) -- emulate plain goflow2 and write flows to a Kafka topic for the following section to use ## `kafkaconsumer` @@ -33,9 +33,9 @@ This segment accesses streams of flows generated by another pipeline using `kafkaproducer` or [goflow2](https://github.com/netsampler/goflow2). Relevant examples are: -* [./flowdump/kafkaflowdump.yml](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/flowdump/kafkaflowdump.yml) -- create a tcpdump style view with custom filtering from CLI -* [./flowdump/highlight.yml](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/flowdump/highlight.yml) -- create a tcpdump style view but use the filtering conditional to highlight desired flows instead of dropping undesired flows -* [./enricher](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/enricher) -- enrich flows with various bits of data and store them back in Kafka -* [./reducer](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/reducer) -- strip flows of fields and store them back in Kafka -* [./splitter](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/splitter) -- distribute flows to multiple Kafka topics based on a field -* [./anonymizer](https://github.com/bwNetFlow/flowpipeline/tree/master/examples/anonymizer) -- anonymize IP addresses using Crypto PAn +* [./flowdump/kafkaflowdump.yml](https://github.com/BelWue/flowpipeline/tree/master/examples/flowdump/kafkaflowdump.yml) -- create a tcpdump style view with custom filtering from CLI +* [./flowdump/highlight.yml](https://github.com/BelWue/flowpipeline/tree/master/examples/flowdump/highlight.yml) -- create a tcpdump style view but use the filtering conditional to highlight desired flows instead of dropping undesired flows +* [./enricher](https://github.com/BelWue/flowpipeline/tree/master/examples/enricher) -- enrich flows with various bits of data and store them back in Kafka +* [./reducer](https://github.com/BelWue/flowpipeline/tree/master/examples/reducer) -- strip flows of fields and store them back in Kafka +* [./splitter](https://github.com/BelWue/flowpipeline/tree/master/examples/splitter) -- distribute flows to multiple Kafka topics based on a field +* [./anonymizer](https://github.com/BelWue/flowpipeline/tree/master/examples/anonymizer) -- anonymize IP addresses using Crypto PAn diff --git a/examples/plugin/printcustom.go b/examples/plugin/printcustom.go index 9509fdb..a245e67 100644 --- a/examples/plugin/printcustom.go +++ b/examples/plugin/printcustom.go @@ -6,7 +6,7 @@ import ( "fmt" "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) // This is a short example on how to write custom segments and load them as a plugin. diff --git a/go.mod b/go.mod index ec97f55..d5f4800 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/bwNetFlow/flowpipeline +module github.com/BelWue/flowpipeline go 1.20 @@ -11,7 +11,7 @@ require ( github.com/asecurityteam/rolling v2.0.4+incompatible github.com/banviktor/asnlookup v0.1.0 github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05 - github.com/bwNetFlow/flowfilter v0.0.0-20221025122858-60746fa15915 + github.com/BelWue/flowfilter v0.0.0-20221025122858-60746fa15915 github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04 github.com/bwNetFlow/protobuf/go v0.0.0-20211004083441-61e193b4b342 github.com/dustin/go-humanize v1.0.1 diff --git a/go.sum b/go.sum index 5d47c55..3d53a0f 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,8 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05 h1:/H/qIQ0bo3uVWV9ILwv7dIR6r4MsHmqk+Nc7zGT4/0s= github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05/go.mod h1:DuJLqsHWPJZpyo1yfuHEMjSlQlPjXWntTjGAHJCt4ns= -github.com/bwNetFlow/flowfilter v0.0.0-20221025122858-60746fa15915 h1:RN9oNbfTMlAlVznyp0pI5LOZnB+rjnB/Lmzd23UVyQY= -github.com/bwNetFlow/flowfilter v0.0.0-20221025122858-60746fa15915/go.mod h1:g+jR9KOBdcsGSdRLf8Q5ii7FgwumWPs83gU8pbBQ/4k= +github.com/BelWue/flowfilter v0.0.0-20221025122858-60746fa15915 h1:RN9oNbfTMlAlVznyp0pI5LOZnB+rjnB/Lmzd23UVyQY= +github.com/BelWue/flowfilter v0.0.0-20221025122858-60746fa15915/go.mod h1:g+jR9KOBdcsGSdRLf8Q5ii7FgwumWPs83gU8pbBQ/4k= github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04 h1:mm0/N8cMAdc5TRsmAkrhnPIdOm0ZqbT7uUC9Wt/21mk= github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04/go.mod h1:rtoxrzCig192Z9SYgF7J58r3qgnJ09yI3pnPVPf9+3U= github.com/bwNetFlow/protobuf/go v0.0.0-20211004083441-61e193b4b342 h1:CrEmmSVFs3Ssceezrj/KyLuTvelGH8CZkNLgVxYrQ4o= diff --git a/main.go b/main.go index 9da6133..83cbf5c 100644 --- a/main.go +++ b/main.go @@ -14,55 +14,55 @@ import ( "plugin" "strings" - "github.com/bwNetFlow/flowpipeline/pipeline" + "github.com/BelWue/flowpipeline/pipeline" "github.com/hashicorp/logutils" - _ "github.com/bwNetFlow/flowpipeline/segments/alert/http" + _ "github.com/BelWue/flowpipeline/segments/alert/http" - _ "github.com/bwNetFlow/flowpipeline/segments/controlflow/branch" + _ "github.com/BelWue/flowpipeline/segments/controlflow/branch" - _ "github.com/bwNetFlow/flowpipeline/segments/export/clickhouse" - _ "github.com/bwNetFlow/flowpipeline/segments/export/influx" - _ "github.com/bwNetFlow/flowpipeline/segments/export/prometheus" + _ "github.com/BelWue/flowpipeline/segments/export/clickhouse" + _ "github.com/BelWue/flowpipeline/segments/export/influx" + _ "github.com/BelWue/flowpipeline/segments/export/prometheus" - _ "github.com/bwNetFlow/flowpipeline/segments/filter/drop" - _ "github.com/bwNetFlow/flowpipeline/segments/filter/elephant" + _ "github.com/BelWue/flowpipeline/segments/filter/drop" + _ "github.com/BelWue/flowpipeline/segments/filter/elephant" - _ "github.com/bwNetFlow/flowpipeline/segments/filter/flowfilter" + _ "github.com/BelWue/flowpipeline/segments/filter/flowfilter" - _ "github.com/bwNetFlow/flowpipeline/segments/input/bpf" - _ "github.com/bwNetFlow/flowpipeline/segments/input/goflow" - _ "github.com/bwNetFlow/flowpipeline/segments/input/kafkaconsumer" - _ "github.com/bwNetFlow/flowpipeline/segments/input/packet" - _ "github.com/bwNetFlow/flowpipeline/segments/input/stdin" + _ "github.com/BelWue/flowpipeline/segments/input/bpf" + _ "github.com/BelWue/flowpipeline/segments/input/goflow" + _ "github.com/BelWue/flowpipeline/segments/input/kafkaconsumer" + _ "github.com/BelWue/flowpipeline/segments/input/packet" + _ "github.com/BelWue/flowpipeline/segments/input/stdin" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/addcid" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/addrstrings" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/anonymize" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/aslookup" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/bgp" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/dropfields" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/geolocation" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/normalize" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/protomap" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/remoteaddress" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/reversedns" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/snmp" + _ "github.com/BelWue/flowpipeline/segments/modify/addcid" + _ "github.com/BelWue/flowpipeline/segments/modify/addrstrings" + _ "github.com/BelWue/flowpipeline/segments/modify/anonymize" + _ "github.com/BelWue/flowpipeline/segments/modify/aslookup" + _ "github.com/BelWue/flowpipeline/segments/modify/bgp" + _ "github.com/BelWue/flowpipeline/segments/modify/dropfields" + _ "github.com/BelWue/flowpipeline/segments/modify/geolocation" + _ "github.com/BelWue/flowpipeline/segments/modify/normalize" + _ "github.com/BelWue/flowpipeline/segments/modify/protomap" + _ "github.com/BelWue/flowpipeline/segments/modify/remoteaddress" + _ "github.com/BelWue/flowpipeline/segments/modify/reversedns" + _ "github.com/BelWue/flowpipeline/segments/modify/snmp" - _ "github.com/bwNetFlow/flowpipeline/segments/pass" + _ "github.com/BelWue/flowpipeline/segments/pass" - _ "github.com/bwNetFlow/flowpipeline/segments/output/csv" - _ "github.com/bwNetFlow/flowpipeline/segments/output/json" - _ "github.com/bwNetFlow/flowpipeline/segments/output/kafkaproducer" - _ "github.com/bwNetFlow/flowpipeline/segments/output/lumberjack" - _ "github.com/bwNetFlow/flowpipeline/segments/output/sqlite" + _ "github.com/BelWue/flowpipeline/segments/output/csv" + _ "github.com/BelWue/flowpipeline/segments/output/json" + _ "github.com/BelWue/flowpipeline/segments/output/kafkaproducer" + _ "github.com/BelWue/flowpipeline/segments/output/lumberjack" + _ "github.com/BelWue/flowpipeline/segments/output/sqlite" - _ "github.com/bwNetFlow/flowpipeline/segments/print/count" - _ "github.com/bwNetFlow/flowpipeline/segments/print/printdots" - _ "github.com/bwNetFlow/flowpipeline/segments/print/printflowdump" - _ "github.com/bwNetFlow/flowpipeline/segments/print/toptalkers" + _ "github.com/BelWue/flowpipeline/segments/print/count" + _ "github.com/BelWue/flowpipeline/segments/print/printdots" + _ "github.com/BelWue/flowpipeline/segments/print/printflowdump" + _ "github.com/BelWue/flowpipeline/segments/print/toptalkers" - _ "github.com/bwNetFlow/flowpipeline/segments/analysis/toptalkers_metrics" + _ "github.com/BelWue/flowpipeline/segments/analysis/toptalkers_metrics" ) var Version string diff --git a/pb/enrichedflow.proto b/pb/enrichedflow.proto index 10a902b..2a02b10 100644 --- a/pb/enrichedflow.proto +++ b/pb/enrichedflow.proto @@ -1,6 +1,6 @@ syntax = "proto3"; package flowpb; -option go_package = "github.com/bwNetFlow/flowpipeline/pb;"; +option go_package = "github.com/BelWue/flowpipeline/pb;"; message EnrichedFlow { diff --git a/pipeline/config.go b/pipeline/config.go index f1359a0..fea434e 100644 --- a/pipeline/config.go +++ b/pipeline/config.go @@ -6,8 +6,8 @@ import ( "os" "strconv" - "github.com/bwNetFlow/flowpipeline/segments" - "github.com/bwNetFlow/flowpipeline/segments/controlflow/branch" + "github.com/BelWue/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments/controlflow/branch" "gopkg.in/yaml.v2" ) diff --git a/pipeline/pipeline.go b/pipeline/pipeline.go index 08defe1..c356f92 100644 --- a/pipeline/pipeline.go +++ b/pipeline/pipeline.go @@ -5,12 +5,12 @@ import ( "log" "sync" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" - "github.com/bwNetFlow/flowpipeline/segments/filter/drop" - "github.com/bwNetFlow/flowpipeline/segments/filter/elephant" - "github.com/bwNetFlow/flowpipeline/segments/filter/flowfilter" - "github.com/bwNetFlow/flowpipeline/segments/pass" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments/filter/drop" + "github.com/BelWue/flowpipeline/segments/filter/elephant" + "github.com/BelWue/flowpipeline/segments/filter/flowfilter" + "github.com/BelWue/flowpipeline/segments/pass" ) // Basically a list of segments. It further exposes the In and Out channels of diff --git a/pipeline/pipeline_test.go b/pipeline/pipeline_test.go index 45bde00..a31b1d3 100644 --- a/pipeline/pipeline_test.go +++ b/pipeline/pipeline_test.go @@ -3,14 +3,14 @@ package pipeline import ( "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" - "github.com/bwNetFlow/flowpipeline/segments/pass" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments/pass" - _ "github.com/bwNetFlow/flowpipeline/segments/filter/drop" - _ "github.com/bwNetFlow/flowpipeline/segments/filter/flowfilter" - _ "github.com/bwNetFlow/flowpipeline/segments/modify/dropfields" - _ "github.com/bwNetFlow/flowpipeline/segments/testing/generator" + _ "github.com/BelWue/flowpipeline/segments/filter/drop" + _ "github.com/BelWue/flowpipeline/segments/filter/flowfilter" + _ "github.com/BelWue/flowpipeline/segments/modify/dropfields" + _ "github.com/BelWue/flowpipeline/segments/testing/generator" ) func TestPipelineBuild(t *testing.T) { diff --git a/segments/alert/http/http.go b/segments/alert/http/http.go index 3071fda..1e8e545 100644 --- a/segments/alert/http/http.go +++ b/segments/alert/http/http.go @@ -8,7 +8,7 @@ import ( "net/url" "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" "google.golang.org/protobuf/encoding/protojson" ) diff --git a/segments/alert/http/http_test.go b/segments/alert/http/http_test.go index 4c8ad6d..cf2219a 100644 --- a/segments/alert/http/http_test.go +++ b/segments/alert/http/http_test.go @@ -3,8 +3,8 @@ package http import ( "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Http Segment test, passthrough test diff --git a/segments/analysis/toptalkers_metrics/toptalkers_metrics.go b/segments/analysis/toptalkers_metrics/toptalkers_metrics.go index d41fe1c..a154909 100644 --- a/segments/analysis/toptalkers_metrics/toptalkers_metrics.go +++ b/segments/analysis/toptalkers_metrics/toptalkers_metrics.go @@ -9,7 +9,7 @@ import ( "sync/atomic" "time" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) diff --git a/segments/controlflow/branch/branch.go b/segments/controlflow/branch/branch.go index e12dd1a..0311e6b 100644 --- a/segments/controlflow/branch/branch.go +++ b/segments/controlflow/branch/branch.go @@ -4,8 +4,8 @@ import ( "log" "sync" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // This mirrors the proper implementation in the pipeline package. This diff --git a/segments/controlflow/branch/branch_test.go b/segments/controlflow/branch/branch_test.go index 4bc764e..81597dd 100644 --- a/segments/controlflow/branch/branch_test.go +++ b/segments/controlflow/branch/branch_test.go @@ -5,8 +5,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Branch Segment test, passthrough test diff --git a/segments/export/clickhouse/clickhouse.go b/segments/export/clickhouse/clickhouse.go index 2543445..a3d7648 100644 --- a/segments/export/clickhouse/clickhouse.go +++ b/segments/export/clickhouse/clickhouse.go @@ -11,8 +11,8 @@ import ( "sync" "time" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" _ "github.com/ClickHouse/clickhouse-go/v2" ) diff --git a/segments/export/clickhouse/clickhouse_test.go b/segments/export/clickhouse/clickhouse_test.go index 3d41607..9238c79 100644 --- a/segments/export/clickhouse/clickhouse_test.go +++ b/segments/export/clickhouse/clickhouse_test.go @@ -1,5 +1,5 @@ package clickhouse_segment -// "github.com/bwNetFlow/flowpipeline/segments" +// "github.com/BelWue/flowpipeline/segments" // Clickhouse Segment test, TODO: mock clickhouse diff --git a/segments/export/influx/connector.go b/segments/export/influx/connector.go index 197cf76..da74585 100644 --- a/segments/export/influx/connector.go +++ b/segments/export/influx/connector.go @@ -9,7 +9,7 @@ import ( "strconv" "time" - "github.com/bwNetFlow/flowpipeline/pb" + "github.com/BelWue/flowpipeline/pb" influxdb2 "github.com/influxdata/influxdb-client-go/v2" "github.com/influxdata/influxdb-client-go/v2/api/write" ) diff --git a/segments/export/influx/influx.go b/segments/export/influx/influx.go index 0f99bed..77eba13 100644 --- a/segments/export/influx/influx.go +++ b/segments/export/influx/influx.go @@ -12,8 +12,8 @@ import ( "strings" "sync" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) type Influx struct { diff --git a/segments/export/influx/influx_test.go b/segments/export/influx/influx_test.go index 10143ba..28bd708 100644 --- a/segments/export/influx/influx_test.go +++ b/segments/export/influx/influx_test.go @@ -3,8 +3,8 @@ package influx import ( "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Influx Segment test, passthrough test only diff --git a/segments/export/prometheus/prometheus.go b/segments/export/prometheus/prometheus.go index c9779ba..ed54e35 100644 --- a/segments/export/prometheus/prometheus.go +++ b/segments/export/prometheus/prometheus.go @@ -24,8 +24,8 @@ import ( "strings" "sync" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) type Prometheus struct { diff --git a/segments/export/prometheus/prometheus_test.go b/segments/export/prometheus/prometheus_test.go index b5e8875..6593ce0 100644 --- a/segments/export/prometheus/prometheus_test.go +++ b/segments/export/prometheus/prometheus_test.go @@ -3,8 +3,8 @@ package prometheus import ( "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Prometheus Segment test, passthrough test only diff --git a/segments/filter/aggregate/aggregate.go b/segments/filter/aggregate/aggregate.go index f14bdec..89d02b2 100644 --- a/segments/filter/aggregate/aggregate.go +++ b/segments/filter/aggregate/aggregate.go @@ -3,7 +3,7 @@ package aggregate import ( "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) type Aggregate struct { diff --git a/segments/filter/aggregate/flowcache.go b/segments/filter/aggregate/flowcache.go index 4ca2720..81d7688 100644 --- a/segments/filter/aggregate/flowcache.go +++ b/segments/filter/aggregate/flowcache.go @@ -8,7 +8,7 @@ import ( "sync" "time" - "github.com/bwNetFlow/flowpipeline/pb" + "github.com/BelWue/flowpipeline/pb" "github.com/google/gopacket" "github.com/google/gopacket/layers" "google.golang.org/protobuf/proto" diff --git a/segments/filter/drop/drop.go b/segments/filter/drop/drop.go index 95ad5bb..be82474 100644 --- a/segments/filter/drop/drop.go +++ b/segments/filter/drop/drop.go @@ -3,7 +3,7 @@ package drop import ( "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) type Drop struct { diff --git a/segments/filter/elephant/elephant.go b/segments/filter/elephant/elephant.go index 0e78432..ea2c4fb 100644 --- a/segments/filter/elephant/elephant.go +++ b/segments/filter/elephant/elephant.go @@ -9,7 +9,7 @@ import ( "time" "github.com/asecurityteam/rolling" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) type Elephant struct { diff --git a/segments/filter/elephant/elephant_test.go b/segments/filter/elephant/elephant_test.go index b230aed..e7340b4 100644 --- a/segments/filter/elephant/elephant_test.go +++ b/segments/filter/elephant/elephant_test.go @@ -7,8 +7,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Elephant Segment test, passthrough test diff --git a/segments/filter/flowfilter/flowfilter.go b/segments/filter/flowfilter/flowfilter.go index 248cffd..300240b 100644 --- a/segments/filter/flowfilter/flowfilter.go +++ b/segments/filter/flowfilter/flowfilter.go @@ -1,15 +1,15 @@ // Runs flows through a filter and forwards only matching flows. Reuses our own -// https://github.com/bwNetFlow/flowfilter project, see the docs there. +// https://github.com/BelWue/flowfilter project, see the docs there. package flowfilter import ( "log" "sync" - "github.com/bwNetFlow/flowfilter/parser" - "github.com/bwNetFlow/flowfilter/visitors" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowfilter/parser" + "github.com/BelWue/flowfilter/visitors" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // FIXME: the flowfilter project needs to be updated to new protobuf too diff --git a/segments/filter/flowfilter/flowfilter_test.go b/segments/filter/flowfilter/flowfilter_test.go index 10c1a8d..8efa2da 100644 --- a/segments/filter/flowfilter/flowfilter_test.go +++ b/segments/filter/flowfilter/flowfilter_test.go @@ -8,8 +8,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // FlowFilter Segment testing is basic, the filtering itself is tested in the flowfilter repo diff --git a/segments/input/bpf/bpf.go b/segments/input/bpf/bpf.go index abf9591..977f3a1 100644 --- a/segments/input/bpf/bpf.go +++ b/segments/input/bpf/bpf.go @@ -11,7 +11,7 @@ import ( "github.com/bwNetFlow/bpf_flowexport/flowexport" "github.com/bwNetFlow/bpf_flowexport/packetdump" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) // FIXME: the bpf_flowexport projects needs to adopt the new flowmsg too diff --git a/segments/input/goflow/goflow.go b/segments/input/goflow/goflow.go index d1799c6..5edca5c 100644 --- a/segments/input/goflow/goflow.go +++ b/segments/input/goflow/goflow.go @@ -13,8 +13,8 @@ import ( "strings" "sync" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" "google.golang.org/protobuf/proto" "github.com/netsampler/goflow2/transport" diff --git a/segments/input/goflow/goflow_test.go b/segments/input/goflow/goflow_test.go index d116e46..6b100e9 100644 --- a/segments/input/goflow/goflow_test.go +++ b/segments/input/goflow/goflow_test.go @@ -3,8 +3,8 @@ package goflow import ( "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Goflow Segment test, passthrough test only, functionality is tested by Goflow package diff --git a/segments/input/kafkaconsumer/handler.go b/segments/input/kafkaconsumer/handler.go index cc26337..d9d40f8 100644 --- a/segments/input/kafkaconsumer/handler.go +++ b/segments/input/kafkaconsumer/handler.go @@ -5,7 +5,7 @@ import ( "log" "github.com/Shopify/sarama" - "github.com/bwNetFlow/flowpipeline/pb" + "github.com/BelWue/flowpipeline/pb" "google.golang.org/protobuf/proto" ) diff --git a/segments/input/kafkaconsumer/kafkaconsumer.go b/segments/input/kafkaconsumer/kafkaconsumer.go index dccda25..cb66119 100644 --- a/segments/input/kafkaconsumer/kafkaconsumer.go +++ b/segments/input/kafkaconsumer/kafkaconsumer.go @@ -14,8 +14,8 @@ import ( "time" "github.com/Shopify/sarama" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // FIXME: clean up those todos diff --git a/segments/input/packet/packet.go b/segments/input/packet/packet.go index d83b11c..61d4907 100644 --- a/segments/input/packet/packet.go +++ b/segments/input/packet/packet.go @@ -12,8 +12,8 @@ import ( "sync" "time" - "github.com/bwNetFlow/flowpipeline/segments" - "github.com/bwNetFlow/flowpipeline/segments/filter/aggregate" + "github.com/BelWue/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments/filter/aggregate" "github.com/google/gopacket" "github.com/google/gopacket/layers" "github.com/google/gopacket/pcapgo" diff --git a/segments/input/stdin/stdin.go b/segments/input/stdin/stdin.go index b3608e3..979fdf6 100644 --- a/segments/input/stdin/stdin.go +++ b/segments/input/stdin/stdin.go @@ -7,8 +7,8 @@ import ( "log" "strconv" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" "google.golang.org/protobuf/encoding/protojson" "os" diff --git a/segments/input/stdin/stdin_test.go b/segments/input/stdin/stdin_test.go index daf0aaa..ee453a4 100644 --- a/segments/input/stdin/stdin_test.go +++ b/segments/input/stdin/stdin_test.go @@ -8,8 +8,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // StdIn Segment test, passthrough test only diff --git a/segments/modify/addcid/addcid.go b/segments/modify/addcid/addcid.go index 0778737..d2049a4 100644 --- a/segments/modify/addcid/addcid.go +++ b/segments/modify/addcid/addcid.go @@ -16,7 +16,7 @@ import ( "strconv" "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" "github.com/bwNetFlow/ip_prefix_trie" ) diff --git a/segments/modify/addcid/addcid_test.go b/segments/modify/addcid/addcid_test.go index 31eb16f..7d9353e 100644 --- a/segments/modify/addcid/addcid_test.go +++ b/segments/modify/addcid/addcid_test.go @@ -7,8 +7,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // AddCid Segment tests are thorough and try every combination diff --git a/segments/modify/addrstrings/addrstrings.go b/segments/modify/addrstrings/addrstrings.go index a860748..9880a6f 100644 --- a/segments/modify/addrstrings/addrstrings.go +++ b/segments/modify/addrstrings/addrstrings.go @@ -1,7 +1,7 @@ package addrstrings import ( - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" "sync" ) diff --git a/segments/modify/addrstrings/addrstrings_test.go b/segments/modify/addrstrings/addrstrings_test.go index 18e5d49..8e3f84c 100644 --- a/segments/modify/addrstrings/addrstrings_test.go +++ b/segments/modify/addrstrings/addrstrings_test.go @@ -1,8 +1,8 @@ package addrstrings import ( - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" "reflect" "testing" ) diff --git a/segments/modify/anonymize/anonymize.go b/segments/modify/anonymize/anonymize.go index 618d818..f32744d 100644 --- a/segments/modify/anonymize/anonymize.go +++ b/segments/modify/anonymize/anonymize.go @@ -9,7 +9,7 @@ import ( "sync" cryptopan "github.com/Yawning/cryptopan" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) type Anonymize struct { diff --git a/segments/modify/anonymize/anonymize_test.go b/segments/modify/anonymize/anonymize_test.go index 9a958e4..ac86edb 100644 --- a/segments/modify/anonymize/anonymize_test.go +++ b/segments/modify/anonymize/anonymize_test.go @@ -8,8 +8,8 @@ import ( "testing" cryptopan "github.com/Yawning/cryptopan" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Influx Segment test, passthrough test only diff --git a/segments/modify/aslookup/aslookup.go b/segments/modify/aslookup/aslookup.go index a3ddb37..d052de6 100644 --- a/segments/modify/aslookup/aslookup.go +++ b/segments/modify/aslookup/aslookup.go @@ -7,7 +7,7 @@ import ( "sync" "github.com/banviktor/asnlookup/pkg/database" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) type AsLookup struct { diff --git a/segments/modify/aslookup/aslookup_test.go b/segments/modify/aslookup/aslookup_test.go index 80b3f57..a52d8f0 100644 --- a/segments/modify/aslookup/aslookup_test.go +++ b/segments/modify/aslookup/aslookup_test.go @@ -3,8 +3,8 @@ package aslookup import ( "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // TODO: write tests for this diff --git a/segments/modify/bgp/bgp.go b/segments/modify/bgp/bgp.go index 3de8589..9cf22af 100644 --- a/segments/modify/bgp/bgp.go +++ b/segments/modify/bgp/bgp.go @@ -9,8 +9,8 @@ import ( "sync" "github.com/BelWue/bgp_routeinfo/routeinfo" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" "gopkg.in/yaml.v2" ) diff --git a/segments/modify/dropfields/dropfields.go b/segments/modify/dropfields/dropfields.go index 3d8b960..03486e8 100644 --- a/segments/modify/dropfields/dropfields.go +++ b/segments/modify/dropfields/dropfields.go @@ -8,8 +8,8 @@ import ( "strings" "sync" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) type Policy int diff --git a/segments/modify/dropfields/dropfields_test.go b/segments/modify/dropfields/dropfields_test.go index 2763fb9..95faf60 100644 --- a/segments/modify/dropfields/dropfields_test.go +++ b/segments/modify/dropfields/dropfields_test.go @@ -1,8 +1,8 @@ package dropfields import ( - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" "io" "log" "os" diff --git a/segments/modify/geolocation/geolocation.go b/segments/modify/geolocation/geolocation.go index ee6749b..94b05d5 100644 --- a/segments/modify/geolocation/geolocation.go +++ b/segments/modify/geolocation/geolocation.go @@ -9,7 +9,7 @@ import ( "strconv" "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" maxmind "github.com/oschwald/maxminddb-golang" ) diff --git a/segments/modify/geolocation/geolocation_test.go b/segments/modify/geolocation/geolocation_test.go index 76f99ef..4dae26c 100644 --- a/segments/modify/geolocation/geolocation_test.go +++ b/segments/modify/geolocation/geolocation_test.go @@ -7,8 +7,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // GeoLocation Segment tests are thorough and try every combination diff --git a/segments/modify/normalize/normalize.go b/segments/modify/normalize/normalize.go index c372b38..7fa443e 100644 --- a/segments/modify/normalize/normalize.go +++ b/segments/modify/normalize/normalize.go @@ -6,7 +6,7 @@ import ( "strconv" "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) type Normalize struct { diff --git a/segments/modify/normalize/normalize_test.go b/segments/modify/normalize/normalize_test.go index bae086d..f13327e 100644 --- a/segments/modify/normalize/normalize_test.go +++ b/segments/modify/normalize/normalize_test.go @@ -7,8 +7,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Normalize Segment test, in-flow SampleingRate test diff --git a/segments/modify/protomap/protomap.go b/segments/modify/protomap/protomap.go index 384e2db..2b3cfc3 100644 --- a/segments/modify/protomap/protomap.go +++ b/segments/modify/protomap/protomap.go @@ -5,7 +5,7 @@ package protomap import ( "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) type Protomap struct { diff --git a/segments/modify/protomap/protomap_test.go b/segments/modify/protomap/protomap_test.go index 8d329de..6874c22 100644 --- a/segments/modify/protomap/protomap_test.go +++ b/segments/modify/protomap/protomap_test.go @@ -7,8 +7,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Protomap Segment test, passthrough test only diff --git a/segments/modify/remoteaddress/remoteaddress.go b/segments/modify/remoteaddress/remoteaddress.go index 713ba10..5265252 100644 --- a/segments/modify/remoteaddress/remoteaddress.go +++ b/segments/modify/remoteaddress/remoteaddress.go @@ -36,8 +36,8 @@ import ( "strconv" "sync" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" "github.com/bwNetFlow/ip_prefix_trie" ) diff --git a/segments/modify/remoteaddress/remoteaddress_test.go b/segments/modify/remoteaddress/remoteaddress_test.go index 9683213..3970469 100644 --- a/segments/modify/remoteaddress/remoteaddress_test.go +++ b/segments/modify/remoteaddress/remoteaddress_test.go @@ -7,8 +7,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // RemoteAddress Segment testing is basically checking whether switch/case is working okay... diff --git a/segments/modify/reversedns/reversedns.go b/segments/modify/reversedns/reversedns.go index 4604003..f919a3a 100644 --- a/segments/modify/reversedns/reversedns.go +++ b/segments/modify/reversedns/reversedns.go @@ -8,7 +8,7 @@ import ( "sync" "time" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" "github.com/rs/dnscache" ) diff --git a/segments/modify/reversedns/reversedns_test.go b/segments/modify/reversedns/reversedns_test.go index 148e1d9..201a6d7 100644 --- a/segments/modify/reversedns/reversedns_test.go +++ b/segments/modify/reversedns/reversedns_test.go @@ -3,8 +3,8 @@ package reversedns import ( "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // TODO: create test with a fixes reverse dns address diff --git a/segments/modify/snmp/snmp.go b/segments/modify/snmp/snmp.go index 7d4ee8c..39c8f20 100644 --- a/segments/modify/snmp/snmp.go +++ b/segments/modify/snmp/snmp.go @@ -13,7 +13,7 @@ import ( "time" "github.com/alouca/gosnmp" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" cache "github.com/patrickmn/go-cache" ) diff --git a/segments/output/csv/csv.go b/segments/output/csv/csv.go index 9a48d59..efe270a 100644 --- a/segments/output/csv/csv.go +++ b/segments/output/csv/csv.go @@ -14,8 +14,8 @@ import ( "strings" "sync" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) type Csv struct { diff --git a/segments/output/csv/csv_test.go b/segments/output/csv/csv_test.go index fc73ed2..27eca67 100644 --- a/segments/output/csv/csv_test.go +++ b/segments/output/csv/csv_test.go @@ -8,8 +8,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Csv Segment test, passthrough test diff --git a/segments/output/json/json.go b/segments/output/json/json.go index 8157097..0b6e765 100644 --- a/segments/output/json/json.go +++ b/segments/output/json/json.go @@ -10,7 +10,7 @@ import ( "strconv" "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" "google.golang.org/protobuf/encoding/protojson" ) diff --git a/segments/output/json/json_test.go b/segments/output/json/json_test.go index c96e26e..dd88251 100644 --- a/segments/output/json/json_test.go +++ b/segments/output/json/json_test.go @@ -7,8 +7,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Json Segment test, passthrough test only diff --git a/segments/output/kafkaproducer/kafkaproducer.go b/segments/output/kafkaproducer/kafkaproducer.go index f731b58..8812cca 100644 --- a/segments/output/kafkaproducer/kafkaproducer.go +++ b/segments/output/kafkaproducer/kafkaproducer.go @@ -14,8 +14,8 @@ import ( "time" "github.com/Shopify/sarama" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" "google.golang.org/protobuf/proto" ) diff --git a/segments/output/lumberjack/client.go b/segments/output/lumberjack/client.go index b29561c..577ff8f 100644 --- a/segments/output/lumberjack/client.go +++ b/segments/output/lumberjack/client.go @@ -3,7 +3,7 @@ package lumberjack import ( "crypto/tls" "encoding/json" - "github.com/bwNetFlow/flowpipeline/pb" + "github.com/BelWue/flowpipeline/pb" lumber "github.com/elastic/go-lumber/client/v2" "google.golang.org/protobuf/encoding/protojson" "io" diff --git a/segments/output/lumberjack/lumberjack.go b/segments/output/lumberjack/lumberjack.go index 068fb56..ba58142 100644 --- a/segments/output/lumberjack/lumberjack.go +++ b/segments/output/lumberjack/lumberjack.go @@ -2,8 +2,8 @@ package lumberjack import ( - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" "log" "net/url" "runtime" diff --git a/segments/output/sqlite/sqlite.go b/segments/output/sqlite/sqlite.go index 2c35a29..6c1454c 100644 --- a/segments/output/sqlite/sqlite.go +++ b/segments/output/sqlite/sqlite.go @@ -17,8 +17,8 @@ import ( _ "github.com/mattn/go-sqlite3" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) type Sqlite struct { diff --git a/segments/output/sqlite/sqlite_test.go b/segments/output/sqlite/sqlite_test.go index 648174f..3cbac3f 100644 --- a/segments/output/sqlite/sqlite_test.go +++ b/segments/output/sqlite/sqlite_test.go @@ -10,8 +10,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - // "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + // "github.com/BelWue/flowpipeline/segments" ) // Sqlite Segment test, passthrough test only diff --git a/segments/pass/pass.go b/segments/pass/pass.go index 18ab9fd..e3f6790 100644 --- a/segments/pass/pass.go +++ b/segments/pass/pass.go @@ -5,7 +5,7 @@ package pass import ( "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) // The Pass Segment is considered a template for any additional Segments, as it diff --git a/segments/pass/pass_test.go b/segments/pass/pass_test.go index 88a1643..bfb1664 100644 --- a/segments/pass/pass_test.go +++ b/segments/pass/pass_test.go @@ -7,8 +7,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Pass Segment test, passthrough test diff --git a/segments/print/count/count.go b/segments/print/count/count.go index 8cf673d..3bdd467 100644 --- a/segments/print/count/count.go +++ b/segments/print/count/count.go @@ -7,7 +7,7 @@ import ( "log" "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) type Count struct { diff --git a/segments/print/count/count_test.go b/segments/print/count/count_test.go index 2a5d419..c48e10e 100644 --- a/segments/print/count/count_test.go +++ b/segments/print/count/count_test.go @@ -3,8 +3,8 @@ package count import ( "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // Count Segment test, passthrough test only diff --git a/segments/print/printdots/printdots.go b/segments/print/printdots/printdots.go index 6533a78..3de547a 100644 --- a/segments/print/printdots/printdots.go +++ b/segments/print/printdots/printdots.go @@ -7,7 +7,7 @@ import ( "strconv" "sync" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" ) type PrintDots struct { diff --git a/segments/print/printdots/printdots_test.go b/segments/print/printdots/printdots_test.go index d27d858..ebcb56f 100644 --- a/segments/print/printdots/printdots_test.go +++ b/segments/print/printdots/printdots_test.go @@ -3,8 +3,8 @@ package printdots import ( "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // PrintDots Segment test, passthrough test only diff --git a/segments/print/printflowdump/printflowdump.go b/segments/print/printflowdump/printflowdump.go index 743004b..4ec9b5a 100644 --- a/segments/print/printflowdump/printflowdump.go +++ b/segments/print/printflowdump/printflowdump.go @@ -12,9 +12,9 @@ import ( "sync" "time" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" - "github.com/bwNetFlow/flowpipeline/segments/modify/protomap" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments/modify/protomap" "github.com/dustin/go-humanize" ) diff --git a/segments/print/printflowdump/printflowdump_test.go b/segments/print/printflowdump/printflowdump_test.go index 9e26c16..d3a9e0c 100644 --- a/segments/print/printflowdump/printflowdump_test.go +++ b/segments/print/printflowdump/printflowdump_test.go @@ -7,8 +7,8 @@ import ( "sync" "testing" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) // PrintFlowdump Segment test, passthrough test only diff --git a/segments/print/toptalkers/toptalkers.go b/segments/print/toptalkers/toptalkers.go index b94d341..bb28248 100644 --- a/segments/print/toptalkers/toptalkers.go +++ b/segments/print/toptalkers/toptalkers.go @@ -11,7 +11,7 @@ import ( "time" "github.com/asecurityteam/rolling" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/segments" "github.com/dustin/go-humanize" ) diff --git a/segments/segments.go b/segments/segments.go index 5fb3776..58f8504 100644 --- a/segments/segments.go +++ b/segments/segments.go @@ -9,7 +9,7 @@ import ( "sync" "syscall" - "github.com/bwNetFlow/flowpipeline/pb" + "github.com/BelWue/flowpipeline/pb" ) var ( diff --git a/segments/testing/generator/generator.go b/segments/testing/generator/generator.go index dccc70d..238a98f 100644 --- a/segments/testing/generator/generator.go +++ b/segments/testing/generator/generator.go @@ -3,8 +3,8 @@ package generator import ( "sync" - "github.com/bwNetFlow/flowpipeline/pb" - "github.com/bwNetFlow/flowpipeline/segments" + "github.com/BelWue/flowpipeline/pb" + "github.com/BelWue/flowpipeline/segments" ) type Generator struct { From 696b12d8ca834381327de88a1b43214151849797 Mon Sep 17 00:00:00 2001 From: Sebastian Neuner Date: Wed, 22 Jan 2025 10:52:37 +0100 Subject: [PATCH 12/18] updated flowfilter + go mod tidy --- go.mod | 4 +- go.sum | 249 ++------------------------------------------------------- 2 files changed, 10 insertions(+), 243 deletions(-) diff --git a/go.mod b/go.mod index d5f4800..ac82dd5 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.20 require ( github.com/BelWue/bgp_routeinfo v0.0.0-20221004100427-d8095fc566dd + github.com/BelWue/flowfilter v0.0.0-20250121212806-5b5bd3ad70be github.com/ClickHouse/clickhouse-go/v2 v2.6.3 github.com/Shopify/sarama v1.38.1 github.com/Yawning/cryptopan v0.0.0-20170504040949-65bca51288fe @@ -11,7 +12,6 @@ require ( github.com/asecurityteam/rolling v2.0.4+incompatible github.com/banviktor/asnlookup v0.1.0 github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05 - github.com/BelWue/flowfilter v0.0.0-20221025122858-60746fa15915 github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04 github.com/bwNetFlow/protobuf/go v0.0.0-20211004083441-61e193b4b342 github.com/dustin/go-humanize v1.0.1 @@ -37,6 +37,7 @@ require ( github.com/andybalholm/brotli v1.0.5 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bwNetFlow/flowpipeline v0.9.3-beta // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cilium/ebpf v0.10.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -73,7 +74,6 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/osrg/gobgp/v3 v3.11.0 // indirect github.com/paulmach/orb v0.9.0 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pkg/errors v0.9.1 // indirect diff --git a/go.sum b/go.sum index 3d53a0f..0417287 100644 --- a/go.sum +++ b/go.sum @@ -38,20 +38,15 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BelWue/bgp_routeinfo v0.0.0-20221004100427-d8095fc566dd h1:aGTSdKRlP0zIjC7N72yC7mB0aWlNpOtagv+TbvkguCE= github.com/BelWue/bgp_routeinfo v0.0.0-20221004100427-d8095fc566dd/go.mod h1:8kA6yK9VColNYpTVBhQ2qW87/y5bfqjNHBtrHLts1qU= +github.com/BelWue/flowfilter v0.0.0-20250121212806-5b5bd3ad70be h1:iNoZTaU9o/GiJJE3+iZMoQeMlK6qv9jAhAs3lDngGKc= +github.com/BelWue/flowfilter v0.0.0-20250121212806-5b5bd3ad70be/go.mod h1:yWbxHI2dgiQl+CnhpULHRyZZE6fULuNJFzoRHglIYFg= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ClickHouse/ch-go v0.51.2 h1:PesdqjUImi21U61yPKsDhfer8wiQ3geTsjdjZzXd/3s= -github.com/ClickHouse/ch-go v0.51.2/go.mod h1:z+/hEezvvHvRMV/I00CaXBnxOx+td4zRe7HJpBYLwGU= github.com/ClickHouse/ch-go v0.53.0 h1:gD9oP15FW+1oTTYyVzmuVfM+bk5cB5wqdscBIIw/mRA= github.com/ClickHouse/ch-go v0.53.0/go.mod h1:B9htMJ0hii/zrC2hljUKdnagRBuLqtRG/GrU3jqCwRk= -github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0= -github.com/ClickHouse/clickhouse-go/v2 v2.6.1 h1:82UzCrD8cYEb/Bs/LOO3dlBZZyL+SlvvH/xwZF25BIU= -github.com/ClickHouse/clickhouse-go/v2 v2.6.1/go.mod h1:SvXuWqDsiHJE3VAn2+3+nz9W9exOSigyskcs4DAcxJQ= github.com/ClickHouse/clickhouse-go/v2 v2.6.3 h1:T2iboZmzaO3NHF5QRMi7kgUhM/WEhZM5d5P2r+VCsK4= github.com/ClickHouse/clickhouse-go/v2 v2.6.3/go.mod h1:GcNAg9SniIu+BqzOxRsTmXAGvhlSaUm/Y9GFdWUCbX8= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= -github.com/Shopify/sarama v1.37.2 h1:LoBbU0yJPte0cE5TZCGdlzZRmMgMtZU/XgnUKZg9Cv4= -github.com/Shopify/sarama v1.37.2/go.mod h1:Nxye/E+YPru//Bpaorfhc3JsSGYwCaDDj+R4bK52U5o= github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= @@ -62,20 +57,11 @@ github.com/Yawning/cryptopan v0.0.0-20170504040949-65bca51288fe/go.mod h1:tGK+sH github.com/alecthomas/assert/v2 v2.0.3 h1:WKqJODfOiQG0nEJKFKzDIG3E29CN2/4zR9XGJzKIkbg= github.com/alecthomas/participle/v2 v2.0.0-beta.1 h1:qA1IALv09wFD4fQ2anV6MCl1BIInd+Dm+ksI6ES4kfs= github.com/alecthomas/participle/v2 v2.0.0-beta.1/go.mod h1:RC764t6n4L8D8ITAJv0qdokritYSNR3wV5cVwmIEaMM= -github.com/alecthomas/participle/v2 v2.0.0-beta.5 h1:y6dsSYVb1G5eK6mgmy+BgI3Mw35a3WghArZ/Hbebrjo= -github.com/alecthomas/participle/v2 v2.0.0-beta.5/go.mod h1:RC764t6n4L8D8ITAJv0qdokritYSNR3wV5cVwmIEaMM= github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alouca/gologger v0.0.0-20120904114645-7d4b7291de9c h1:k/7/05/5kPRX7HaKyVYlsGVX6XkFTyYLqkqHzceUVlU= github.com/alouca/gologger v0.0.0-20120904114645-7d4b7291de9c/go.mod h1:SI1d/2/wpSTDjHgdS9ZLy6hqvsdhzVYAc8RLztweMpA= github.com/alouca/gosnmp v0.0.0-20170620005048-04d83944c9ab h1:pfx9N/EMDxIwVzGu9JLnmbOMNukW1mfPA9Ymo+S58Ng= github.com/alouca/gosnmp v0.0.0-20170620005048-04d83944c9ab/go.mod h1:kEcj+iUROrUCr7AIrul5NutI2kWv0ns9BL0ezVp1h/Y= -github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= @@ -84,30 +70,23 @@ github.com/asecurityteam/rolling v2.0.4+incompatible h1:WOSeokINZT0IDzYGc5BVcjLl github.com/asecurityteam/rolling v2.0.4+incompatible/go.mod h1:2D4ba5ZfYCWrIMleUgTvc8pmLExEuvu3PDwl+vnG58Q= github.com/banviktor/asnlookup v0.1.0 h1:rErAtlKFoqkkYxySad3BNBmdOksfbMFTdQCp7WaY1Ok= github.com/banviktor/asnlookup v0.1.0/go.mod h1:BtQkoiOTh7jgtnk4QpjEpowoVY9O4I4qGw5NKCcDpZE= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05 h1:/H/qIQ0bo3uVWV9ILwv7dIR6r4MsHmqk+Nc7zGT4/0s= github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05/go.mod h1:DuJLqsHWPJZpyo1yfuHEMjSlQlPjXWntTjGAHJCt4ns= -github.com/BelWue/flowfilter v0.0.0-20221025122858-60746fa15915 h1:RN9oNbfTMlAlVznyp0pI5LOZnB+rjnB/Lmzd23UVyQY= -github.com/BelWue/flowfilter v0.0.0-20221025122858-60746fa15915/go.mod h1:g+jR9KOBdcsGSdRLf8Q5ii7FgwumWPs83gU8pbBQ/4k= +github.com/bwNetFlow/flowpipeline v0.9.3-beta h1:0WcPBteAxL8JcywAt0j8IBCTX9+egrz4s/zd4n4ZL84= +github.com/bwNetFlow/flowpipeline v0.9.3-beta/go.mod h1:GdtC6jnkQm1p9yCseR4VfThb0jMZi8UAV+b51J2LhYM= github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04 h1:mm0/N8cMAdc5TRsmAkrhnPIdOm0ZqbT7uUC9Wt/21mk= github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04/go.mod h1:rtoxrzCig192Z9SYgF7J58r3qgnJ09yI3pnPVPf9+3U= github.com/bwNetFlow/protobuf/go v0.0.0-20211004083441-61e193b4b342 h1:CrEmmSVFs3Ssceezrj/KyLuTvelGH8CZkNLgVxYrQ4o= github.com/bwNetFlow/protobuf/go v0.0.0-20211004083441-61e193b4b342/go.mod h1:kBaPxJ+ZXKXx3DoYF8OQdxtkHtH2xhdUIL51a4OE3as= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.9.3 h1:5KtxXZU+scyERvkJMEm16TbScVvuuMrlhPly78ZMbSc= -github.com/cilium/ebpf v0.9.3/go.mod h1:w27N4UjpaQ9X/DGrSugxUG+H+NhgntDuPb5lCzxCn8A= github.com/cilium/ebpf v0.10.0 h1:nk5HPMeoBXtOzbkZBWym+ZWq1GIiHUsBFXxwewXAHLQ= github.com/cilium/ebpf v0.10.0/go.mod h1:DPiVdY/kT534dgc9ERmvP8mWA+9gvwgKfRvk4nNWnoE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -115,16 +94,9 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/deepmap/oapi-codegen v1.11.0 h1:f/X2NdIkaBKsSdpeuwLnY/vDI0AtPUrmB5LMgc7YD+A= -github.com/deepmap/oapi-codegen v1.11.0/go.mod h1:k+ujhoQGxmQYBZBbxhOZNZf4j08qv5mC+OH+fFTnKxM= github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= @@ -135,8 +107,6 @@ github.com/eapache/channels v1.1.0 h1:F1taHcn7/F0i8DYqKXJnyhJcVpp2kgFcNePxXtnyu4 github.com/eapache/channels v1.1.0/go.mod h1:jMm2qB5Ubtg9zLd+inMZd2/NUvXgzmWXsDaLyQIGfH0= github.com/eapache/go-resiliency v1.3.0 h1:RRL0nge+cWGlxXbUzJ7yMcq6w2XBEr19dCN6HECGaT0= github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 h1:8yY/I9ndfrgrXUbOGObLHKBR4Fl3nZXwM2c7OYTT8hM= github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= @@ -150,14 +120,9 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= github.com/go-faster/errors v0.6.1 h1:nNIPOBkprlKzkThvS/0YaX8Zs9KewLCOSFQS5BU06FI= @@ -165,30 +130,8 @@ github.com/go-faster/errors v0.6.1/go.mod h1:5MGV2/2T9yvlrbhe9pD9LO5Z/2zCSq2T8j+ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -220,7 +163,6 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -257,7 +199,6 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -277,8 +218,6 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/influxdata/influxdb-client-go/v2 v2.11.0 h1:BrHYv38rWkAnp22gIaHFp5LpOCazOqRMRvVE1yW3ym8= -github.com/influxdata/influxdb-client-go/v2 v2.11.0/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= github.com/influxdata/influxdb-client-go/v2 v2.12.2 h1:uYABKdrEKlYm+++qfKdbgaHKBPmoWR5wpbmj6MBB/2g= github.com/influxdata/influxdb-client-go/v2 v2.12.2/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= @@ -295,75 +234,31 @@ github.com/jcmturner/gokrb5/v8 v8.4.3 h1:iTonLeSJOn7MVUtyMT+arAn5AKAPrkilzhGw8wE github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k-sone/critbitgo v1.4.0 h1:l71cTyBGeh6X5ATh6Fibgw3+rtNT80BA0uNNWgkPrbE= github.com/k-sone/critbitgo v1.4.0/go.mod h1:7E6pyoyADnFxlUBEKcnfS49b7SUAQGMK+OAp/UQvo0s= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.14 h1:i7WCKDToww0wA+9qrUZ1xOjp218vfFo3nTU6UHp+gOc= -github.com/klauspost/compress v1.15.14/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.7.2/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= -github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= -github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= -github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= -github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= -github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= -github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx v1.2.24/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= -github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= -github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -371,84 +266,42 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/netsampler/goflow2 v1.1.1 h1:GpVlvPq4yRbyzoiz0Vp3XilNr5js/0UhHcQI7Ol/MDk= github.com/netsampler/goflow2 v1.1.1/go.mod h1:oNIeGj67SjwrRSTEukErjNT1zZ02W9+8M5mSgQCkZC8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oschwald/maxminddb-golang v1.10.0 h1:Xp1u0ZhqkSuopaKmk1WwHtjF0H9Hd9181uj2MQ5Vndg= github.com/oschwald/maxminddb-golang v1.10.0/go.mod h1:Y2ELenReaLAZ0b400URyGwvYxHV1dLIxBuyOsyYjHK0= -github.com/osrg/gobgp/v3 v3.7.0 h1:h+Liq90TsxNKTB/443V8b1o/pwOm94yIsm+gP0RHwOo= -github.com/osrg/gobgp/v3 v3.7.0/go.mod h1:fKQPuk7+4qMiDT5viZTXT/aSEn8yYDkEs5p3NjmU2bw= github.com/osrg/gobgp/v3 v3.11.0 h1:HismNqoeZJ96WoDjxg5A4mAvFmOcuct5QYktFc8euSo= github.com/osrg/gobgp/v3 v3.11.0/go.mod h1:/q/mr+dOuPf5hDlLiatVll1P7BX4pmiXQxd4ZZpUbkg= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/paulmach/orb v0.8.0 h1:W5XAt5yNPNnhaMNEf0xNSkBMJ1LzOzdk2MRlB6EN0Vs= -github.com/paulmach/orb v0.8.0/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A= github.com/paulmach/orb v0.9.0 h1:MwA1DqOKtvCgm7u9RZ/pnYejTeDJPnr0+0oFajBbJqk= github.com/paulmach/orb v0.9.0/go.mod h1:SudmOk85SXtmXAB3sLGyJ6tZy/8pdfrV0o6ef98Xc30= github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= -github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.40.0 h1:Afz7EVRqGg2Mqqf4JuF9vdvp1pi220m55Pi9T2JnO4Q= github.com/prometheus/common v0.40.0/go.mod h1:L65ZJPSmfn/UBWLQIHV7dBrKFidB/wPlF1y5TlSt9OE= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 h1:Lt9DzQALzHoDwMBGJ6v8ObDPR0dzr2a6sXTB1Fq7IHs= github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -457,13 +310,8 @@ github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.9.4 h1:Sd43wM1IWz/s1aVXdOBkjJvuP8UdyqioeE4AmM0QsBs= github.com/spf13/afero v1.9.4/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -472,13 +320,10 @@ github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmq github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= -github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -491,23 +336,13 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207 h1:nn7SOQy8xCu3iXNv7oiBhhEQtbWdnEOMnuKBlHvrqIM= -github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= @@ -518,7 +353,6 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -526,31 +360,19 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opentelemetry.io/otel v1.11.2 h1:YBZcQlsVekzFsFbjygXMOXSs6pialIZxcjfO/mBDmR0= -go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI= go.opentelemetry.io/otel v1.13.0 h1:1ZAKnNQKwBBxFtww/GwxNUyTf0AxkZzrukO8MeXqe4Y= go.opentelemetry.io/otel v1.13.0/go.mod h1:FH3RtdZCzRkJYFTCsAKDy9l/XYjMdNv6QrkFFB8DvVg= -go.opentelemetry.io/otel/trace v1.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZM/+y0= -go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA= go.opentelemetry.io/otel/trace v1.13.0 h1:CBgRZ6ntv+Amuj1jDsMhZtlAPT6gbyIRdaIzFhfBSdY= go.opentelemetry.io/otel/trace v1.13.0/go.mod h1:muCvmmO9KKpvuXSf3KKAXXB2ygNYHQ+ZfI5X08d3tds= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -586,10 +408,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -597,7 +417,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -620,15 +439,8 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= -golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -640,8 +452,6 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -653,17 +463,12 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7 h1:ZrnxWX62AgTKOSagEqxvb3ffipvEDX2pl7E1TdqLqIc= -golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -672,9 +477,7 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -687,8 +490,6 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -697,25 +498,13 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -728,15 +517,11 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -786,12 +571,10 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -854,8 +637,6 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e h1:S9GbmC1iCgvbLyAokVCwiO6tVIrU9Y7c5oMx1V/ki/Y= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec h1:6rwgChOSUfpzJF2/KnLgo+gMaxGpujStSkPWrbhXArU= google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -874,8 +655,6 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -891,31 +670,19 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 7a64bb168750ecf415918944b13fcd460e16d9a6 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Mon, 27 Jan 2025 10:31:58 +0100 Subject: [PATCH 13/18] Added warning when using vaccum parameter --- segments/export/prometheus/prometheus.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/segments/export/prometheus/prometheus.go b/segments/export/prometheus/prometheus.go index c18d8c4..13fca11 100644 --- a/segments/export/prometheus/prometheus.go +++ b/segments/export/prometheus/prometheus.go @@ -36,7 +36,7 @@ type Prometheus struct { MetricsPath string // optional, default is "/metrics" FlowdataPath string // optional, default is "/flowdata" Labels []string // optional, list of labels to be exported - VacuumInterval *time.Duration // optional, intervall in which counters should be reset + VacuumInterval *time.Duration // optional, intervall in which counters should be reset (can lead to dataloss) } func (segment Prometheus) New(config map[string]string) segments.Segment { @@ -62,8 +62,9 @@ func (segment Prometheus) New(config map[string]string) segments.Segment { if config["vacuum_interval"] != "" { vacuumIntervalDuration, err := time.ParseDuration(config["vacuum_interval"]) if err != nil { - log.Println("[info] prometheus: Missing configuration parameter 'flowdatapath'. Using default path \"/flowdata\"") + log.Println("[warning] prometheus: Failed to parse vacuum intervall \"" + config["vacuum_interval"] + "\" - continuing without vacuum interval") } else { + log.Println("[info] prometheus: Setting prometheus vacuum interval to " + config["vacuum_interval"] + " this will lead to data loss of up to one scraping intervall!") vacuumInterval = &vacuumIntervalDuration } } From 925e44b145b8afe8a2641d88519d644ea753fe80 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Tue, 28 Jan 2025 15:54:47 +0100 Subject: [PATCH 14/18] dependency cleanup --- README.md | 2 +- go.mod | 11 +++++------ go.sum | 8 ++++++-- segments/filter/flowfilter/flowfilter.go | 1 - segments/filter/flowfilter/visitor.go | 8 ++++---- segments/input/goflow/goflow.go | 8 +++++--- 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index e436469..4070903 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Flow Pipeline +# Flow PipelineSrcAS [godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline) diff --git a/go.mod b/go.mod index d120b2c..c39ff36 100644 --- a/go.mod +++ b/go.mod @@ -1,14 +1,12 @@ module github.com/BelWue/flowpipeline -go 1.22.7 +go 1.23.2 -toolchain go1.23.2 - -replace github.com/BelWue/flowpipeline => . +replace github.com/BelWue/flowpipeline => github.com/BelWue/flowpipeline v1.3.1-0.20250127122013-c865e669d527 require ( github.com/BelWue/bgp_routeinfo v0.0.0-20221004100427-d8095fc566dd - github.com/BelWue/flowfilter v0.0.0-20250121212806-5b5bd3ad70be + github.com/BelWue/flowfilter v0.0.0-20250128090728-6c516c872577 github.com/ClickHouse/clickhouse-go/v2 v2.30.1 github.com/IBM/sarama v1.45.0 github.com/Yawning/cryptopan v0.0.0-20170504040949-65bca51288fe @@ -35,12 +33,14 @@ require ( require ( github.com/Shopify/sarama v1.38.1 // indirect + github.com/alecthomas/participle/v2 v2.1.1 // indirect github.com/banviktor/go-mrt v0.0.0-20230515165434-0ce2ad0d8984 // indirect github.com/jonboulle/clockwork v0.5.0 // indirect github.com/montanaflynn/stats v0.7.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/oapi-codegen/runtime v1.1.1 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect @@ -55,7 +55,6 @@ require ( require ( github.com/ClickHouse/ch-go v0.63.1 // indirect - github.com/alecthomas/participle/v2 v2.1.1 // indirect github.com/alouca/gologger v0.0.0-20120904114645-7d4b7291de9c // indirect github.com/andybalholm/brotli v1.1.1 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect diff --git a/go.sum b/go.sum index 60da02a..397184b 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ github.com/BelWue/bgp_routeinfo v0.0.0-20221004100427-d8095fc566dd h1:aGTSdKRlP0 github.com/BelWue/bgp_routeinfo v0.0.0-20221004100427-d8095fc566dd/go.mod h1:8kA6yK9VColNYpTVBhQ2qW87/y5bfqjNHBtrHLts1qU= github.com/BelWue/flowfilter v0.0.0-20250121212806-5b5bd3ad70be h1:iNoZTaU9o/GiJJE3+iZMoQeMlK6qv9jAhAs3lDngGKc= github.com/BelWue/flowfilter v0.0.0-20250121212806-5b5bd3ad70be/go.mod h1:yWbxHI2dgiQl+CnhpULHRyZZE6fULuNJFzoRHglIYFg= +github.com/BelWue/flowfilter v0.0.0-20250128090728-6c516c872577 h1:kNTuNEqQuTxhLaryFrI2Jwl0Y/JAqknYiETC1XauB+Y= +github.com/BelWue/flowfilter v0.0.0-20250128090728-6c516c872577/go.mod h1:ulvqwsC5UCcQ4RjzNYpmrcqcr7zGcr2mHw8l/vxz/V8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/ClickHouse/ch-go v0.63.1 h1:s2JyZvWLTCSAGdtjMBBmAgQQHMco6pawLJMOXi0FODM= github.com/ClickHouse/ch-go v0.63.1/go.mod h1:I1kJJCL3WJcBMGe1m+HVK0+nREaG+JOYYBWjrDrF3R0= @@ -18,6 +20,8 @@ github.com/Yawning/cryptopan v0.0.0-20170504040949-65bca51288fe h1:SKdmPMOww/faI github.com/Yawning/cryptopan v0.0.0-20170504040949-65bca51288fe/go.mod h1:tGK+sH41V0mnyFBVWQoRyj7neHPwQwPM1KJ3PfS6dTI= github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/participle/v2 v2.1.0 h1:z7dElHRrOEEq45F2TG5cbQihMtNTv8vwldytDj7Wrz4= +github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= @@ -198,8 +202,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/dnscache v0.0.0-20230804202142-fc85eb664529 h1:18kd+8ZUlt/ARXhljq+14TwAoKa61q6dX8jtwOf6DH8= github.com/rs/dnscache v0.0.0-20230804202142-fc85eb664529/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= diff --git a/segments/filter/flowfilter/flowfilter.go b/segments/filter/flowfilter/flowfilter.go index dd4bb94..4000fd1 100644 --- a/segments/filter/flowfilter/flowfilter.go +++ b/segments/filter/flowfilter/flowfilter.go @@ -11,7 +11,6 @@ import ( "github.com/BelWue/flowpipeline/segments" ) -// FIXME: the flowfilter project needs to be updated to new protobuf too type FlowFilter struct { segments.BaseFilterSegment Filter string // optional, default is empty diff --git a/segments/filter/flowfilter/visitor.go b/segments/filter/flowfilter/visitor.go index f50a354..5a9f0d3 100644 --- a/segments/filter/flowfilter/visitor.go +++ b/segments/filter/flowfilter/visitor.go @@ -47,7 +47,7 @@ func (f *Filter) Visit(n parser.Node, next func() error) error { case *parser.IcmpMatch: case *parser.IfSpeedRangeMatch: case *parser.InterfaceMatch: - case *parser.IPTosRangeMatch: + case *parser.IpTosRangeMatch: case *parser.MedRangeMatch: case *parser.LocalPrefRangeMatch: case *parser.NetsizeRangeMatch: @@ -162,8 +162,8 @@ func (f *Filter) Visit(n parser.Node, next func() error) error { (*node).EvalResult = node.Status.EvalResult case node.TcpFlags != nil: (*node).EvalResult = node.TcpFlags.EvalResult - case node.IPTos != nil: - (*node).EvalResult = node.IPTos.EvalResult + case node.IpTos != nil: + (*node).EvalResult = node.IpTos.EvalResult case node.LocalPref != nil: (*node).EvalResult = node.LocalPref.EvalResult case node.Med != nil: @@ -330,7 +330,7 @@ func (f *Filter) Visit(n parser.Node, next func() error) error { (*node).EvalResultSrc = node.Speed.EvalResultSrc (*node).EvalResultDst = node.Speed.EvalResultDst } - case *parser.IPTosRangeMatch: + case *parser.IpTosRangeMatch: (*node).EvalResult, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.IpTos)) if err != nil { return fmt.Errorf("Bad iptos range, lower %d > upper %d", diff --git a/segments/input/goflow/goflow.go b/segments/input/goflow/goflow.go index b4df9e7..4e40b0b 100644 --- a/segments/input/goflow/goflow.go +++ b/segments/input/goflow/goflow.go @@ -155,9 +155,6 @@ func (d *myProtobufDriver) Format(data interface{}) ([]byte, []byte, error) { return nil, b, err } -func (d *myProtobufDriver) Prepare() error { return nil } -func (d *myProtobufDriver) Init(context.Context) error { return nil } - func (segment *Goflow) startGoFlow(transport transport.TransportInterface) { formatter := &myProtobufDriver{} var pipes []utils.FlowPipe @@ -233,3 +230,8 @@ func (segment *Goflow) startGoFlow(transport transport.TransportInterface) { }(listenAddrUrl) } } + +func init() { + segment := &Goflow{} + segments.RegisterSegment("goflow", segment) +} From c83f8bef0ef1ed8878e385f7cdeb160285e65837 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Wed, 29 Jan 2025 15:04:47 +0100 Subject: [PATCH 15/18] Updated go imports to new flowfilter version --- go.mod | 8 ++++---- go.sum | 20 ++++++++------------ 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index c39ff36..88d0265 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ replace github.com/BelWue/flowpipeline => github.com/BelWue/flowpipeline v1.3.1- require ( github.com/BelWue/bgp_routeinfo v0.0.0-20221004100427-d8095fc566dd - github.com/BelWue/flowfilter v0.0.0-20250128090728-6c516c872577 + github.com/BelWue/flowfilter v0.0.0-20250129140213-b11ce00e4643 github.com/ClickHouse/clickhouse-go/v2 v2.30.1 github.com/IBM/sarama v1.45.0 github.com/Yawning/cryptopan v0.0.0-20170504040949-65bca51288fe @@ -49,8 +49,8 @@ require ( github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 // indirect + golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 // indirect ) require ( @@ -60,7 +60,7 @@ require ( github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cilium/ebpf v0.17.1 + github.com/cilium/ebpf v0.17.2 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da // indirect github.com/eapache/channels v1.1.0 // indirect diff --git a/go.sum b/go.sum index 397184b..c5ecabc 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,7 @@ github.com/BelWue/bgp_routeinfo v0.0.0-20221004100427-d8095fc566dd h1:aGTSdKRlP0zIjC7N72yC7mB0aWlNpOtagv+TbvkguCE= github.com/BelWue/bgp_routeinfo v0.0.0-20221004100427-d8095fc566dd/go.mod h1:8kA6yK9VColNYpTVBhQ2qW87/y5bfqjNHBtrHLts1qU= -github.com/BelWue/flowfilter v0.0.0-20250121212806-5b5bd3ad70be h1:iNoZTaU9o/GiJJE3+iZMoQeMlK6qv9jAhAs3lDngGKc= -github.com/BelWue/flowfilter v0.0.0-20250121212806-5b5bd3ad70be/go.mod h1:yWbxHI2dgiQl+CnhpULHRyZZE6fULuNJFzoRHglIYFg= -github.com/BelWue/flowfilter v0.0.0-20250128090728-6c516c872577 h1:kNTuNEqQuTxhLaryFrI2Jwl0Y/JAqknYiETC1XauB+Y= -github.com/BelWue/flowfilter v0.0.0-20250128090728-6c516c872577/go.mod h1:ulvqwsC5UCcQ4RjzNYpmrcqcr7zGcr2mHw8l/vxz/V8= +github.com/BelWue/flowfilter v0.0.0-20250129140213-b11ce00e4643 h1:lgrEKi3ZJm+emfDS6oWu56bK3Ud3B+MVa8dGGtLMJ/I= +github.com/BelWue/flowfilter v0.0.0-20250129140213-b11ce00e4643/go.mod h1:ulvqwsC5UCcQ4RjzNYpmrcqcr7zGcr2mHw8l/vxz/V8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/ClickHouse/ch-go v0.63.1 h1:s2JyZvWLTCSAGdtjMBBmAgQQHMco6pawLJMOXi0FODM= github.com/ClickHouse/ch-go v0.63.1/go.mod h1:I1kJJCL3WJcBMGe1m+HVK0+nREaG+JOYYBWjrDrF3R0= @@ -20,8 +18,6 @@ github.com/Yawning/cryptopan v0.0.0-20170504040949-65bca51288fe h1:SKdmPMOww/faI github.com/Yawning/cryptopan v0.0.0-20170504040949-65bca51288fe/go.mod h1:tGK+sH41V0mnyFBVWQoRyj7neHPwQwPM1KJ3PfS6dTI= github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/participle/v2 v2.1.0 h1:z7dElHRrOEEq45F2TG5cbQihMtNTv8vwldytDj7Wrz4= -github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= @@ -47,8 +43,8 @@ github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04 h1:mm0/N8 github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04/go.mod h1:rtoxrzCig192Z9SYgF7J58r3qgnJ09yI3pnPVPf9+3U= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cilium/ebpf v0.17.1 h1:G8mzU81R2JA1nE5/8SRubzqvBMmAmri2VL8BIZPWvV0= -github.com/cilium/ebpf v0.17.1/go.mod h1:vay2FaYSmIlv3r8dNACd4mW/OCaZLJKJOo+IHBvCIO8= +github.com/cilium/ebpf v0.17.2 h1:IQTaTVu0vKA8WTemFuBnxW9YbAwMkJVKHsNHW4lHv/g= +github.com/cilium/ebpf v0.17.2/go.mod h1:9X5VAsIOck/nCAp0+nCSVzub1Q7x+zKXXItTMYfNE+E= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -293,8 +289,8 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= -golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA= -golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= +golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -354,8 +350,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 h1:91mG8dNTpkC0uChJUQ9zCiRqx3GEEFOWaRZ0mI6Oj2I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 h1:J1H9f+LEdWAfHcez/4cvaVBox7cOYT+IU6rgqj5x++8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= From 114c120c61155449883fbb4c36da8641ae303297 Mon Sep 17 00:00:00 2001 From: ynHuber Date: Wed, 29 Jan 2025 15:54:10 +0100 Subject: [PATCH 16/18] Updated pipeline go version to 1.23.2 --- .github/workflows/docker-publish.yml | 4 ++++ .github/workflows/master.yml | 4 ++-- .github/workflows/release.yml | 8 ++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index ad13580..a03ca83 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -31,6 +31,10 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v2 + - name: setup go + uses: actions/setup-go@v5.3.0 + with: + go-version: '1.23.2' # Login against a Docker registry except on PR # https://github.com/docker/login-action diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index b2fceef..7f889a4 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -25,9 +25,9 @@ jobs: run: sudo apt-get install -y libpcap-dev - name: setup go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5.3.0 with: - go-version: '1.20' + go-version: '1.23.2' - name: test run: go test ./... diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1804152..54cc93e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,9 +23,9 @@ jobs: run: sudo apt-get install -y libpcap-dev - name: setup go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5.3.0 with: - go-version: '1.20' + go-version: '1.23.2' - name: test before release run: go test ./... @@ -49,6 +49,10 @@ jobs: runs-on: ubuntu-latest needs: build steps: + - name: setup go + uses: actions/setup-go@v3 + with: + go-version: '1.23.2' - name: get binaries from previous job uses: actions/download-artifact@v3 - name: display downloaded files From 68a8e7a888ee090e51e2a29dde3f9ca46a6906b7 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Thu, 30 Jan 2025 09:19:54 +0100 Subject: [PATCH 17/18] Bugfix: Build not completing with CGO_ENABLED=0 Caused by: - Empty mongodb packet - fixed by adding dummy file - Missing exclude of segments/input/bpf/flow_exporter.go for darwin --- .github/workflows/docker-publish.yml | 15 ++++++++------- CONFIGURATION.md | 28 ++++++++++++++++++++++++++++ README.md | 4 ++-- segments/input/bpf/flow_exporter.go | 3 +++ segments/input/packet/dummy.go | 1 + segments/output/mongodb/dummy.go | 3 +++ segments/output/sqlite/dummy.go | 2 ++ 7 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 segments/output/mongodb/dummy.go diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index a03ca83..9f3b7e4 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -29,13 +29,6 @@ jobs: packages: write steps: - - name: Checkout repository - uses: actions/checkout@v2 - - name: setup go - uses: actions/setup-go@v5.3.0 - with: - go-version: '1.23.2' - # Login against a Docker registry except on PR # https://github.com/docker/login-action - name: Log into registry ${{ env.REGISTRY }} @@ -46,6 +39,14 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Checkout repository + uses: actions/checkout@v2 + + - name: setup go + uses: actions/setup-go@v5.3.0 + with: + go-version: '1.23.2' + # Extract metadata (tags, labels) for Docker # https://github.com/docker/metadata-action - name: Extract Docker metadata diff --git a/CONFIGURATION.md b/CONFIGURATION.md index 8421da0..d5c2a87 100644 --- a/CONFIGURATION.md +++ b/CONFIGURATION.md @@ -905,6 +905,34 @@ throughput when setting this parameter. [godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/output/sqlite) [examples using this segment](https://github.com/search?q=%22segment%3A+sqlite%22+extension%3Ayml+repo%3AbwNetFlow%2Fflowpipeline%2Fexamples&type=Code) +#### mongodb +**This segment is unavailable in the static binary release due to its CGO dependency.** + +The `mongodb` segment provides a Mongodb output option. +The connection parameter of the mongodb must be configured in the parameter `mongodb_uri`. +MongoDb is intended to be used as a ringbuffer like storage using capped collections. +The maximumg (unecrypted) disk usage can be set using `max_disk_usage`. +The fields parameter optionally takes a +string of comma-separated fieldnames, e.g. `SrcAddr,Bytes,Packets`. + +The batchsize parameter determines the number of flows stored in memory before +writing them to the database in a transaction made up from as many insert +statements. For the default value of 1000 in-memory flows, benchmarks show that +this should be an okay value for processing at least 1000 flows per second on +most szenarios, i.e. flushing to disk once per second. Mind the expected flow +throughput when setting this parameter. + +```yaml +- segment: mongodb + config: + mongodb_uri: "mongodb://localhost:27017/" + max_disk_usage: "20 GB" + fields: "SrcAddr,DstAddr,SrcPort,DstPort" + +``` + +[godoc](https://pkg.go.dev/github.com/BelWue/flowpipeline/segments/output/sqlite) + #### json The `json` segment provides a JSON output option. It uses stdout by default, but can be instructed to write to file using the filename parameter. diff --git a/README.md b/README.md index 4070903..b8563a1 100644 --- a/README.md +++ b/README.md @@ -39,10 +39,10 @@ Download our [latest release](https://github.com/BelWue/flowpipeline/releases) and run it, same as if you compiled it yourself. The default, dynamically linked version requires a reasonably recent system -(glibc 2.32+, linux 5.11+ for `bpf`, ...) and comes with all features. +(glibc 2.32+, linux 5.11+ for `bpf`, `mongodb` ...) and comes with all features. As a fallback option, the static binaries will work in older environments (CentOS 7, Debian 10, ...), but come without the segments that require -CGO/dynamically linked code (`bpf`, `sqlite`, and plugin support, check +CGO/dynamically linked code (`bpf`, `sqlite`, `mongodb` and plugin support, check [CONFIGURATION.md](https://github.com/BelWue/flowpipeline/blob/master/CONFIGURATION.md)). ### Container Releases diff --git a/segments/input/bpf/flow_exporter.go b/segments/input/bpf/flow_exporter.go index 646420f..5d90406 100644 --- a/segments/input/bpf/flow_exporter.go +++ b/segments/input/bpf/flow_exporter.go @@ -1,3 +1,6 @@ +//go:build linux +// +build linux + package bpf import ( diff --git a/segments/input/packet/dummy.go b/segments/input/packet/dummy.go index 9c40969..7ea8837 100644 --- a/segments/input/packet/dummy.go +++ b/segments/input/packet/dummy.go @@ -1 +1,2 @@ +// required to prevent build error with CGO_ENABLED=0 package packet diff --git a/segments/output/mongodb/dummy.go b/segments/output/mongodb/dummy.go new file mode 100644 index 0000000..81ed1e9 --- /dev/null +++ b/segments/output/mongodb/dummy.go @@ -0,0 +1,3 @@ +// required to prevent build error with CGO_ENABLED=0 due to +// imports github.com/BelWue/flowpipeline/segments/output/mongodb: build constraints exclude all Go files in segments/output/mongodb +package mongodb diff --git a/segments/output/sqlite/dummy.go b/segments/output/sqlite/dummy.go index fef43c1..4ced2d6 100644 --- a/segments/output/sqlite/dummy.go +++ b/segments/output/sqlite/dummy.go @@ -1 +1,3 @@ +// required to prevent build error with CGO_ENABLED=0 due to +// imports github.com/BelWue/flowpipeline/segments/output/sqlite: build constraints exclude all Go files in segments/output/sqlite package sqlite From 1bbb2af31b46b6c377e13890a9a65d6fc40ed669 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Thu, 30 Jan 2025 10:59:39 +0100 Subject: [PATCH 18/18] new go version for docker publish --- .github/workflows/docker-publish.yml | 7 +------ Dockerfile | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 9f3b7e4..d9f2b63 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -41,11 +41,6 @@ jobs: - name: Checkout repository uses: actions/checkout@v2 - - - name: setup go - uses: actions/setup-go@v5.3.0 - with: - go-version: '1.23.2' # Extract metadata (tags, labels) for Docker # https://github.com/docker/metadata-action @@ -58,7 +53,7 @@ jobs: # Build and push Docker image with Buildx (don't push on PR) # https://github.com/docker/build-push-action - name: Build and push Docker image - uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc + uses: docker/build-push-action@v6 with: context: . push: ${{ github.event_name != 'pull_request' }} diff --git a/Dockerfile b/Dockerfile index 53d6754..05280b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.20 AS builder +FROM golang:1.23.2 AS builder RUN apt-get update # add local repo into the builder