mirror of
https://github.com/akvorado/akvorado.git
synced 2025-12-11 22:14:02 +01:00
Currently, for NetFlow, persist data/options templates and options. This should allow the outlet to restart without loosing any message. Fix #2100
80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
// SPDX-FileCopyrightText: 2024 Free Mobile
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
// Package pb contains the definition of RawFlow, the protobuf-based
|
|
// structure to exchange flows between the inlet and the outlet.
|
|
package pb
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"akvorado/common/helpers/bimap"
|
|
)
|
|
|
|
// Version is the version of the schema. On incompatible changes, this should be
|
|
// bumped.
|
|
var Version = 5
|
|
|
|
var decoderMap = bimap.New(map[RawFlow_Decoder]string{
|
|
RawFlow_DECODER_NETFLOW: "netflow",
|
|
RawFlow_DECODER_SFLOW: "sflow",
|
|
RawFlow_DECODER_GOB: "gob",
|
|
})
|
|
|
|
// MarshalText turns a decoder to text
|
|
func (d RawFlow_Decoder) MarshalText() ([]byte, error) {
|
|
got, ok := decoderMap.LoadValue(d)
|
|
if ok {
|
|
return []byte(got), nil
|
|
}
|
|
return nil, fmt.Errorf("unknown decoder %d", d)
|
|
}
|
|
|
|
// UnmarshalText provides a decoder from text
|
|
func (d *RawFlow_Decoder) UnmarshalText(input []byte) error {
|
|
if len(input) == 0 {
|
|
*d = RawFlow_DECODER_UNSPECIFIED
|
|
return nil
|
|
}
|
|
got, ok := decoderMap.LoadKey(string(input))
|
|
if ok {
|
|
*d = got
|
|
return nil
|
|
}
|
|
return errors.New("unknown decoder")
|
|
}
|
|
|
|
var tsMap = bimap.New(map[RawFlow_TimestampSource]string{
|
|
RawFlow_TS_INPUT: "input", // this is the default value
|
|
RawFlow_TS_NETFLOW_FIRST_SWITCHED: "netflow-first-switched",
|
|
RawFlow_TS_NETFLOW_PACKET: "netflow-packet",
|
|
})
|
|
|
|
// MarshalText turns a timestamp source to text
|
|
func (ts RawFlow_TimestampSource) MarshalText() ([]byte, error) {
|
|
got, ok := tsMap.LoadValue(ts)
|
|
if ok {
|
|
return []byte(got), nil
|
|
}
|
|
return nil, errors.New("unknown timestamp source")
|
|
}
|
|
|
|
// UnmarshalText provides a timestamp source from text
|
|
func (ts *RawFlow_TimestampSource) UnmarshalText(input []byte) error {
|
|
if len(input) == 0 {
|
|
*ts = RawFlow_TS_INPUT
|
|
return nil
|
|
}
|
|
if string(input) == "udp" {
|
|
*ts = RawFlow_TS_INPUT
|
|
return nil
|
|
}
|
|
got, ok := tsMap.LoadKey(string(input))
|
|
if ok {
|
|
*ts = got
|
|
return nil
|
|
}
|
|
return fmt.Errorf("unknown timestamp source %q", string(input))
|
|
}
|