45 lines
960 B
Go
45 lines
960 B
Go
|
package netflow
|
||
|
|
||
|
import (
|
||
|
"encoding/csv"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
var funcMapping = map[string]decoderFunc{
|
||
|
"uint": decodeUint,
|
||
|
"hex": decodeHex,
|
||
|
"string": decodeString,
|
||
|
"ip": decodeIP,
|
||
|
"proto": decodeL4Proto,
|
||
|
}
|
||
|
|
||
|
func loadMapping(filename string) (map[string]fieldMapping, error) {
|
||
|
file, err := os.Open(filename)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("opening %q failed: %w", filename, err)
|
||
|
}
|
||
|
defer file.Close()
|
||
|
|
||
|
reader := csv.NewReader(file)
|
||
|
reader.Comma = ','
|
||
|
reader.Comment = '#'
|
||
|
reader.TrimLeadingSpace = true
|
||
|
records, err := reader.ReadAll()
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("reading csv failed: %w", err)
|
||
|
}
|
||
|
|
||
|
mappings := make(map[string]fieldMapping, len(records))
|
||
|
for _, r := range records {
|
||
|
id, name, dtype := r[0], r[1], r[2]
|
||
|
fun, found := funcMapping[dtype]
|
||
|
if !found {
|
||
|
return nil, fmt.Errorf("unknown data-type %q for id %q", dtype, id)
|
||
|
}
|
||
|
mappings[id] = fieldMapping{name, fun}
|
||
|
}
|
||
|
|
||
|
return mappings, nil
|
||
|
}
|