aboutsummaryrefslogtreecommitdiffstats
path: root/lib/snmp/test/snmp_manager_user.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/snmp/test/snmp_manager_user.erl')
-rw-r--r--lib/snmp/test/snmp_manager_user.erl935
1 files changed, 935 insertions, 0 deletions
diff --git a/lib/snmp/test/snmp_manager_user.erl b/lib/snmp/test/snmp_manager_user.erl
new file mode 100644
index 0000000000..07b56bde39
--- /dev/null
+++ b/lib/snmp/test/snmp_manager_user.erl
@@ -0,0 +1,935 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. 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
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%----------------------------------------------------------------------
+%% Purpose: Utility functions for the (snmp manager) user test(s).
+%%----------------------------------------------------------------------
+
+-module(snmp_manager_user).
+
+-behaviour(snmpm_user).
+%% -behaviour(snmpm_user_old).
+
+
+%%----------------------------------------------------------------------
+%% Include files
+%%----------------------------------------------------------------------
+-include("test_server.hrl").
+-include("snmp_test_lib.hrl").
+
+
+%%----------------------------------------------------------------------
+%% External exports
+%%----------------------------------------------------------------------
+-export([
+ start_link/0, start_link/1, start_link/2,
+ start/0, start/1, start/2,
+ stop/0,
+ info/0,
+ system_info/0,
+ simulate_crash/1,
+ register_agent/2, register_agent/3,
+ unregister_agent/1, unregister_agent/2,
+ agent_info/2, agent_info/3,
+ update_agent_info/3, update_agent_info/4,
+ which_all_agents/0, which_own_agents/0,
+ load_mib/1, unload_mib/1,
+ sync_get/1, sync_get/2, sync_get/3,
+ async_get/1, async_get/2, async_get/3,
+ sync_get_next/1, sync_get_next/2, sync_get_next/3,
+ async_get_next/1, async_get_next/2, async_get_next/3,
+ sync_set/1, sync_set/2, sync_set/3,
+ async_set/1, async_set/2, async_set/3,
+ sync_get_bulk/3, sync_get_bulk/4, sync_get_bulk/5,
+ async_get_bulk/3, async_get_bulk/4, async_get_bulk/5,
+ name_to_oid/1, oid_to_name/1,
+ purify_oid/1
+ ]).
+
+
+%%----------------------------------------------------------------------
+%% Internal exports
+%%----------------------------------------------------------------------
+
+-export([
+ main/4
+ ]).
+
+-export([
+ handle_error/3,
+ handle_agent/4,
+ handle_pdu/4,
+ handle_trap/3,
+ handle_inform/3,
+ handle_report/3,
+ handle_pdu/5, % For backwards compatibillity
+ handle_trap/4, % For backwards compatibillity
+ handle_inform/4, % For backwards compatibillity
+ handle_report/4 % For backwards compatibillity
+ ]).
+
+
+-define(SERVER, ?MODULE).
+
+-record(state, {parent, id, reqs = []}).
+%% -record(request, {from, ref, tmr, req_id, type}).
+
+
+%%----------------------------------------------------------------------
+%% The user API
+%%----------------------------------------------------------------------
+
+start() ->
+ start(self()).
+
+start(Parent) ->
+ start(Parent, test_user).
+
+start(Parent, Id) ->
+ proc_lib:start(?MODULE, main, [true, Parent, self(), Id]).
+
+start_link() ->
+ start_link(self()).
+start_link(Parent) ->
+ start_link(Parent, test_user).
+
+start_link(Parent, Id) ->
+ proc_lib:start_link(?MODULE, main, [true, Parent, self(), Id]).
+
+stop() ->
+ cast(stop).
+
+info() ->
+ call(info).
+
+system_info() ->
+ call(system_info).
+
+simulate_crash(Reason) ->
+ call({simulate_crash, Reason}).
+
+register_agent(TargetName, Config)
+ when is_list(TargetName) andalso is_list(Config) ->
+ call({register_agent, TargetName, Config});
+register_agent(Addr, Port) ->
+ register_agent(Addr, Port, []).
+
+register_agent(Addr, Port, Conf) ->
+ call({register_agent, Addr, Port, Conf}).
+
+unregister_agent(TargetName) ->
+ call({unregister_agent, TargetName}).
+unregister_agent(Addr, Port) ->
+ call({unregister_agent, Addr, Port}).
+
+agent_info(TargetName, Item) ->
+ call({agent_info, TargetName, Item}).
+agent_info(Addr, Port, Item) ->
+ call({agent_info, Addr, Port, Item}).
+
+update_agent_info(TargetName, Item, Val) ->
+ call({update_agent_info, TargetName, Item, Val}).
+update_agent_info(Addr, Port, Item, Val) ->
+ call({update_agent_info, Addr, Port, Item, Val}).
+
+which_all_agents() ->
+ call(which_all_agents).
+
+which_own_agents() ->
+ call(which_own_agents).
+
+load_mib(Mib) ->
+ call({load_mib, Mib}).
+
+unload_mib(Mib) ->
+ call({unload_mib, Mib}).
+
+%% --
+
+sync_get(Oids) ->
+ call({sync_get, Oids}).
+
+sync_get(Addr_or_TargetName, Oids) ->
+ call({sync_get, Addr_or_TargetName, Oids}).
+
+sync_get(Addr, Port, Oids) ->
+ call({sync_get, Addr, Port, Oids}).
+
+%% --
+
+async_get(Oids) ->
+ call({async_get, Oids}).
+
+async_get(Addr_or_TargetName, Oids) ->
+ call({async_get, Addr_or_TargetName, Oids}).
+
+async_get(Addr, Port, Oids) ->
+ call({async_get, Addr, Port, Oids}).
+
+%% --
+
+sync_get_next(Oids) ->
+ call({sync_get_next, Oids}).
+
+sync_get_next(Addr_or_TargetName, Oids) ->
+ call({sync_get_next, Addr_or_TargetName, Oids}).
+
+sync_get_next(Addr, Port, Oids) ->
+ call({sync_get_next, Addr, Port, Oids}).
+
+%% --
+
+async_get_next(Oids) ->
+ call({async_get_next, Oids}).
+
+async_get_next(Addr_or_TargetName, Oids) ->
+ call({async_get_next, Addr_or_TargetName, Oids}).
+
+async_get_next(Addr, Port, Oids) ->
+ call({async_get_next, Addr, Port, Oids}).
+
+%% --
+
+sync_set(VAV) ->
+ call({sync_set, VAV}).
+
+sync_set(Addr_or_TargetName, VAV) ->
+ call({sync_set, Addr_or_TargetName, VAV}).
+
+sync_set(Addr, Port, VAV) ->
+ call({sync_set, Addr, Port, VAV}).
+
+%% --
+
+async_set(VAV) ->
+ call({async_set, VAV}).
+
+async_set(Addr_or_TargetName, VAV) ->
+ call({async_set, Addr_or_TargetName, VAV}).
+
+async_set(Addr, Port, VAV) ->
+ call({async_set, Addr, Port, VAV}).
+
+%% --
+
+sync_get_bulk(NonRep, MaxRep, Oids) ->
+ call({sync_get_bulk, NonRep, MaxRep, Oids}).
+
+sync_get_bulk(Addr_or_TargetName, NonRep, MaxRep, Oids) ->
+ call({sync_get_bulk, Addr_or_TargetName, NonRep, MaxRep, Oids}).
+
+sync_get_bulk(Addr, Port, NonRep, MaxRep, Oids) ->
+ call({sync_get_bulk, Addr, Port, NonRep, MaxRep, Oids}).
+
+%% --
+
+async_get_bulk(NonRep, MaxRep, Oids) ->
+ call({async_get_bulk, NonRep, MaxRep, Oids}).
+
+async_get_bulk(Addr_or_TargetName, NonRep, MaxRep, Oids) ->
+ call({async_get_bulk, Addr_or_TargetName, NonRep, MaxRep, Oids}).
+
+async_get_bulk(Addr, Port, NonRep, MaxRep, Oids) ->
+ call({async_get_bulk, Addr, Port, NonRep, MaxRep, Oids}).
+
+%% --
+
+name_to_oid(Name) ->
+ call({name_to_oid, Name}).
+
+oid_to_name(Oid) ->
+ call({oid_to_name, Oid}).
+
+purify_oid(Oid) ->
+ call({purify_oid, Oid}).
+
+
+%%----------------------------------------------------------------------
+
+main(Debug, Parent, Starter, Id) ->
+ put(debug, Debug),
+ d("main -> entry with"
+ "~n Parent: ~p"
+ "~n Starter: ~p"
+ "~n Id: ~p", [Parent, Starter, Id]),
+ case (catch do_init(Id)) of
+ ok ->
+ proc_lib:init_ack(Starter, {ok, self()}),
+ loop(#state{parent = Parent, id = Id});
+ Error ->
+ d("main -> error: "
+ "~p", [Error]),
+ proc_lib:init_ack(Starter, Error)
+ end.
+
+do_init(Id) ->
+ erlang:register(?SERVER, self()),
+ snmpm:register_user(Id, ?MODULE, self()).
+
+
+%%----------------------------------------------------------------------
+
+loop(#state{parent = Parent, id = Id} = S) ->
+ d("loop -> entry"),
+ receive
+ {stop, _From} ->
+ d("loop -> received stop request"),
+ exit(normal);
+
+ {{simulate_crash, Reason}, From, Ref} ->
+ d("loop -> received simulate_crash request"),
+ reply(From, ok, Ref),
+ exit(Reason);
+
+ {info, From, Ref} ->
+ d("loop -> received info request"),
+ Res = snmpm:info(),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {system_info, From, Ref} ->
+ d("loop -> received system_info request"),
+ Res = snmpm_config:system_info(),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{register_agent, TargetName, Conf}, From, Ref} ->
+ d("loop -> received register_agent request"),
+ Res = snmpm:register_agent(Id, TargetName, Conf),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{register_agent, Addr, Port, Conf}, From, Ref} ->
+ d("loop -> received register_agent request"),
+ Res = snmpm:register_agent(Id, Addr, Port, Conf),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{unregister_agent, TargetName}, From, Ref} ->
+ d("loop -> received unregister_agent request"),
+ Res = snmpm:unregister_agent(Id, TargetName),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{unregister_agent, Addr, Port}, From, Ref} ->
+ d("loop -> received unregister_agent request"),
+ Res = snmpm:unregister_agent(Id, Addr, Port),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{agent_info, TargetName, Item}, From, Ref} ->
+ d("loop -> received agent_info request with"
+ "~n TargetName: ~p"
+ "~n Item: ~p", [TargetName, Item]),
+ Res = snmpm:agent_info(TargetName, Item),
+ d("loop -> agent_info for ~p"
+ "~n Res: ~p", [Item, Res]),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{agent_info, Addr, Port, Item}, From, Ref} ->
+ d("loop -> received agent_info request with"
+ "~n Addr: ~p"
+ "~n Port: ~p"
+ "~n Item: ~p", [Addr, Port, Item]),
+ Res = snmpm:agent_info(Addr, Port, Item),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{update_agent_info, TargetName, Item, Val}, From, Ref} ->
+ d("loop -> received update_agent_info request with"
+ "~n TargetName: ~p"
+ "~n Item: ~p"
+ "~n Val: ~p", [TargetName, Item, Val]),
+ Res = snmpm:update_agent_info(Id, TargetName, Item, Val),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{update_agent_info, Addr, Port, Item, Val}, From, Ref} ->
+ d("loop -> received update_agent_info request with"
+ "~n Addr: ~p"
+ "~n Port: ~p"
+ "~n Item: ~p"
+ "~n Val: ~p", [Addr, Port, Item, Val]),
+ Res = snmpm:update_agent_info(Id, Addr, Port, Item, Val),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {which_all_agents, From, Ref} ->
+ d("loop -> received which_all_agents request"),
+ Res = snmpm:which_agents(),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {which_own_agents, From, Ref} ->
+ d("loop -> received which_own_agents request"),
+ Res = snmpm:which_agents(Id),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{load_mib, Mib}, From, Ref} ->
+ d("loop -> received load_mib request"),
+ Res = snmpm:load_mib(Mib),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{unload_mib, Mib}, From, Ref} ->
+ d("loop -> received unload_mib request"),
+ Res = snmpm:unload_mib(Mib),
+ reply(From, Res, Ref),
+ loop(S);
+
+
+ %%
+ %% -- (sync) get-request --
+ %%
+
+ %% No agent specified, so send it to all of them
+ {{sync_get, Oids}, From, Ref} ->
+ d("loop -> received sync_get request "
+ "(for every agent of this user)"),
+ Res = [snmpm:sync_get(Id, TargetName, Oids) ||
+ TargetName <- snmpm:which_agents(Id)],
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_get, TargetName, Oids}, From, Ref} when is_list(TargetName) ->
+ d("loop -> received sync_get request with"
+ "~n TargetName: ~p"
+ "~n Oids: ~p", [TargetName, Oids]),
+ Res = snmpm:sync_get(Id, TargetName, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_get, Addr, Oids}, From, Ref} ->
+ d("loop -> received sync_get request with"
+ "~n Addr: ~p"
+ "~n Oids: ~p", [Addr, Oids]),
+ Res = snmpm:g(Id, Addr, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_get, Addr, Port, Oids}, From, Ref} ->
+ d("loop -> received sync_get request with"
+ "~n Addr: ~p"
+ "~n Port: ~p"
+ "~n Oids: ~p", [Addr, Port, Oids]),
+ Res = snmpm:g(Id, Addr, Port, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+
+ %%
+ %% -- (async) get-request --
+ %%
+
+ %% No agent specified, so send it to all of them
+ {{async_get, Oids}, From, Ref} ->
+ d("loop -> received async_get request"),
+ Res = [snmpm:async_get(Id, TargetName, Oids) ||
+ TargetName <- snmpm:which_agents(Id)],
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_get, TargetName, Oids}, From, Ref} when is_list(TargetName) ->
+ d("loop -> received async_get request with"
+ "~n TargetName: ~p"
+ "~n Oids: ~p", [TargetName, Oids]),
+ Res = snmpm:async_get(Id, TargetName, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_get, Addr, Oids}, From, Ref} ->
+ d("loop -> received async_get request"),
+ Res = snmpm:ag(Id, Addr, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_get, Addr, Port, Oids}, From, Ref} ->
+ d("loop -> received async_get request"),
+ Res = snmpm:ag(Id, Addr, Port, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+
+ %%
+ %% -- (sync) get_next-request --
+ %%
+
+ %% No agent specified, so send it to all of them
+ {{sync_get_next, Oids}, From, Ref} ->
+ d("loop -> received sync_get_next request"),
+ Res = [snmpm:sync_get_next(Id, TargetName, Oids) ||
+ TargetName <- snmpm:which_agents(Id)],
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_get_next, TargetName, Oids}, From, Ref} when is_list(TargetName) ->
+ d("loop -> received sync_get_next request with"
+ "~n TargetName: ~p"
+ "~n Oids: ~p", [TargetName, Oids]),
+ Res = snmpm:sync_get_next(Id, TargetName, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_get_next, Addr, Oids}, From, Ref} ->
+ d("loop -> received sync_get_next request"),
+ Res = snmpm:gn(Id, Addr, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_get_next, Addr, Port, Oids}, From, Ref} ->
+ d("loop -> received sync_get_next request"),
+ Res = snmpm:gn(Id, Addr, Port, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+
+ %%
+ %% -- (async) get_next-request --
+ %%
+
+ %% No agent specified, so send it to all of them
+ {{async_get_next, Oids}, From, Ref} ->
+ d("loop -> received async_get_next request"),
+ Res = [snmpm:async_get_next(Id, TargetName, Oids) ||
+ TargetName <- snmpm:which_agents(Id)],
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_get_next, TargetName, Oids}, From, Ref} when is_list(TargetName) ->
+ d("loop -> received async_get_next request with"
+ "~n TargetName: ~p"
+ "~n Oids: ~p", [TargetName, Oids]),
+ Res = snmpm:async_get_next(Id, TargetName, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_get_next, Addr, Oids}, From, Ref} ->
+ d("loop -> received async_get_next request"),
+ Res = snmpm:agn(Id, Addr, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_get_next, Addr, Port, Oids}, From, Ref} ->
+ d("loop -> received async_get_next request"),
+ Res = snmpm:agn(Id, Addr, Port, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+
+ %%
+ %% -- (sync) set-request --
+ %%
+
+ {{sync_set, VAV}, From, Ref} ->
+ d("loop -> received sync_set request"),
+ Res = [snmpm:sync_set(Id, TargetName, VAV) ||
+ TargetName <- snmpm:which_agents(Id)],
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_set, TargetName, VAV}, From, Ref} when is_list(TargetName) ->
+ d("loop -> received sync_set request"),
+ Res = snmpm:sync_set(Id, TargetName, VAV),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_set, Addr, VAV}, From, Ref} ->
+ d("loop -> received sync_set request"),
+ Res = snmpm:s(Id, Addr, VAV),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_set, Addr, Port, VAV}, From, Ref} ->
+ d("loop -> received sync_set request"),
+ Res = snmpm:s(Id, Addr, Port, VAV),
+ reply(From, Res, Ref),
+ loop(S);
+
+
+ %%
+ %% -- (async) set-request --
+ %%
+
+ {{async_set, VAV}, From, Ref} ->
+ d("loop -> received async_set request"),
+ Res = [snmpm:async_set(Id, TargetName, VAV) ||
+ TargetName <- snmpm:which_agents(Id)],
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_set, TargetName, VAV}, From, Ref} when is_list(TargetName) ->
+ d("loop -> received async_set request"),
+ Res = snmpm:async_set(Id, TargetName, VAV),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_set, Addr, VAV}, From, Ref} ->
+ d("loop -> received async_set request"),
+ Res = snmpm:as(Id, Addr, VAV),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_set, Addr, Port, VAV}, From, Ref} ->
+ d("loop -> received async_set request"),
+ Res = snmpm:as(Id, Addr, Port, VAV),
+ reply(From, Res, Ref),
+ loop(S);
+
+
+ %%
+ %% -- (sync) get-bulk-request --
+ %%
+
+ %% No agent specified, so send it to all of them
+ {{sync_get_bulk, NonRep, MaxRep, Oids}, From, Ref} ->
+ d("loop -> received sync_get_bulk request with"
+ "~n NonRep: ~w"
+ "~n MaxRep: ~w"
+ "~n Oids: ~p", [NonRep, MaxRep, Oids]),
+ Res = [snmpm:sync_get_bulk(Id, TargetName, NonRep, MaxRep, Oids) ||
+ TargetName <- snmpm:which_agents(Id)],
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_get_bulk, TargetName, NonRep, MaxRep, Oids}, From, Ref} when is_list(TargetName) ->
+ d("loop -> received sync_get_bulk request with"
+ "~n TargetName: ~p"
+ "~n NonRep: ~w"
+ "~n MaxRep: ~w"
+ "~n Oids: ~p", [TargetName, NonRep, MaxRep, Oids]),
+ Res = snmpm:sync_get_bulk(Id, TargetName, NonRep, MaxRep, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_get_bulk, Addr, NonRep, MaxRep, Oids}, From, Ref} ->
+ d("loop -> received sync_get_bulk request with"
+ "~n Addr: ~p"
+ "~n NonRep: ~w"
+ "~n MaxRep: ~w"
+ "~n Oids: ~p", [Addr, NonRep, MaxRep, Oids]),
+ Res = snmpm:gb(Id, Addr, NonRep, MaxRep, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{sync_get_bulk, Addr, Port, NonRep, MaxRep, Oids}, From, Ref} ->
+ d("loop -> received sync_get_bulk request with"
+ "~n Addr: ~p"
+ "~n Port: ~w"
+ "~n NonRep: ~w"
+ "~n MaxRep: ~w"
+ "~n Oids: ~p", [Addr, Port, NonRep, MaxRep, Oids]),
+ Res = snmpm:gb(Id, Addr, Port, NonRep, MaxRep, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+
+ %%
+ %% -- (async) get-bulk-request --
+ %%
+
+ %% No agent specified, so send it to all of them
+ {{async_get_bulk, NonRep, MaxRep, Oids}, From, Ref} ->
+ d("loop -> received async_get_bulk request with"
+ "~n NonRep: ~w"
+ "~n MaxRep: ~w"
+ "~n Oids: ~p", [NonRep, MaxRep, Oids]),
+ Res = [snmpm:async_get_bulk(Id, TargetName, NonRep, MaxRep, Oids) ||
+ TargetName <- snmpm:which_agents(Id)],
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_get_bulk, TargetName, NonRep, MaxRep, Oids}, From, Ref} when is_list(TargetName) ->
+ d("loop -> received async_get_bulk request with"
+ "~n TargetName: ~p"
+ "~n NonRep: ~w"
+ "~n MaxRep: ~w"
+ "~n Oids: ~p", [TargetName, NonRep, MaxRep, Oids]),
+ Res = snmpm:async_get_bulk(Id, TargetName, NonRep, MaxRep, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_get_bulk, Addr, NonRep, MaxRep, Oids}, From, Ref} ->
+ d("loop -> received async_get_bulk request with"
+ "~n Addr: ~p"
+ "~n NonRep: ~w"
+ "~n MaxRep: ~w"
+ "~n Oids: ~p", [Addr, NonRep, MaxRep, Oids]),
+ Res = snmpm:agb(Id, Addr, NonRep, MaxRep, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{async_get_bulk, Addr, Port, NonRep, MaxRep, Oids}, From, Ref} ->
+ d("loop -> received async_get_bulk request with"
+ "~n Addr: ~p"
+ "~n Port: ~w"
+ "~n NonRep: ~w"
+ "~n MaxRep: ~w"
+ "~n Oids: ~p", [Addr, Port, NonRep, MaxRep, Oids]),
+ Res = snmpm:agb(Id, Addr, Port, NonRep, MaxRep, Oids),
+ reply(From, Res, Ref),
+ loop(S);
+
+
+ %%
+ %% -- logical name translation --
+ %%
+
+ {{name_to_oid, Name}, From, Ref} ->
+ d("loop -> received name_to_oid request for"
+ "~n Name: ~p", [Name]),
+ Res = snmpm:name_to_oid(Name),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{oid_to_name, Oid}, From, Ref} ->
+ d("loop -> received oid_to_name request for"
+ "~n Oid: ~p", [Oid]),
+ Res = snmpm:oid_to_name(Oid),
+ reply(From, Res, Ref),
+ loop(S);
+
+ {{purify_oid, Oid}, From, Ref} ->
+ d("loop -> received purify_oid request for"
+ "~n Oid: ~p", [Oid]),
+ Res = do_purify_oid(Oid),
+ reply(From, Res, Ref),
+ loop(S);
+
+
+ %% SNMP manager callback messages (from our callback API):
+
+ {handle_error, _Pid, ReqId, Reason} ->
+ d("loop -> received error callback from manager for ~w:"
+ "~n ~p", [ReqId, Reason]),
+ Parent ! {async_event, ReqId, {error, Reason}},
+ loop(S);
+
+ {handle_agent, _Pid, Addr, Port, SnmpInfo} ->
+ d("loop -> received agent callback from manager for ~n ~p:~w",
+ [Addr, Port]),
+ Parent ! {async_event, {Addr, Port}, {agent, SnmpInfo}},
+ loop(S);
+
+ {handle_pdu, _Pid, _TargetName, ReqId, SnmpResponse} ->
+ d("loop -> received pdu callback from manager for ~w", [ReqId]),
+ Parent ! {async_event, ReqId, {pdu, SnmpResponse}},
+ loop(S);
+
+ %% For backwards compatibillity
+ {handle_pdu, _Pid, _Addr, _Port, ReqId, SnmpResponse} ->
+ d("loop -> received pdu callback from manager for ~w", [ReqId]),
+ Parent ! {async_event, ReqId, {pdu, SnmpResponse}},
+ loop(S);
+
+ {handle_trap, _Pid, TargetName, SnmpTrap} ->
+ d("loop -> received trap callback from manager for "
+ "~n ~p",
+ "~n ~p",
+ [TargetName, SnmpTrap]),
+ Parent ! {async_event, TargetName, {trap, SnmpTrap}},
+ loop(S);
+
+ %% For backwards compatibillity
+ {handle_trap, _Pid, Addr, Port, SnmpTrap} ->
+ d("loop -> received trap callback from manager for "
+ "~n ~p:~w",
+ "~n ~p",
+ [Addr, Port, SnmpTrap]),
+ Parent ! {async_event, {Addr, Port}, {trap, SnmpTrap}},
+ loop(S);
+
+ {handle_inform, Pid, TargetName, SnmpInform} ->
+ d("loop -> received inform callback from manager for "
+ "~n ~p",
+ "~n ~p",
+ [TargetName, SnmpInform]),
+ Parent ! {async_event, TargetName, {inform, Pid, SnmpInform}},
+ loop(S);
+
+ %% For backwards compatibillity
+ {handle_inform, Pid, Addr, Port, SnmpInform} ->
+ d("loop -> received inform callback from manager for "
+ "~n ~p:~w",
+ "~n ~p",
+ [Addr, Port, SnmpInform]),
+ Parent ! {async_event, {Addr, Port}, {inform, Pid, SnmpInform}},
+ loop(S);
+
+ {handle_report, _Pid, TargetName, SnmpReport} ->
+ d("loop -> received report callback from manager for "
+ "~n ~p",
+ "~n ~p",
+ [TargetName, SnmpReport]),
+ Parent ! {async_event, TargetName, {report, SnmpReport}},
+ loop(S);
+
+ %% For backwards compatibillity
+ {handle_report, _Pid, Addr, Port, SnmpReport} ->
+ d("loop -> received report callback from manager for "
+ "~n ~p:~w",
+ "~n ~p",
+ [Addr, Port, SnmpReport]),
+ Parent ! {async_event, {Addr, Port}, {report, SnmpReport}},
+ loop(S);
+
+ {'EXIT', Parent, Reason} ->
+ d("received exit signal from parent: ~n~p", [Reason]),
+ info("received exit signal from parent: ~n~p", [Reason]),
+ exit(Reason);
+
+ Unknown ->
+ d("received unknown message: ~n~p", [Unknown]),
+ info("received unknown message: ~n~p", [Unknown]),
+ loop(S)
+ end.
+
+
+%% -------------
+
+do_purify_oid([A|T]) when is_atom(A) ->
+ case snmpm:name_to_oid(A) of
+ {ok, [Oid|_]} ->
+ verify_pure_oid(lists:flatten([Oid|T]));
+ {error, not_found} ->
+ {error, {not_found, A}};
+ {error, _} = Error ->
+ Error
+ end;
+do_purify_oid(L) when is_list(L) ->
+ verify_pure_oid(lists:flatten(L));
+do_purify_oid(X) ->
+ {error, {unpure_oid, X}}.
+
+verify_pure_oid([]) ->
+ [];
+verify_pure_oid([H | T]) when is_integer(H) andalso (H >= 0) ->
+ [H | verify_pure_oid(T)];
+verify_pure_oid([H | _]) ->
+ throw({error, {not_pure_oid, H}}).
+
+
+%% -------------
+
+info(F, A) ->
+ error_logger:info_msg("TEST MGR USER " ++ F ++ "~n", A).
+
+
+%% -------------
+
+call(Req) ->
+ call(Req, 5000).
+
+call(Req, To) when is_integer(To) ->
+ Ref = make_ref(),
+ ?SERVER ! {Req, self(), Ref},
+ receive
+ {Reply, Ref} ->
+ Reply
+ after To ->
+ {error, timeout}
+ end.
+
+reply(Pid, Reply, Ref) ->
+ Pid ! {Reply, Ref}.
+
+cast(Msg) ->
+ ?SERVER ! {Msg, self()},
+ ok.
+
+
+%%----------------------------------------------------------------------
+%% User callback functions:
+%%----------------------------------------------------------------------
+
+handle_error(ReqId, Reason, UserPid) ->
+ UserPid ! {handle_error, self(), ReqId, Reason},
+ ignore.
+
+
+handle_agent(Addr, Port, SnmpInfo, UserPid) ->
+ UserPid ! {handle_agent, self(), Addr, Port, SnmpInfo},
+ ignore.
+
+
+handle_pdu(TargetName, ReqId, SnmpResponse, UserPid) ->
+ UserPid ! {handle_pdu, self(), TargetName, ReqId, SnmpResponse},
+ ignore.
+
+%% For backwards compatibillity
+handle_pdu(Addr, Port, ReqId, SnmpResponse, UserPid) ->
+ UserPid ! {handle_pdu, self(), Addr, Port, ReqId, SnmpResponse},
+ ignore.
+
+
+handle_trap(TargetName, SnmpTrap, UserPid) ->
+ UserPid ! {handle_trap, self(), TargetName, SnmpTrap},
+ ok.
+
+%% For backwards compatibillity
+handle_trap(Addr, Port, SnmpTrap, UserPid) ->
+ UserPid ! {handle_trap, self(), Addr, Port, SnmpTrap},
+ ok.
+
+
+handle_inform(TargetName, SnmpInform, UserPid) ->
+ UserPid ! {handle_inform, self(), TargetName, SnmpInform},
+ receive
+ {handle_inform_no_response, TargetName} ->
+ no_reply;
+ {handle_inform_response, TargetName} ->
+ ok
+ end.
+
+%% For backwards compatibillity
+handle_inform(Addr, Port, SnmpInform, UserPid) ->
+ UserPid ! {handle_inform, self(), Addr, Port, SnmpInform},
+ receive
+ {handle_inform_no_response, {Addr, Port}} ->
+ no_reply;
+ {handle_inform_response, {Addr, Port}} ->
+ ok
+ end.
+
+
+handle_report(TargetName, SnmpReport, UserPid) ->
+ UserPid ! {handle_report, self(), TargetName, SnmpReport},
+ ok.
+
+%% For backwards compatibillity
+handle_report(Addr, Port, SnmpReport, UserPid) ->
+ UserPid ! {handle_report, self(), Addr, Port, SnmpReport},
+ ok.
+
+
+%%----------------------------------------------------------------------
+%% Debug
+%%----------------------------------------------------------------------
+
+d(F) ->
+ d(F, []).
+
+d(F, A) ->
+ d(get(debug), F, A).
+
+d(true, F, A) ->
+ io:format("~w:" ++ F ++ "~n", [?SERVER|A]);
+d(_, _, _) ->
+ ok.