Skip to content

Commit 40e5ef0

Browse files
authored
mapping: allow lists to be mapped (#149)
1 parent 5529d49 commit 40e5ef0

File tree

6 files changed

+83
-32
lines changed

6 files changed

+83
-32
lines changed

cmd/goflow2/mapping.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ ipfix:
66
destination: CustomInteger2
77
# penprovided: false
88
# pen: 0
9+
- field: 137
10+
destination: CustomList_1
11+
penprovided: true
12+
pen: 2636
913
netflowv9:
1014
mapping:
1115
- field: 7

format/common/text.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,17 @@ func FormatMessageReflectCustom(msg interface{}, ext, quotes, sep, sign string,
220220
switch fieldValue.Kind() {
221221
case reflect.String:
222222
fstr[i] = fmt.Sprintf("%s%s%s%s%q", quotes, s, quotes, sign, fieldValue.Interface())
223+
case reflect.Slice:
224+
c := fieldValue.Len()
225+
v := "["
226+
for i := 0; i < c; i++ {
227+
v += fmt.Sprintf("%v", fieldValue.Index(i).Interface())
228+
if i < c-1 {
229+
v += ","
230+
}
231+
}
232+
v += "]"
233+
fstr[i] = fmt.Sprintf("%s%s%s%s%s", quotes, s, quotes, sign, v)
223234
default:
224235
fstr[i] = fmt.Sprintf("%s%s%s%s%v", quotes, s, quotes, sign, fieldValue.Interface())
225236
}

pb/flow.pb.go

Lines changed: 30 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pb/flow.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,6 @@ message FlowMessage {
126126
bytes custom_bytes_4 = 1014;
127127
bytes custom_bytes_5 = 1015;
128128

129+
repeated uint32 custom_list_1 = 1021;
130+
129131
}

producer/reflect.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ func GetBytes(d []byte, offset int, length int) []byte {
4141
return chunk
4242
}
4343

44+
func IsUInt(k reflect.Kind) bool {
45+
return k == reflect.Uint8 || k == reflect.Uint16 || k == reflect.Uint32 || k == reflect.Uint64
46+
}
47+
48+
func IsInt(k reflect.Kind) bool {
49+
return k == reflect.Int8 || k == reflect.Int16 || k == reflect.Int32 || k == reflect.Int64
50+
}
51+
4452
func MapCustomNetFlow(flowMessage *flowmessage.FlowMessage, df netflow.DataField, mapper *NetFlowMapper) {
4553
if mapper == nil {
4654
return
@@ -62,11 +70,27 @@ func MapCustom(flowMessage *flowmessage.FlowMessage, v []byte, destination strin
6270
typeDest := fieldValue.Type()
6371
fieldValueAddr := fieldValue.Addr()
6472

65-
if typeDest.Kind() == reflect.Slice && typeDest.Elem().Kind() == reflect.Uint8 {
66-
fieldValue.SetBytes(v)
67-
} else if fieldValueAddr.IsValid() && (typeDest.Kind() == reflect.Uint8 || typeDest.Kind() == reflect.Uint16 || typeDest.Kind() == reflect.Uint32 || typeDest.Kind() == reflect.Uint64) {
73+
if typeDest.Kind() == reflect.Slice {
74+
75+
if typeDest.Elem().Kind() == reflect.Uint8 {
76+
fieldValue.SetBytes(v)
77+
} else {
78+
item := reflect.New(typeDest.Elem())
79+
80+
if IsUInt(typeDest.Elem().Kind()) {
81+
DecodeUNumber(v, item.Interface())
82+
} else if IsUInt(typeDest.Elem().Kind()) {
83+
DecodeUNumber(v, item.Interface())
84+
}
85+
86+
itemi := reflect.Indirect(item)
87+
tmpFieldValue := reflect.Append(fieldValue, itemi)
88+
fieldValue.Set(tmpFieldValue)
89+
}
90+
91+
} else if fieldValueAddr.IsValid() && IsUInt(typeDest.Kind()) {
6892
DecodeUNumber(v, fieldValueAddr.Interface())
69-
} else if fieldValueAddr.IsValid() && (typeDest.Kind() == reflect.Int8 || typeDest.Kind() == reflect.Int16 || typeDest.Kind() == reflect.Int32 || typeDest.Kind() == reflect.Int64) {
93+
} else if fieldValueAddr.IsValid() && IsInt(typeDest.Kind()) {
7094
DecodeNumber(v, fieldValueAddr.Interface())
7195
}
7296
}

utils/utils.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,20 +71,20 @@ type Formatter interface {
7171
type DefaultLogTransport struct {
7272
}
7373
74-
func (s *DefaultLogTransport) Publish(msgs []*flowmessage.FlowMessage) {
75-
for _, msg := range msgs {
76-
fmt.Printf("%v\n", FlowMessageToString(msg))
74+
func (s *DefaultLogTransport) Publish(msgs []*flowmessage.FlowMessage) {
75+
for _, msg := range msgs {
76+
fmt.Printf("%v\n", FlowMessageToString(msg))
77+
}
7778
}
78-
}
7979
8080
type DefaultJSONTransport struct {
8181
}
8282
83-
func (s *DefaultJSONTransport) Publish(msgs []*flowmessage.FlowMessage) {
84-
for _, msg := range msgs {
85-
fmt.Printf("%v\n", FlowMessageToJSON(msg))
83+
func (s *DefaultJSONTransport) Publish(msgs []*flowmessage.FlowMessage) {
84+
for _, msg := range msgs {
85+
fmt.Printf("%v\n", FlowMessageToJSON(msg))
86+
}
8687
}
87-
}
8888
*/
8989
type DefaultErrorCallback struct {
9090
Logger Logger

0 commit comments

Comments
 (0)