aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/snmp/src/agent/snmpa_agent.erl10
-rw-r--r--lib/snmp/src/agent/snmpa_mpd.erl30
-rw-r--r--lib/snmp/src/agent/snmpa_net_if.erl262
-rw-r--r--lib/snmp/src/misc/snmp_conf.erl15
-rw-r--r--lib/snmp/src/misc/snmp_config.erl4
-rw-r--r--lib/snmp/src/misc/snmp_log.erl187
-rw-r--r--lib/snmp/test/snmp_conf_test.erl2
7 files changed, 285 insertions, 225 deletions
diff --git a/lib/snmp/src/agent/snmpa_agent.erl b/lib/snmp/src/agent/snmpa_agent.erl
index dadd9d7ccd..6d3f1cca4a 100644
--- a/lib/snmp/src/agent/snmpa_agent.erl
+++ b/lib/snmp/src/agent/snmpa_agent.erl
@@ -2516,7 +2516,15 @@ process_msg(
MibView, Vsn, Pdu, PduMS, Community,
SourceAddress, ContextName, GbMaxVBs) ->
#pdu{request_id = ReqId} = Pdu,
- put(snmp_address, SourceAddress),
+ put(
+ snmp_address,
+ case SourceAddress of
+ {Domain, _} when is_atom(Domain) ->
+ SourceAddress;
+ {Ip, Port} when is_integer(Port) ->
+ %% Legacy transport domain
+ {tuple_to_list(Ip), Port}
+ end),
put(snmp_request_id, ReqId),
put(snmp_community, Community),
put(snmp_context, ContextName),
diff --git a/lib/snmp/src/agent/snmpa_mpd.erl b/lib/snmp/src/agent/snmpa_mpd.erl
index 3caed27c42..dbd57b732c 100644
--- a/lib/snmp/src/agent/snmpa_mpd.erl
+++ b/lib/snmp/src/agent/snmpa_mpd.erl
@@ -192,24 +192,28 @@ discarded_pdu(Variable) -> inc(Variable).
%% Handles a Community based message (v1 or v2c).
%%-----------------------------------------------------------------
v1_v2c_proc(
- Vsn, NoteStore, Community, {Domain, Address},
+ Vsn, NoteStore, Community, From,
LocalEngineID, Data, HS, Log, Packet) ->
- try snmp_conf:mk_tdomain(Domain) of
- TDomain ->
- try snmp_conf:mk_taddress(Domain, Address) of
- TAddress ->
- v1_v2c_proc_dec(
- Vsn, NoteStore, Community, TDomain, TAddress,
- LocalEngineID, Data, HS, Log, Packet)
- catch
- _ ->
- {discarded, {badarg, Address}}
- end
+ try
+ case From of
+ {D, A} when is_atom(D) ->
+ {snmp_conf:mk_tdomain(D),
+ snmp_conf:mk_taddress(D, A)};
+ {_, P} = A when is_integer(P) ->
+ {snmp_conf:mk_tdomain(),
+ snmp_conf:mk_taddress(A)}
+ end
+ of
+ {TDomain, TAddress} ->
+ v1_v2c_proc_dec(
+ Vsn, NoteStore, Community, TDomain, TAddress,
+ LocalEngineID, Data, HS, Log, Packet)
catch
_ ->
- {discarded, {badarg, Domain}}
+ {discarded, {badarg, From}}
end.
+
v1_v2c_proc_dec(
Vsn, NoteStore, Community, TDomain, TAddress,
LocalEngineID, Data, HS, Log, Packet) ->
diff --git a/lib/snmp/src/agent/snmpa_net_if.erl b/lib/snmp/src/agent/snmpa_net_if.erl
index 53eebb1728..42e93bff65 100644
--- a/lib/snmp/src/agent/snmpa_net_if.erl
+++ b/lib/snmp/src/agent/snmpa_net_if.erl
@@ -28,6 +28,7 @@
-export([system_continue/3, system_terminate/4, system_code_change/4]).
-export([init/5]).
-export([filter_reset/1]).
+-export([format_address/1]).
-include("snmp_types.hrl").
-include("snmpa_internal.hrl").
@@ -47,7 +48,7 @@
limit = infinity,
rcnt = [],
filter,
- use_tdomain = false}).
+ domain = snmpUDPDomain}).
-ifndef(default_verbosity).
-define(default_verbosity,silence).
@@ -166,13 +167,6 @@ do_init(Prio, NoteStore, MasterAgent, Parent, Opts) ->
%% -- Port and address --
Domain = get_domain(),
?vdebug("domain: ~w",[Domain]),
- UseTDomain =
- case Domain of
- snmpUDPDomain ->
- false;
- _ ->
- true
- end,
UDPPort = get_port(),
?vdebug("port: ~w",[UDPPort]),
IPAddress = get_address(),
@@ -187,7 +181,7 @@ do_init(Prio, NoteStore, MasterAgent, Parent, Opts) ->
?vdebug("Limit: ~w", [Limit]),
FilterOpts = get_filter_opts(Opts),
FilterMod = create_filter(FilterOpts),
- ?vdebug("FilterMod: ~w", [FilterMod]),
+ ?vdebug("FilterMod: ~w FilterOpts: ~p", [FilterMod,FilterOpts]),
%% -- Audit trail log
Log = create_log(),
@@ -202,7 +196,6 @@ do_init(Prio, NoteStore, MasterAgent, Parent, Opts) ->
IPOpts =
[binary, snmp_conf:tdomain_to_family(Domain)
| IPOpts1 ++ IPOpts2 ++ IPOpts3 ++ IPOpts4],
- ?vdebug("open socket with options: ~w",[IPOpts]),
case gen_udp_open(UDPPort, IPOpts) of
{ok, Sock} ->
MpdState = snmpa_mpd:init(Vsns),
@@ -217,7 +210,7 @@ do_init(Prio, NoteStore, MasterAgent, Parent, Opts) ->
log = Log,
limit = Limit,
filter = FilterMod,
- use_tdomain = UseTDomain},
+ domain = Domain},
?vdebug("started with MpdState: ~p", [MpdState]),
{ok, S};
{error, Reason} ->
@@ -278,50 +271,69 @@ create_filter(BadOpts) ->
throw({error, {bad_filter_opts, BadOpts}}).
-log(LogTypes, Req, Packet, {Domain, Address}) ->
- log(LogTypes, Req, Packet, Domain, Address).
-
-log({_, []}, _, _, _, _) ->
+log({_, []}, _, _, _) ->
ok;
-log({Log, Types}, 'set-request', Packet, Domain, Address) ->
+log({Log, Types}, 'set-request', Packet, Address) ->
case lists:member(write, Types) of
true ->
- snmp_log:log(Log, Packet, Domain, Address);
+ snmp_log:log(Log, Packet, format_address(Address));
false ->
ok
end;
-log({Log, Types}, _, Packet, Domain, Address) ->
+log({Log, Types}, _, Packet, Address) ->
case lists:member(read, Types) of
true ->
- snmp_log:log(Log, Packet, Domain, Address);
+ snmp_log:log(Log, Packet, format_address(Address));
false ->
ok
- end;
-log(_, _, _, _, _) ->
- ok.
+ end.
+%% log(_, _, _, _, _) ->
+%% ok.
+
+format_address({snmpUDPDomain, {_Ip, Port} = Addr}) when is_integer(Port) ->
+ format_address(Addr);
+format_address({transportDomainUdpIpv4, {Ip, Port}}) ->
+ format_address("udpIpv4/~s:~w", [inet:ntoa(Ip), Port]);
+format_address({transportDomainUdpIpv6, {Ip, Port}}) ->
+ format_address("udpIpv6/[~s]:~w", [inet:ntoa(Ip), Port]);
+format_address({Ip, Port}) when is_integer(Port) ->
+ format_address("~s:~w", [inet:ntoa(Ip), Port]).
+
+format_address(Format, Args) ->
+ iolist_to_binary(io_lib:format(Format, Args)).
+
gen_udp_open(Port, Opts) ->
case init:get_argument(snmp_fd) of
{ok, [[FdStr]]} ->
Fd = list_to_integer(FdStr),
+ ?vdebug("gen_udp_open(~p, ~p) Fd: ~p",[Port,Opts,Fd]),
gen_udp:open(0, [{fd, Fd}|Opts]);
error ->
case init:get_argument(snmpa_fd) of
{ok, [[FdStr]]} ->
Fd = list_to_integer(FdStr),
+ ?vdebug("gen_udp_open(~p, ~p) Fd: ~p",[Port,Opts,Fd]),
gen_udp:open(0, [{fd, Fd}|Opts]);
error ->
+ ?vdebug("gen_udp_open(~p, ~p)",[Port,Opts]),
gen_udp:open(Port, Opts)
end
end.
-loop(S) ->
+loop(#state{domain = Domain} = S) ->
receive
{udp, _UdpId, Ip, Port, Packet} ->
?vlog("got paket from ~w:~w",[Ip,Port]),
- From = snmp_conf:ip_port_to_domaddr(Ip, Port),
+ From =
+ case Domain of
+ snmpUDPDomain ->
+ {Ip, Port};
+ _ ->
+ {Domain, {Ip, Port}}
+ end,
NewS = maybe_handle_recv(S, From, Packet),
loop(NewS);
@@ -550,22 +562,15 @@ update_req_counter_outgoing(#state{limit = Limit, rcnt = RCnt} = S,
maybe_handle_recv(
- #state{usock = Sock, filter = FilterMod, use_tdomain = UseTDomain} = S,
- {Domain, Addr} = From, Packet) ->
+ #state{usock = Sock, filter = FilterMod} = S, From, Packet) ->
+ {From_1, From_2} = From,
case
- try
- case UseTDomain of
- true ->
- FilterMod:accept_recv(Domain, Addr);
- false ->
- {Ip, Port} = Addr,
- FilterMod:accept_recv(Ip, Port)
- end
+ try FilterMod:accept_recv(From_1, From_2)
catch
Class:Exception ->
error_msg(
- "FilterMod:accept_recv/2 crashed for ~p: ~w:~w~n ~p",
- [From,Class,Exception,erlang:get_stacktrace()]),
+ "FilterMod:accept_recv(~p, ~p) crashed: ~w:~w~n ~p",
+ [From_1,From_2,Class,Exception,erlang:get_stacktrace()]),
true
end
of
@@ -580,8 +585,8 @@ maybe_handle_recv(
ok;
_ ->
error_msg(
- "FilterMod:accept_recv/2 returned: ~p for ~p",
- [Other,From])
+ "FilterMod:accept_recv(~p, ~p) returned: ~p",
+ [From_1,From_2,Other])
end,
handle_recv(S, From, Packet)
end.
@@ -634,15 +639,13 @@ handle_recv(
?vlog("sending report for reason: "
"~n ~s",
[?vapply(snmp_misc, format, [256, "~w", [Reason]])]),
- {_Domain, {Ip, Port}} = From,
- (catch udp_send(S#state.usock, Ip, Port, ReportPacket)),
+ (catch udp_send(S#state.usock, From, ReportPacket)),
active_once(Sock),
S;
{discovery, ReportPacket} ->
?vlog("sending discovery report", []),
- {_Domain, {Ip, Port}} = From,
- (catch udp_send(S#state.usock, Ip, Port, ReportPacket)),
+ (catch udp_send(S#state.usock, From, ReportPacket)),
active_once(Sock),
S;
@@ -654,24 +657,19 @@ handle_recv(
end.
maybe_handle_recv_pdu(
- {Domain, Addr} = From, Vsn,
+ From, Vsn,
#pdu{type = Type} = Pdu, PduMS, ACMData,
- #state{usock = Sock, filter = FilterMod, use_tdomain = UseTDomain} = S) ->
+ #state{usock = Sock, filter = FilterMod} = S) ->
+ {From_1, From_2} = From,
case
- try
- case UseTDomain of
- true ->
- FilterMod:accept_recv_pdu(Domain, Addr, Type);
- false ->
- {Ip, Port} = Addr,
- FilterMod:accept_recv_pdu(Ip, Port, Type)
- end
+ try FilterMod:accept_recv_pdu(From_1, From_2, Type)
catch
Class:Exception ->
error_msg(
- "FilterMod:accept_recv_pdu/3 crashed for ~p, ~p: ~w:~w~n"
+ "FilterMod:accept_recv_pdu(~p, ~p, ~p) crashed: ~w:~w~n"
" ~p",
- [From,Type,Class,Exception,erlang:get_stacktrace()]),
+ [From_1,From_2,Type,Class,Exception,
+ erlang:get_stacktrace()]),
true
end
of
@@ -685,13 +683,11 @@ maybe_handle_recv_pdu(
ok;
_ ->
error_msg(
- "FilterMod:accept_recv_pdu/3 returned: ~p for ~p, ~p",
- [Other,From,Type])
+ "FilterMod:accept_recv_pdu(~p, ~p, ~p) returned: ~p",
+ [From_1,From_2,Type,Other])
end,
handle_recv_pdu(From, Vsn, Pdu, PduMS, ACMData, S)
- end;
-maybe_handle_recv_pdu(From, Vsn, Pdu, PduMS, ACMData, S) ->
- handle_recv_pdu(From, Vsn, Pdu, PduMS, ACMData, S).
+ end.
handle_recv_pdu(
From, Vsn,
@@ -717,17 +713,12 @@ handle_recv_pdu(From, Vsn, Pdu, PduMS, ACMData,
maybe_handle_reply_pdu(
- #state{filter = FilterMod, use_tdomain = UseTDomain} = S, Vsn,
+ #state{filter = FilterMod} = S, Vsn,
#pdu{request_id = Rid} = Pdu,
- Type, ACMData, {_Domain, Addr} = To) ->
+ Type, ACMData, To) ->
+
S1 = update_req_counter_outgoing(S, Rid),
- Addresses =
- case UseTDomain of
- true ->
- [To];
- false ->
- [Addr]
- end,
+ Addresses = [To],
case
try
FilterMod:accept_send_pdu(Addresses, Type)
@@ -778,7 +769,7 @@ handle_reply_pdu(#state{log = Log} = S, Vsn, Pdu, Type, ACMData, To) ->
maybe_handle_send_pdu(
- #state{filter = FilterMod, use_tdomain = UseTDomain} = S,
+ #state{filter = FilterMod, domain = Domain} = S,
Vsn, Pdu, MsgData, TDomAddrSecs, From) ->
?vtrace("maybe_handle_send_pdu -> entry with~n"
@@ -787,24 +778,24 @@ maybe_handle_send_pdu(
DomAddrSecs = snmpa_mpd:process_taddrs(TDomAddrSecs),
AddressesToFilter =
- [case UseTDomain of
- true ->
+ [case Domain of
+ snmpUDPDomain ->
case DAS of
- {{Domain, _Address} = DomAddr, _SecData}
- when is_atom(Domain) -> % v3
- DomAddr;
- {Domain, _Address} = DomAddr
- when is_atom(Domain) -> % v1 & v2
- DomAddr
+ {{Dom, Addr}, _SecData}
+ when is_atom(Dom) -> % v3
+ Addr;
+ {Dom, Addr}
+ when is_atom(Dom) -> % v1 & v2
+ Addr
end;
- false ->
+ _ ->
case DAS of
- {{Domain, Address}, _SecData}
- when is_atom(Domain) -> % v3
- Address;
- {Domain, Address}
- when is_atom(Domain) -> % v1 & v2
- Address
+ {{Dom, _Addr} = DomAddr, _SecData}
+ when is_atom(Dom) -> % v3
+ DomAddr;
+ {Dom, _Addr} = DomAddr
+ when is_atom(Dom) -> % v1 & v2
+ DomAddr
end
end || DAS <- DomAddrSecs],
Type = pdu_type_of(Pdu),
@@ -830,24 +821,24 @@ maybe_handle_send_pdu(
[DAS ||
DAS <- DomAddrSecs,
lists:member(
- case UseTDomain of
+ case Domain of
+ snmpUDPDomain ->
+ case DAS of
+ {{Dom, Addr}, _SData}
+ when is_atom(Dom) -> % v3
+ Addr;
+ {Dom, Addr}
+ when is_atom(Dom) -> % v1 & v2
+ Addr
+ end;
true ->
case DAS of
- {{Domain, _Address} = DomAddr, _SData}
- when is_atom(Domain) -> % v3
+ {{Dom, _Addr} = DomAddr, _SData}
+ when is_atom(Dom) -> % v3
DomAddr;
- {Domain, _Address} = DomAddr
- when is_atom(Domain) -> % v1 & v2
+ {Dom, _Addr} = DomAddr
+ when is_atom(Dom) -> % v1 & v2
DomAddr
- end;
- false ->
- case DAS of
- {{Domain, Address}, _SData}
- when is_atom(Domain) -> % v3
- Address;
- {Domain, Address}
- when is_atom(Domain) -> % v1 & v2
- Address
end
end, FilteredAddresses)],
?vtrace("maybe_handle_send_pdu -> MergedDomAddrSecs:~n"
@@ -909,9 +900,8 @@ handle_send_discovery(
case (catch snmpa_mpd:generate_discovery_msg(NS, Pdu, MsgData, To)) of
{ok, {Domain, Address, Packet}} ->
- log(Log, Type, Packet, Domain, Address),
- {Ip, Port} = Address,
- udp_send(Sock, Ip, Port, Packet),
+ log(Log, Type, Packet, {Domain, Address}),
+ udp_send(Sock, {Domain, Address}, Packet),
?vtrace("handle_send_discovery -> sent (~w)", [ReqId]),
NReqs = snmp_misc:keyreplaceadd(From, 2, Reqs, {ReqId, From}),
S#state{reqs = NReqs};
@@ -975,22 +965,16 @@ handle_response(Vsn, Pdu, From, S) ->
end.
maybe_udp_send(
- #state{usock = Sock, filter = FilterMod, use_tdomain = UseTDomain},
- {Domain, Addr} = To, Packet) ->
+ #state{usock = Sock, filter = FilterMod},
+ To, Packet) ->
+ {To_1, To_2} = To,
case
- try
- case UseTDomain of
- true ->
- FilterMod:accept_send(Domain, Addr);
- false ->
- {Ip, Port} = Addr,
- FilterMod:accept_send(Ip, Port)
- end
+ try FilterMod:accept_send(To_1, To_2)
catch
Class:Exception ->
error_msg(
- "FilterMod:accept_send/2 crashed for ~p: ~w:~w~n ~p",
- [To,Class,Exception,erlang:get_stacktrace()]),
+ "FilterMod:accept_send(~p, ~p) crashed: ~w:~w~n ~p",
+ [To_1,To_2,Class,Exception,erlang:get_stacktrace()]),
true
end
of
@@ -1003,34 +987,26 @@ maybe_udp_send(
ok;
_ ->
error_msg(
- "FilterMod:accept_send/2 returned: ~p for ~p",
- [Other,To])
+ "FilterMod:accept_send(~p, ~p) returned: ~p",
+ [To_1,To_2,Other])
end,
%% XXX should be some kind of lookup of domain to socket
- {SockIp, SockPort} = Addr,
- (catch udp_send(Sock, SockIp, SockPort, Packet))
+ (catch udp_send(Sock, To, Packet))
end.
maybe_udp_send(
#state{log = Log,
usock = Sock,
- filter = FilterMod,
- use_tdomain = UseTDomain},
- {Domain, Addr} = To, Packet, Type, _LogData) ->
+ filter = FilterMod},
+ To, Packet, Type, _LogData) ->
+ {To_1, To_2} = To,
case
- try
- case UseTDomain of
- true ->
- FilterMod:accept_send(Domain, Addr);
- false ->
- {Ip, Port} = Addr,
- FilterMod:accept_send(Ip, Port)
- end
+ try FilterMod:accept_send(To_1, To_2)
catch
Class:Exception ->
error_msg(
- "FilterMod:accept_send/2 crashed for ~p: ~w:~w~n ~p",
- [To,Class,Exception,erlang:get_stacktrace()]),
+ "FilterMod:accept_send(~p, ~p) crashed for: ~w:~w~n ~p",
+ [To_1,To_2,Class,Exception,erlang:get_stacktrace()]),
true
end
of
@@ -1043,28 +1019,34 @@ maybe_udp_send(
ok;
_ ->
error_msg(
- "FilterMod:accept_send/2 returned: ~p for ~p",
- [Other,To])
+ "FilterMod:accept_send(~p, ~p) returned: ~p",
+ [To_1,To_2,Other])
end,
log(Log, Type, Packet, To),
- %% XXX should be some kind of lookup of domain to socket
- {SockIp, SockPort} = Addr,
- (catch udp_send(Sock, SockIp, SockPort, Packet))
+ (catch udp_send(Sock, To, Packet))
end.
-udp_send(UdpId, AgentIp, UdpPort, B) ->
- case (catch gen_udp:send(UdpId, AgentIp, UdpPort, B)) of
+udp_send(UdpId, To, B) ->
+ %% XXX should be some kind of lookup of domain to socket
+ {Ip, Port} =
+ case To of
+ {Domain, Addr} when is_atom(Domain) ->
+ Addr;
+ {_, P} = Addr when is_integer(P) ->
+ Addr
+ end,
+ case (catch gen_udp:send(UdpId, Ip, Port, B)) of
{error, emsgsize} ->
%% From this message we cannot recover, so exit sending loop
throw({emsgsize, sz(B)});
{error, ErrorReason} ->
error_msg("[error] cannot send message "
"(destination: ~p:~p, size: ~p, reason: ~p)",
- [AgentIp, UdpPort, sz(B), ErrorReason]);
+ [Ip, Port, sz(B), ErrorReason]);
{'EXIT', ExitReason} ->
error_msg("[exit] cannot send message "
"(destination: ~p:~p, size: ~p, reason: ~p)",
- [AgentIp, UdpPort, sz(B), ExitReason]);
+ [Ip, Port, sz(B), ExitReason]);
_ ->
ok
end.
@@ -1275,7 +1257,7 @@ get_counters([Counter|Counters], Acc) ->
ip_opt_bind_to_ip_address(Opts, Ip) ->
case get_bind_to_ip_address(Opts) of
true ->
- [{ip, list_to_tuple(Ip)}];
+ [{ip, Ip}];
_ ->
[]
end.
diff --git a/lib/snmp/src/misc/snmp_conf.erl b/lib/snmp/src/misc/snmp_conf.erl
index 0cad61e5c8..bf1a025457 100644
--- a/lib/snmp/src/misc/snmp_conf.erl
+++ b/lib/snmp/src/misc/snmp_conf.erl
@@ -42,7 +42,7 @@
check_domain/1,
all_tdomains/0,
check_tdomain/1,
- mk_tdomain/1,
+ mk_tdomain/0, mk_tdomain/1,
tdomain_to_family/1,
which_domain/1,
check_ip/1, check_ip/2,
@@ -50,7 +50,7 @@
ip_port_to_domaddr/2,
check_address/2, check_address/3,
check_taddress/2,
- mk_taddress/2,
+ mk_taddress/1, mk_taddress/2,
check_packet_size/1,
@@ -462,6 +462,9 @@ check_tdomain(TDomain) ->
%% ---------
+mk_tdomain() ->
+ mk_tdomain(snmpUDPDomain).
+
mk_tdomain(snmpUDPDomain) ->
mk_tdomain(transportDomainUdpIpv4);
mk_tdomain(transportDomainUdpIpv4) ->
@@ -598,14 +601,14 @@ check_domain(Domain) ->
%% ---------
+mk_taddress(Address) ->
+ mk_taddress(snmpUDPDomain, Address).
+
%% The values of Domain, Ip and Port has both been checked at this
%% point, so we dont need to do that again, but this function is
%% also used on incoming packets from net_if so a little
%% check that net_if does not supply bad arguments is in order.
%%
-mk_taddress(snmpUDPDomain, Address) -> % Legacy
- mk_taddress(transportDomainUdpIpv4, Address);
-%%
%% These are just for convenience
mk_taddress(?snmpUDPDomain, Address) ->
mk_taddress(snmpUDPDomain, Address);
@@ -614,6 +617,8 @@ mk_taddress(?transportDomainUdpIpv4, Address) ->
mk_taddress(?transportDomainUdpIpv6, Address) ->
mk_taddress(transportDomainUdpIpv6, Address);
%%
+mk_taddress(snmpUDPDomain, Address) -> % Legacy
+ mk_taddress(transportDomainUdpIpv4, Address);
mk_taddress(transportDomainUdpIpv4 = Domain, Address) ->
case Address of
[] -> % Empty mask
diff --git a/lib/snmp/src/misc/snmp_config.erl b/lib/snmp/src/misc/snmp_config.erl
index 7e52d68fa1..6d0f14237e 100644
--- a/lib/snmp/src/misc/snmp_config.erl
+++ b/lib/snmp/src/misc/snmp_config.erl
@@ -1588,7 +1588,7 @@ write_agent_snmp_files(
is_list(SysName) ->
write_agent_snmp_files(
Dir, Vsns, Domain, ManagerAddr, AgentAddr, SysName,
- "trap", none, "", "agentEngine", 484).
+ trap, none, "", "agentEngine", 484).
%%----------------------------------------------------------------------
%% Dir: string() (ex: "../conf/")
@@ -1607,7 +1607,7 @@ write_agent_snmp_files(
is_list(SysName) ->
write_agent_snmp_files(
Dir, Vsns, ManagerIP, TrapUDP, AgentIP, AgentUDP, SysName,
- "trap", none, "", "agentEngine", 484).
+ trap, none, "", "agentEngine", 484).
%%
%% ----- Agent config files generator functions -----
diff --git a/lib/snmp/src/misc/snmp_log.erl b/lib/snmp/src/misc/snmp_log.erl
index ae28df37fa..b3596909cd 100644
--- a/lib/snmp/src/misc/snmp_log.erl
+++ b/lib/snmp/src/misc/snmp_log.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -23,7 +23,7 @@
-export([
create/4, create/5, create/6, open/1, open/2,
change_size/2, close/1, sync/1, info/1,
- log/4,
+ log/3, log/4,
log_to_txt/6, log_to_txt/7, log_to_txt/8,
log_to_io/5, log_to_io/6, log_to_io/7
]).
@@ -344,12 +344,20 @@ validate_loop(Error, _Log, _Write, _PrevTS, _PrevSN) ->
%% log(Log, Packet, Addr, Port)
%%-----------------------------------------------------------------
-log(#snmp_log{id = Log, seqno = SeqNo}, Packet, Addr, Port) ->
+log(#snmp_log{id = Log, seqno = SeqNo}, Packet, AddrStr) ->
+ ?vtrace(
+ "log -> entry with~n"
+ " Log: ~p~n"
+ " AddrStr: ~s", [Log, AddrStr]),
+ Entry = make_entry(SeqNo, Packet, AddrStr),
+ disk_log:alog(Log, Entry).
+
+log(#snmp_log{id = Log, seqno = SeqNo}, Packet, Ip, Port) ->
?vtrace("log -> entry with"
"~n Log: ~p"
- "~n Addr: ~p"
- "~n Port: ~p", [Log, Addr, Port]),
- Entry = make_entry(SeqNo, Packet, Addr, Port),
+ "~n Ip: ~p"
+ "~n Port: ~p", [Log, Ip, Port]),
+ Entry = make_entry(SeqNo, Packet, Ip, Port),
%% io:format("log -> "
%% "~n Entry: ~p"
%% "~n Info: ~p"
@@ -361,18 +369,35 @@ log(#snmp_log{id = Log, seqno = SeqNo}, Packet, Addr, Port) ->
%% "~n", [Res, disk_log:info(Log)]),
%% disk_log:sync(Log),
Res.
-
-make_entry(SeqNoGen, Packet, Addr, Port) ->
+
+make_entry(SeqNoGen, Packet, AddrStr)
+ when is_integer(Packet);
+ is_tuple(AddrStr) ->
+ erlang:error(badarg, [SeqNoGen, Packet, AddrStr]);
+make_entry(SeqNoGen, Packet, AddrStr) ->
+ try next_seqno(SeqNoGen) of
+ disabled ->
+ {timestamp(), Packet, AddrStr};
+ {ok, NextSeqNo} when is_integer(NextSeqNo) ->
+ {timestamp(), NextSeqNo, Packet, AddrStr}
+ catch
+ _:_ ->
+ {timestamp(), Packet, AddrStr}
+ end.
+
+make_entry(SeqNoGen, Packet, Ip, Port) when is_integer(Packet) ->
+ erlang:error(badarg, [SeqNoGen, Packet, Ip, Port]);
+make_entry(SeqNoGen, Packet, Ip, Port) ->
try next_seqno(SeqNoGen) of
disabled ->
- {timestamp(), Packet, Addr, Port};
- {ok, NextSeqNo} ->
- {timestamp(), NextSeqNo, Packet, Addr, Port}
+ {timestamp(), Packet, Ip, Port};
+ {ok, NextSeqNo} when is_integer(NextSeqNo) ->
+ {timestamp(), NextSeqNo, Packet, Ip, Port}
catch
_:_ ->
- {timestamp(), Packet, Addr, Port}
+ {timestamp(), Packet, Ip, Port}
end.
next_seqno({M, F, A}) ->
@@ -674,60 +699,68 @@ format_msg(Entry, Mib, Start, Stop) ->
end.
%% This is an old-style entry, that never had the sequence-number
-do_format_msg({Timestamp, Packet, {Addr, Port}}, Mib) ->
- do_format_msg(Timestamp, Packet, Addr, Port, Mib);
+do_format_msg({Timestamp, Packet, {Ip, Port}}, Mib) ->
+ do_format_msg(Timestamp, Packet, ipPort2Str(Ip, Port), Mib);
+%% This is the format without sequence-number
+do_format_msg({Timestamp, Packet, AddrStr}, Mib) ->
+ do_format_msg(Timestamp, Packet, AddrStr, Mib);
+%% This is the format with sequence-number
+do_format_msg({Timestamp, SeqNo, Packet, AddrStr}, Mib)
+ when is_integer(SeqNo) ->
+ do_format_msg(Timestamp, Packet, AddrStr, Mib);
%% This is the format without sequence-number
-do_format_msg({Timestamp, Packet, Addr, Port}, Mib) ->
- do_format_msg(Timestamp, Packet, Addr, Port, Mib);
+do_format_msg({Timestamp, Packet, Ip, Port}, Mib) ->
+ do_format_msg(Timestamp, Packet, ipPort2Str(Ip, Port), Mib);
%% This is the format with sequence-number
-do_format_msg({Timestamp, SeqNo, Packet, Addr, Port}, Mib) ->
- do_format_msg(Timestamp, SeqNo, Packet, Addr, Port, Mib);
+do_format_msg({Timestamp, SeqNo, Packet, Ip, Port}, Mib) ->
+ do_format_msg(Timestamp, SeqNo, Packet, ipPort2Str(Ip, Port), Mib);
%% This is crap...
do_format_msg(_, _) ->
format_tab("** unknown entry in log file\n\n", []).
-do_format_msg(TimeStamp, {V3Hdr, ScopedPdu}, Addr, Port, Mib) ->
+do_format_msg(TimeStamp, {V3Hdr, ScopedPdu}, AddrStr, Mib) ->
case (catch snmp_pdus:dec_scoped_pdu(ScopedPdu)) of
ScopedPDU when is_record(ScopedPDU, scopedPdu) ->
Msg = #message{version = 'version-3',
vsn_hdr = V3Hdr,
data = ScopedPDU},
- f(ts2str(TimeStamp), "", Msg, Addr, Port, Mib);
+ f(ts2str(TimeStamp), "", Msg, AddrStr, Mib);
{'EXIT', Reason} ->
- format_tab("** error in log file at ~s from ~p:~w ~p\n\n",
- [ts2str(TimeStamp), ip(Addr), Port, Reason])
+ format_tab(
+ "** error in log file at ~s from ~s ~p\n\n",
+ [ts2str(TimeStamp), AddrStr, Reason])
end;
-do_format_msg(TimeStamp, Packet, Addr, Port, Mib) ->
+do_format_msg(TimeStamp, Packet, AddrStr, Mib) ->
case (catch snmp_pdus:dec_message(binary_to_list(Packet))) of
Msg when is_record(Msg, message) ->
- f(ts2str(TimeStamp), "", Msg, Addr, Port, Mib);
+ f(ts2str(TimeStamp), "", Msg, AddrStr, Mib);
{'EXIT', Reason} ->
format_tab("** error in log file ~p\n\n", [Reason])
end.
-do_format_msg(TimeStamp, SeqNo, {V3Hdr, ScopedPdu}, Addr, Port, Mib) ->
+do_format_msg(TimeStamp, SeqNo, {V3Hdr, ScopedPdu}, AddrStr, Mib) ->
case (catch snmp_pdus:dec_scoped_pdu(ScopedPdu)) of
ScopedPDU when is_record(ScopedPDU, scopedPdu) ->
Msg = #message{version = 'version-3',
vsn_hdr = V3Hdr,
data = ScopedPDU},
- f(ts2str(TimeStamp), sn2str(SeqNo), Msg, Addr, Port, Mib);
+ f(ts2str(TimeStamp), sn2str(SeqNo), Msg, AddrStr, Mib);
{'EXIT', Reason} ->
- format_tab("** error in log file at ~s from ~p:~w ~p\n\n",
- [ts2str(TimeStamp), sn2str(SeqNo),
- ip(Addr), Port, Reason])
+ format_tab(
+ "** error in log file at ~s from ~s ~p\n\n",
+ [ts2str(TimeStamp), sn2str(SeqNo), AddrStr, Reason])
end;
-do_format_msg(TimeStamp, SeqNo, Packet, Addr, Port, Mib) ->
+do_format_msg(TimeStamp, SeqNo, Packet, AddrStr, Mib) ->
case (catch snmp_pdus:dec_message(binary_to_list(Packet))) of
Msg when is_record(Msg, message) ->
- f(ts2str(TimeStamp), sn2str(SeqNo), Msg, Addr, Port, Mib);
+ f(ts2str(TimeStamp), sn2str(SeqNo), Msg, AddrStr, Mib);
{'EXIT', Reason} ->
- format_tab("** error in log file ~s from ~p:~w ~p\n\n",
- [ts2str(TimeStamp), sn2str(SeqNo),
- ip(Addr), Port, Reason])
+ format_tab(
+ "** error in log file ~s from ~s ~p\n\n",
+ [ts2str(TimeStamp), sn2str(SeqNo), AddrStr, Reason])
end.
@@ -771,44 +804,70 @@ do_format_msg(TimeStamp, SeqNo, Packet, Addr, Port, Mib) ->
f(TimeStamp, SeqNo,
#message{version = Vsn, vsn_hdr = VsnHdr, data = Data},
- Addr, Port, Mib) ->
+ AddrStr, Mib) ->
Str = format_pdu(Data, Mib),
HdrStr = format_header(Vsn, VsnHdr),
- case get_type(Data) of
- trappdu ->
- f_trap(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port);
- 'snmpv2-trap' ->
- f_trap(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port);
- 'inform-request' ->
- f_inform(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port);
- 'get-response' ->
- f_response(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port);
- report ->
- f_report(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port);
- _ ->
- f_request(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port)
- end.
+ Class =
+ case get_type(Data) of
+ trappdu ->
+ trap;
+ 'snmpv2-trap' ->
+ trap;
+ 'inform-request' ->
+ inform;
+ 'get-response' ->
+ response;
+ report ->
+ report;
+ _ ->
+ request
+ end,
+ format_tab(
+ "~w ~s - ~s [~s]~s ~w\n~s",
+ [Class, AddrStr, HdrStr, TimeStamp, SeqNo, Vsn, Str]).
+
+%% f(TimeStamp, SeqNo,
+%% #message{version = Vsn, vsn_hdr = VsnHdr, data = Data},
+%% Addr, Port, Mib) ->
+%% Str = format_pdu(Data, Mib),
+%% HdrStr = format_header(Vsn, VsnHdr),
+%% case get_type(Data) of
+%% trappdu ->
+%% f_trap(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port);
+%% 'snmpv2-trap' ->
+%% f_trap(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port);
+%% 'inform-request' ->
+%% f_inform(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port);
+%% 'get-response' ->
+%% f_response(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port);
+%% report ->
+%% f_report(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port);
+%% _ ->
+%% f_request(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port)
+%% end.
-f_request(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port) ->
- format_tab("request ~s:~w - ~s [~s]~s ~w\n~s",
- [ip(Addr), Port, HdrStr, TimeStamp, SeqNo, Vsn, Str]).
+%% f_request(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port) ->
+%% format_tab("request ~s:~w - ~s [~s]~s ~w\n~s",
+%% [ip(Addr), Port, HdrStr, TimeStamp, SeqNo, Vsn, Str]).
-f_response(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port) ->
- format_tab("response ~s:~w - ~s [~s]~s ~w\n~s",
- [ip(Addr), Port, HdrStr, TimeStamp, SeqNo, Vsn, Str]).
+%% f_response(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port) ->
+%% format_tab("response ~s:~w - ~s [~s]~s ~w\n~s",
+%% [ip(Addr), Port, HdrStr, TimeStamp, SeqNo, Vsn, Str]).
-f_report(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port) ->
- format_tab("report ~s:~w - ~s [~s]~s ~w\n~s",
- [ip(Addr), Port, HdrStr, TimeStamp, SeqNo, Vsn, Str]).
+%% f_report(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port) ->
+%% format_tab("report ~s:~w - ~s [~s]~s ~w\n~s",
+%% [ip(Addr), Port, HdrStr, TimeStamp, SeqNo, Vsn, Str]).
-f_trap(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port) ->
- format_tab("trap ~s:~w - ~s [~s]~s ~w\n~s",
- [ip(Addr), Port, HdrStr, TimeStamp, SeqNo, Vsn, Str]).
+%% f_trap(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port) ->
+%% format_tab("trap ~s:~w - ~s [~s]~s ~w\n~s",
+%% [ip(Addr), Port, HdrStr, TimeStamp, SeqNo, Vsn, Str]).
-f_inform(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port) ->
- format_tab("inform ~s:~w - ~s [~s]~s ~w\n~s",
- [ip(Addr), Port, HdrStr, TimeStamp, SeqNo, Vsn, Str]).
+%% f_inform(TimeStamp, SeqNo, Vsn, HdrStr, Str, Addr, Port) ->
+%% format_tab("inform ~s:~w - ~s [~s]~s ~w\n~s",
+%% [ip(Addr), Port, HdrStr, TimeStamp, SeqNo, Vsn, Str]).
+ipPort2Str(Ip, Port) ->
+ io_lib:format("~s:~w", [ip(Ip), Port]).
%% Convert a timestamp 2-tupple to a printable string
%%
diff --git a/lib/snmp/test/snmp_conf_test.erl b/lib/snmp/test/snmp_conf_test.erl
index 5c8acb48a5..7f5d11c0e7 100644
--- a/lib/snmp/test/snmp_conf_test.erl
+++ b/lib/snmp/test/snmp_conf_test.erl
@@ -373,6 +373,8 @@ verify_ip(Val) ->
case (catch snmp_conf:check_ip(Val)) of
{error, Reason} ->
?FAIL({verify_ip, Val, Reason});
+ {ok, _} ->
+ ok;
ok ->
ok
end.