Packages

Simple netflow to prometheus converter and pre-analyzer

Current section

Files

Jump to
erlflow src erlflow_utils.erl
Raw

src/erlflow_utils.erl

-module(erlflow_utils).
-include_lib("netflow/include/netflow_v5.hrl").
%% API
-export([
from_list_recursive/1,
to_binary/1,
flow_sign/1
]).
-spec from_list_recursive(Data :: list(list(tuple())) | list(tuple()) | map()) -> Result :: list(map()).
from_list_recursive([List|_] = ListOfLists) when is_list(List) ->
lists:foldr(fun(L, Acc) -> [from_list_recursive(maps:from_list(L)) | Acc] end, [], ListOfLists);
from_list_recursive(List) when is_list(List) ->
[from_list_recursive(maps:from_list(List))];
from_list_recursive(Map) ->
maps:fold(fun
(K, [V|_] = ListOfLists, Acc) when is_list(V) ->
MaybeMapped = internal_recursive(lists:reverse(ListOfLists)),
Acc#{K => MaybeMapped};
(K, V, Acc) when is_list(V) ->
MaybeMapped = try maps:from_list(V) of
M -> from_list_recursive(M)
catch _:_ -> V
end,
Acc#{K => MaybeMapped};
(K, V, Acc) ->
Acc#{K => V}
end, #{}, Map).
internal_recursive(List) ->
internal_recursive(List, []).
internal_recursive([], Acc) -> Acc;
internal_recursive([H | T], Acc) ->
MaybeMapped = try maps:from_list(H) of
M -> from_list_recursive(M)
catch _:_ -> H
end,
internal_recursive(T, [MaybeMapped | Acc]).
to_binary(Value) when is_list(Value) -> unicode:characters_to_binary(Value);
to_binary(Value) when is_integer(Value) -> erlang:integer_to_binary(Value);
to_binary(Value) when is_atom(Value) -> erlang:atom_to_binary(Value).
flow_sign(#nfrec_v5{src_addr = SrcAddr, src_port = SrcPort, dst_addr = DstAddr, dst_port = DstPort, prot = Proto,
tos = Tos, first = StartTimestamp}) -> {SrcAddr, SrcPort, DstAddr, DstPort, Proto, Tos, StartTimestamp}.