aboutsummaryrefslogtreecommitdiffstats
path: root/lib/snmp/src/manager/snmpm.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/snmp/src/manager/snmpm.erl')
-rw-r--r--lib/snmp/src/manager/snmpm.erl1528
1 files changed, 1528 insertions, 0 deletions
diff --git a/lib/snmp/src/manager/snmpm.erl b/lib/snmp/src/manager/snmpm.erl
new file mode 100644
index 0000000000..141addf440
--- /dev/null
+++ b/lib/snmp/src/manager/snmpm.erl
@@ -0,0 +1,1528 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-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%
+%%
+
+-module(snmpm).
+
+%%----------------------------------------------------------------------
+%% This module implements a simple SNMP manager for Erlang.
+%%----------------------------------------------------------------------
+
+%% User interface
+-export([
+ %%
+ %% Management API
+ start/0, start/1,
+ start_link/0, start_link/1,
+ stop/0,
+
+ monitor/0, demonitor/1,
+ notify_started/1, cancel_notify_started/1,
+
+ backup/1,
+
+ load_mib/1, unload_mib/1,
+ which_mibs/0,
+ name_to_oid/1, oid_to_name/1, oid_to_type/1,
+
+ register_user/3, register_user/4,
+ register_user_monitor/3, register_user_monitor/4,
+ unregister_user/1,
+ which_users/0,
+
+ register_agent/2, register_agent/3, register_agent/4,
+ unregister_agent/2, unregister_agent/3,
+ which_agents/0, which_agents/1,
+ agent_info/2, update_agent_info/4,
+
+ register_usm_user/3, unregister_usm_user/2,
+ which_usm_users/0, which_usm_users/1,
+ usm_user_info/3, update_usm_user_info/4,
+
+ %%
+ %% Basic SNMP API
+ sync_get/3, sync_get/4, sync_get/5, sync_get/6,
+ async_get/3, async_get/4, async_get/5, async_get/6,
+ sync_get_next/3, sync_get_next/4, sync_get_next/5, sync_get_next/6,
+ async_get_next/3, async_get_next/4, async_get_next/5, async_get_next/6,
+ sync_set/3, sync_set/4, sync_set/5, sync_set/6,
+ async_set/3, async_set/4, async_set/5, async_set/6,
+ sync_get_bulk/5, sync_get_bulk/6, sync_get_bulk/7, sync_get_bulk/8,
+ async_get_bulk/5, async_get_bulk/6, async_get_bulk/7, async_get_bulk/8,
+ cancel_async_request/2,
+
+ %%
+ %% Extended SNMP API
+ %% discovery/2, discovery/3, discovery/4, discovery/5, discovery/6,
+
+ %%
+ %% Logging
+ log_to_txt/2, log_to_txt/3, log_to_txt/4,
+ log_to_txt/5, log_to_txt/6, log_to_txt/7,
+ change_log_size/1,
+ get_log_type/0,
+ set_log_type/1,
+
+ reconfigure/0,
+
+ system_start_time/0,
+ sys_up_time/0,
+
+ info/0,
+ verbosity/2
+ ]).
+
+-export([format_reason/1, format_reason/2]).
+
+%% Backward compatibillity exports
+-export([
+ agent_info/3, update_agent_info/5,
+ g/3, g/4, g/5, g/6, g/7,
+ ag/3, ag/4, ag/5, ag/6, ag/7,
+ gn/3, gn/4, gn/5, gn/6, gn/7,
+ agn/3, agn/4, agn/5, agn/6, agn/7,
+ gb/5, gb/6, gb/7, gb/8, gb/9,
+ agb/5, agb/6, agb/7, agb/8, agb/9,
+ s/3, s/4, s/5, s/6, s/7,
+ as/3, as/4, as/5, as/6, as/7
+ ]).
+
+%% Application internal export
+-export([start_link/3, snmpm_start_verify/2, snmpm_start_verify/3]).
+
+
+-include("snmp_debug.hrl").
+-include("snmpm_atl.hrl").
+-include("snmp_types.hrl").
+
+-define(DEFAULT_AGENT_PORT, 161).
+-define(DEFAULT_CONTEXT, "").
+
+
+%% This function is called when the snmp application
+%% starts.
+start_link(Opts, normal, []) ->
+ start_link(Opts).
+
+
+simple_conf() ->
+ Vsns = [v1, v2, v3],
+ {ok, Cwd} = file:get_cwd(),
+ %% Check if the manager config file exist, if not create it
+ MgrConf = filename:join(Cwd, "manager.conf"),
+ case file:read_file_info(MgrConf) of
+ {ok, _} ->
+ ok;
+ _ ->
+ ok = snmp_config:write_manager_config(Cwd, "",
+ [{port, 5000},
+ {engine_id, "mgrEngine"},
+ {max_message_size, 484}])
+ end,
+ Conf = [{dir, Cwd}, {db_dir, Cwd}],
+ [{versions, Vsns}, {config, Conf}].
+
+%% Simple start. Start a manager with default values.
+start_link() ->
+ start_link(simple_conf()).
+
+%% This function is normally not used. Instead the manager is
+%% started as a consequence of a call to application:start(snmp)
+%% when {snmp, [{manager, Options}]} is present in the
+%% node config file.
+start_link(Opts) ->
+ %% This start the manager top supervisor, which in turn
+ %% starts the other processes.
+ {ok, _} = snmpm_supervisor:start_link(normal, Opts),
+ ok.
+
+%% Simple start. Start a manager with default values.
+start() ->
+ start(simple_conf()).
+
+start(Opts) ->
+ %% This start the manager top supervisor, which in turn
+ %% starts the other processes.
+ {ok, Pid} = snmpm_supervisor:start_link(normal, Opts),
+ unlink(Pid),
+ ok.
+
+stop() ->
+ snmpm_supervisor:stop().
+
+
+monitor() ->
+ erlang:monitor(process, snmpm_supervisor).
+
+demonitor(Ref) ->
+ erlang:demonitor(Ref).
+
+
+-define(NOTIFY_START_TICK_TIME, 500).
+
+notify_started(To) when is_integer(To) andalso (To > 0) ->
+ spawn_link(?MODULE, snmpm_start_verify, [self(), To]).
+
+cancel_notify_started(Pid) ->
+ Pid ! {cancel, self()},
+ ok.
+
+snmpm_start_verify(Parent, To) ->
+ ?d("starting", []),
+ snmpm_start_verify(Parent, monitor(), To).
+
+snmpm_start_verify(Parent, _Ref, To) when (To =< 0) ->
+ ?d("timeout", []),
+ unlink(Parent),
+ Parent ! {snmpm_start_timeout, self()};
+snmpm_start_verify(Parent, Ref, To) ->
+ T0 = t(),
+ receive
+ {cancel, Parent} ->
+ ?d("cancel", []),
+ demonitor(Ref),
+ unlink(Parent),
+ exit(normal);
+ {'EXIT', Parent, _} ->
+ exit(normal);
+ {'DOWN', Ref, process, _Object, _Info} ->
+ ?d("down", []),
+ sleep(?NOTIFY_START_TICK_TIME),
+ ?MODULE:snmpm_start_verify(Parent, monitor(), t(T0, To))
+ after ?NOTIFY_START_TICK_TIME ->
+ ?d("down timeout", []),
+ demonitor(Ref),
+ case snmpm_server:is_started() of
+ true ->
+ unlink(Parent),
+ Parent ! {snmpm_started, self()};
+ _ ->
+ ?MODULE:snmpm_start_verify(Parent, monitor(), t(T0, To))
+ end
+ end.
+
+t(T0, T) -> T - (t() - T0).
+t() -> snmp_misc:now(ms).
+sleep(To) -> snmp_misc:sleep(To).
+
+
+%% -- Misc --
+
+backup(BackupDir) ->
+ snmpm_config:backup(BackupDir).
+
+
+%% -- Mibs --
+
+%% Load a mib into the manager
+load_mib(MibFile) ->
+ snmpm_server:load_mib(MibFile).
+
+%% Unload a mib from the manager
+unload_mib(Mib) ->
+ snmpm_server:unload_mib(Mib).
+
+%% Which mib's are loaded
+which_mibs() ->
+ snmpm_config:which_mibs().
+
+%% Get all the possible oid's for the aliasname
+name_to_oid(Name) ->
+ snmpm_config:name_to_oid(Name).
+
+%% Get the aliasname for an oid
+oid_to_name(Oid) ->
+ snmpm_config:oid_to_name(Oid).
+
+%% Get the type for an oid
+oid_to_type(Oid) ->
+ snmpm_config:oid_to_type(Oid).
+
+
+%% -- Info --
+
+info() ->
+ snmpm_server:info().
+
+
+%% -- Verbosity --
+
+%% Change the verbosity of a process in the manager
+verbosity(config, V) ->
+ snmpm_config:verbosity(V);
+verbosity(server, V) ->
+ snmpm_server:verbosity(V);
+verbosity(net_if, V) ->
+ snmpm_server:verbosity(net_if, V);
+verbosity(note_store, V) ->
+ snmpm_server:verbosity(note_store, V);
+verbosity(all, V) ->
+ snmpm_config:verbosity(V),
+ snmpm_server:verbosity(V),
+ snmpm_server:verbosity(net_if, V),
+ snmpm_server:verbosity(note_store, V).
+
+
+%% -- Users --
+
+%% Register the 'user'.
+%% The manager entity responsible for a specific agent.
+%% Module is the callback module (snmpm_user behaviour) which
+%% will be called whenever something happens (detected
+%% agent, incomming reply or incomming trap/notification).
+%% Note that this could have already been done as a
+%% consequence of the node config.
+register_user(Id, Module, Data) ->
+ register_user(Id, Module, Data, []).
+
+%% Default config for agents registered by this user
+register_user(Id, Module, Data, DefaultAgentConfig) ->
+ snmpm_server:register_user(Id, Module, Data, DefaultAgentConfig).
+
+register_user_monitor(Id, Module, Data) ->
+ register_user_monitor(Id, Module, Data, []).
+
+register_user_monitor(Id, Module, Data, DefaultAgentConfig) ->
+ snmpm_server:register_user_monitor(Id, Module, Data, DefaultAgentConfig).
+
+unregister_user(Id) ->
+ snmpm_server:unregister_user(Id).
+
+which_users() ->
+ snmpm_config:which_users().
+
+
+%% -- Agents --
+
+%% Explicitly instruct the manager to handle this agent.
+%% Called to instruct the manager that this agent
+%% shall be handled. These functions is used when
+%% the user know's in advance which agents the
+%% manager shall handle.
+%% Note that there is an alternate way to do the same thing:
+%% Add the agent to the manager config files.
+%%
+%% UserId -> Id of the user responsible for this agent: term()
+%% TargetName -> Unique name for the agent: (string())
+%% Config -> Agent configuration: [config()]
+
+do_register_agent(UserId, TargetName, Config) ->
+ snmpm_config:register_agent(UserId, TargetName, Config).
+
+register_agent(UserId, TargetName, Config)
+ when (is_list(TargetName) andalso
+ (length(TargetName) > 0) andalso
+ is_list(Config)) ->
+ do_register_agent(UserId, TargetName, [{reg_type, target_name} | Config]);
+
+%% Backward compatibillity
+%% Note that the agent engine id is a mandatory config option,
+%% so this function *will* fail!
+register_agent(UserId, Addr, Port) when is_integer(Port) ->
+ register_agent(UserId, Addr, Port, []);
+
+%% Backward compatibillity
+register_agent(UserId, Addr, Config) when is_list(Config) ->
+ register_agent(UserId, Addr, ?DEFAULT_AGENT_PORT, Config).
+
+%% Backward compatibillity
+%% Note that the agent engine id is a mandatory config option,
+%% so this function *will* fail!
+register_agent(UserId, Addr) ->
+ register_agent(UserId, Addr, ?DEFAULT_AGENT_PORT, []).
+
+%% Backward compatibillity
+register_agent(UserId, Addr, Port, Config0) ->
+ case lists:keymember(target_name, 1, Config0) of
+ false ->
+ TargetName = mk_target_name(Addr, Port, Config0),
+ Config = [{reg_type, addr_port},
+ {address, Addr}, {port, Port} | Config0],
+ do_register_agent(UserId, TargetName, ensure_engine_id(Config));
+ true ->
+ {value, {_, TargetName}} =
+ lists:keysearch(target_name, 1, Config0),
+ Config1 = lists:keydelete(target_name, 1, Config0),
+ Config2 = [{reg_type, addr_port},
+ {address, Addr}, {port, Port} | Config1],
+ register_agent(UserId, TargetName, ensure_engine_id(Config2))
+ end.
+
+unregister_agent(UserId, TargetName) when is_list(TargetName) ->
+ snmpm_config:unregister_agent(UserId, TargetName);
+
+%% Backward compatibillity functions
+unregister_agent(UserId, Addr) ->
+ unregister_agent(UserId, Addr, ?DEFAULT_AGENT_PORT).
+
+unregister_agent(UserId, Addr, Port) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ unregister_agent(UserId, TargetName);
+ Error ->
+ Error
+ end.
+
+agent_info(TargetName, Item) ->
+ snmpm_config:agent_info(TargetName, Item).
+
+%% Backward compatibillity
+agent_info(Addr, Port, Item) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ agent_info(TargetName, Item);
+ Error ->
+ Error
+ end.
+
+update_agent_info(UserId, TargetName, Item, Val) ->
+%% p("update_agent_info -> entry with"
+%% "~n UserId: ~p"
+%% "~n TargetName: ~p"
+%% "~n Item: ~p"
+%% "~n Val: ~p", [UserId, TargetName, Item, Val]),
+ snmpm_config:update_agent_info(UserId, TargetName, Item, Val).
+
+%% Backward compatibillity functions
+update_agent_info(UserId, Addr, Port, Item, Val) ->
+%% p("update_agent_info -> entry with"
+%% "~n UserId: ~p"
+%% "~n Addr: ~p"
+%% "~n Port: ~p"
+%% "~n Item: ~p"
+%% "~n Val: ~p", [UserId, Addr, Port, Item, Val]),
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+%% p("update_agent_info -> TargetName: ~p", [TargetName]),
+ update_agent_info(UserId, TargetName, Item, Val);
+ Error ->
+ Error
+ end.
+
+which_agents() ->
+ snmpm_config:which_agents().
+
+which_agents(UserId) ->
+ snmpm_config:which_agents(UserId).
+
+
+%% -- USM users --
+
+register_usm_user(EngineID, UserName, Conf)
+ when is_list(EngineID) andalso is_list(UserName) andalso is_list(Conf) ->
+ snmpm_config:register_usm_user(EngineID, UserName, Conf).
+
+unregister_usm_user(EngineID, UserName)
+ when is_list(EngineID) andalso is_list(UserName) ->
+ snmpm_config:unregister_usm_user(EngineID, UserName).
+
+usm_user_info(EngineID, UserName, Item)
+ when is_list(EngineID) andalso is_list(UserName) andalso is_atom(Item) ->
+ snmpm_config:usm_user_info(EngineID, UserName, Item).
+
+update_usm_user_info(EngineID, UserName, Item, Val)
+ when is_list(EngineID) andalso is_list(UserName) andalso is_atom(Item) ->
+ snmpm_config:update_usm_user_info(EngineID, UserName, Item, Val).
+
+which_usm_users() ->
+ snmpm_config:which_usm_users().
+
+which_usm_users(EngineID) when is_list(EngineID) ->
+ snmpm_config:which_usm_users(EngineID).
+
+
+%% -- Discovery --
+
+%% Start a discovery process
+%% discovery(UserId, BAddr) ->
+%% snmpm_server:discovery(UserId, BAddr).
+
+%% discovery(UserId, BAddr, ExpireOrConfig) ->
+%% snmpm_server:discovery(UserId, BAddr, ExpireOrConfig).
+
+%% discovery(UserId, BAddr, Config, Expire) ->
+%% snmpm_server:discovery(UserId, BAddr, Config, Expire).
+
+%% discovery(UserId, BAddr, Port, Config, Expire) ->
+%% snmpm_server:discovery(UserId, BAddr, Port, Config, Expire).
+
+%% discovery(UserId, BAddr, Port, Config, Expire, ExtraInfo) ->
+%% snmpm_server:discovery(UserId, BAddr, Port, Config, Expire, ExtraInfo).
+
+
+%% -- Requests --
+
+%% --- synchroneous get-request ---
+%%
+
+sync_get(UserId, TargetName, Oids) ->
+%% p("sync_get -> entry with"
+%% "~n UserId: ~p"
+%% "~n TargetName: ~p"
+%% "~n Oids: ~p", [UserId, TargetName, Oids]),
+ sync_get(UserId, TargetName, ?DEFAULT_CONTEXT, Oids).
+
+sync_get(UserId, TargetName, Context, Oids) when is_list(Oids) ->
+%% p("sync_get -> entry with"
+%% "~n UserId: ~p"
+%% "~n TargetName: ~p"
+%% "~n Context: ~p"
+%% "~n Oids: ~p", [UserId, TargetName, Context, Oids]),
+ snmpm_server:sync_get(UserId, TargetName, Context, Oids);
+
+sync_get(UserId, TargetName, Oids, Timeout) when is_integer(Timeout) ->
+%% p("sync_get -> entry with"
+%% "~n UserId: ~p"
+%% "~n TargetName: ~p"
+%% "~n Oids: ~p"
+%% "~n Timeout: ~p", [UserId, TargetName, Oids, Timeout]),
+ sync_get(UserId, TargetName, ?DEFAULT_CONTEXT, Oids, Timeout).
+
+sync_get(UserId, TargetName, Context, Oids, Timeout) ->
+%% p("sync_get -> entry with"
+%% "~n UserId: ~p"
+%% "~n TargetName: ~p"
+%% "~n Context: ~p"
+%% "~n Oids: ~p"
+%% "~n Timeout: ~p", [UserId, TargetName, Context, Oids, Timeout]),
+ snmpm_server:sync_get(UserId, TargetName, Context, Oids, Timeout).
+
+sync_get(UserId, TargetName, Context, Oids, Timeout, ExtraInfo) ->
+%% p("sync_get -> entry with"
+%% "~n UserId: ~p"
+%% "~n TargetName: ~p"
+%% "~n Context: ~p"
+%% "~n Oids: ~p"
+%% "~n Timeout: ~p"
+%% "~n ExtraInfo: ~p",
+%% [UserId, TargetName, Context, Oids, Timeout, ExtraInfo]),
+ snmpm_server:sync_get(UserId, TargetName, Context, Oids, Timeout,
+ ExtraInfo).
+
+
+g(UserId, Addr, Oids) ->
+%% p("g -> entry with"
+%% "~n UserId: ~p"
+%% "~n Addr: ~p"
+%% "~n Oids: ~p", [UserId, Addr, Oids]),
+ g(UserId, Addr, ?DEFAULT_AGENT_PORT, Oids).
+
+g(UserId, Addr, CtxName, Oids) when is_list(CtxName) andalso is_list(Oids) ->
+%% p("g -> entry with"
+%% "~n UserId: ~p"
+%% "~n Addr: ~p"
+%% "~n CtxName: ~p"
+%% "~n Oids: ~p", [UserId, Addr, CtxName, Oids]),
+ g(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, Oids);
+
+g(UserId, Addr, Port, Oids) when is_integer(Port) andalso is_list(Oids) ->
+%% p("g -> entry with"
+%% "~n UserId: ~p"
+%% "~n Addr: ~p"
+%% "~n Port: ~p"
+%% "~n Oids: ~p", [UserId, Addr, Port, Oids]),
+ g(UserId, Addr, Port, ?DEFAULT_CONTEXT, Oids);
+
+g(UserId, Addr, Oids, Timeout)
+ when is_list(Oids) andalso is_integer(Timeout) ->
+%% p("g -> entry with"
+%% "~n UserId: ~p"
+%% "~n Addr: ~p"
+%% "~n Oids: ~p"
+%% "~n Timeout: ~p", [UserId, Addr, Oids, Timeout]),
+ g(UserId, Addr, ?DEFAULT_AGENT_PORT, Oids, Timeout).
+
+g(UserId, Addr, Port, CtxName, Oids)
+ when is_integer(Port) andalso is_list(CtxName) andalso is_list(Oids) ->
+%% p("g -> entry with"
+%% "~n UserId: ~p"
+%% "~n Addr: ~p"
+%% "~n Port: ~p"
+%% "~n Context: ~p"
+%% "~n Oids: ~p", [UserId, Addr, Port, CtxName, Oids]),
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+%% p("g -> TargetName: ~p", [TargetName]),
+ sync_get(UserId, TargetName, CtxName, Oids);
+ Error ->
+ Error
+ end;
+
+g(UserId, Addr, Port, Oids, Timeout)
+ when is_integer(Port) andalso is_list(Oids) andalso is_integer(Timeout) ->
+%% p("g -> entry with"
+%% "~n UserId: ~p"
+%% "~n Addr: ~p"
+%% "~n Oids: ~p"
+%% "~n Timeout: ~p",
+%% [UserId, Addr, Oids, Timeout]),
+ g(UserId, Addr, Port, ?DEFAULT_CONTEXT, Oids, Timeout);
+
+g(UserId, Addr, CtxName, Oids, Timeout)
+ when is_list(CtxName) andalso is_list(Oids) andalso is_integer(Timeout) ->
+%% p("g -> entry with"
+%% "~n UserId: ~p"
+%% "~n Addr: ~p"
+%% "~n CtxName: ~p"
+%% "~n Oids: ~p"
+%% "~n Timeout: ~p",
+%% [UserId, Addr, CtxName, Oids, Timeout]),
+ g(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, Oids, Timeout).
+
+g(UserId, Addr, Port, CtxName, Oids, Timeout) ->
+%% p("g -> entry with"
+%% "~n UserId: ~p"
+%% "~n Addr: ~p"
+%% "~n Port: ~p"
+%% "~n CtxName: ~p"
+%% "~n Oids: ~p"
+%% "~n Timeout: ~p",
+%% [UserId, Addr, Port, CtxName, Oids, Timeout]),
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+%% p("g -> TargetName: ~p", [TargetName]),
+ sync_get(UserId, TargetName, CtxName, Oids, Timeout);
+ Error ->
+ Error
+ end.
+
+g(UserId, Addr, Port, CtxName, Oids, Timeout, ExtraInfo) ->
+%% p("g -> entry with"
+%% "~n UserId: ~p"
+%% "~n Addr: ~p"
+%% "~n Port: ~p"
+%% "~n CtxName: ~p"
+%% "~n Oids: ~p"
+%% "~n Timeout: ~p"
+%% "~n ExtraInfo: ~p",
+%% [UserId, Addr, Port, CtxName, Oids, Timeout, ExtraInfo]),
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+%% p("g -> TargetName: ~p", [TargetName]),
+ sync_get(UserId, TargetName, CtxName, Oids, Timeout, ExtraInfo);
+ Error ->
+ Error
+ end.
+
+
+
+%% --- asynchroneous get-request ---
+%%
+%% The reply will be delivered to the user
+%% through a call to handle_pdu/5
+%%
+
+async_get(UserId, TargetName, Oids) ->
+ async_get(UserId, TargetName, ?DEFAULT_CONTEXT, Oids).
+
+async_get(UserId, TargetName, Context, Oids) when is_list(Oids) ->
+ snmpm_server:async_get(UserId, TargetName, Context, Oids);
+
+async_get(UserId, TargetName, Oids, Expire) when is_integer(Expire) ->
+ async_get(UserId, TargetName, ?DEFAULT_CONTEXT, Oids, Expire).
+
+async_get(UserId, TargetName, Context, Oids, Expire) ->
+ snmpm_server:async_get(UserId, TargetName, Context, Oids, Expire).
+
+async_get(UserId, TargetName, Context, Oids, Expire, ExtraInfo) ->
+ snmpm_server:async_get(UserId, TargetName, Context, Oids, Expire,
+ ExtraInfo).
+
+
+ag(UserId, Addr, Oids) ->
+ ag(UserId, Addr, ?DEFAULT_AGENT_PORT, Oids).
+
+ag(UserId, Addr, Port, Oids) when is_integer(Port) andalso is_list(Oids) ->
+ ag(UserId, Addr, Port, ?DEFAULT_CONTEXT, Oids);
+
+ag(UserId, Addr, CtxName, Oids) when is_list(CtxName) andalso is_list(Oids) ->
+ ag(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, Oids);
+
+ag(UserId, Addr, Oids, Expire) when is_list(Oids) andalso is_integer(Expire) ->
+ ag(UserId, Addr, ?DEFAULT_AGENT_PORT, ?DEFAULT_CONTEXT, Oids, Expire).
+
+ag(UserId, Addr, Port, CtxName, Oids)
+ when is_integer(Port) andalso is_list(CtxName) andalso is_list(Oids) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_get(UserId, TargetName, CtxName, Oids);
+ Error ->
+ Error
+ end;
+
+ag(UserId, Addr, Port, Oids, Expire)
+ when is_integer(Port) andalso is_list(Oids) andalso is_integer(Expire) ->
+ ag(UserId, Addr, Port, ?DEFAULT_CONTEXT, Oids, Expire);
+
+ag(UserId, Addr, CtxName, Oids, Expire)
+ when is_list(CtxName) andalso is_list(Oids) andalso is_integer(Expire) ->
+ ag(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, Oids, Expire).
+
+ag(UserId, Addr, Port, CtxName, Oids, Expire) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_get(UserId, TargetName, CtxName, Oids, Expire);
+ Error ->
+ Error
+ end.
+
+ag(UserId, Addr, Port, CtxName, Oids, Expire, ExtraInfo) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_get(UserId, TargetName, CtxName, Oids, Expire, ExtraInfo);
+ Error ->
+ Error
+ end.
+
+
+
+%% --- synchroneous get_next-request ---
+%%
+
+sync_get_next(UserId, TargetName, Oids) ->
+ sync_get_next(UserId, TargetName, ?DEFAULT_CONTEXT, Oids).
+
+sync_get_next(UserId, TargetName, Context, Oids)
+ when is_list(Context) andalso is_list(Oids) ->
+ snmpm_server:sync_get_next(UserId, TargetName, Context, Oids);
+
+sync_get_next(UserId, TargetName, Oids, Timeout)
+ when is_list(Oids) andalso is_integer(Timeout) ->
+ sync_get_next(UserId, TargetName, ?DEFAULT_CONTEXT, Oids, Timeout).
+
+sync_get_next(UserId, TargetName, Context, Oids, Timeout) ->
+ snmpm_server:sync_get_next(UserId, TargetName, Context, Oids, Timeout).
+
+sync_get_next(UserId, TargetName, Context, Oids, Timeout, ExtraInfo) ->
+ snmpm_server:sync_get_next(UserId, TargetName, Context, Oids, Timeout,
+ ExtraInfo).
+
+
+gn(UserId, Addr, Oids) ->
+ gn(UserId, Addr, ?DEFAULT_AGENT_PORT, Oids).
+
+gn(UserId, Addr, CtxName, Oids) when is_list(CtxName) andalso is_list(Oids) ->
+ gn(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, Oids);
+
+gn(UserId, Addr, Port, Oids) when is_integer(Port) andalso is_list(Oids) ->
+ gn(UserId, Addr, Port, ?DEFAULT_CONTEXT, Oids);
+
+gn(UserId, Addr, Oids, Timeout)
+ when is_list(Oids) andalso is_integer(Timeout) ->
+ gn(UserId, Addr, ?DEFAULT_AGENT_PORT, Oids, Timeout).
+
+gn(UserId, Addr, Port, CtxName, Oids)
+ when is_integer(Port) andalso is_list(CtxName) andalso is_list(Oids) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ sync_get_next(UserId, TargetName, CtxName, Oids);
+ Error ->
+ Error
+ end;
+
+gn(UserId, Addr, Port, Oids, Timeout)
+ when is_integer(Port) andalso is_list(Oids) andalso is_integer(Timeout) ->
+ gn(UserId, Addr, Port, ?DEFAULT_CONTEXT, Oids, Timeout);
+gn(UserId, Addr, CtxName, Oids, Timeout)
+ when is_list(CtxName) andalso is_list(Oids) andalso is_integer(Timeout) ->
+ gn(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, Oids, Timeout).
+
+gn(UserId, Addr, Port, CtxName, Oids, Timeout) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ sync_get_next(UserId, TargetName, CtxName, Oids, Timeout);
+ Error ->
+ Error
+ end.
+
+gn(UserId, Addr, Port, CtxName, Oids, Timeout, ExtraInfo) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ sync_get_next(UserId, TargetName, CtxName, Oids, Timeout, ExtraInfo);
+ Error ->
+ Error
+ end.
+
+
+
+%% --- asynchroneous get_next-request ---
+%%
+
+async_get_next(UserId, TargetName, Oids) ->
+ async_get_next(UserId, TargetName, ?DEFAULT_CONTEXT, Oids).
+
+async_get_next(UserId, TargetName, Context, Oids)
+ when is_list(Context) andalso is_list(Oids) ->
+ snmpm_server:async_get_next(UserId, TargetName, Context, Oids);
+
+async_get_next(UserId, TargetName, Oids, Timeout)
+ when is_list(Oids) andalso is_integer(Timeout) ->
+ async_get_next(UserId, TargetName, ?DEFAULT_CONTEXT, Oids, Timeout).
+
+async_get_next(UserId, TargetName, Context, Oids, Timeout) ->
+ snmpm_server:async_get_next(UserId, TargetName, Context, Oids, Timeout).
+
+async_get_next(UserId, TargetName, Context, Oids, Timeout, ExtraInfo) ->
+ snmpm_server:async_get_next(UserId, TargetName, Context, Oids, Timeout,
+ ExtraInfo).
+
+agn(UserId, Addr, Oids) ->
+ agn(UserId, Addr, ?DEFAULT_AGENT_PORT, Oids).
+
+agn(UserId, Addr, CtxName, Oids) when is_list(CtxName) andalso is_list(Oids) ->
+ agn(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, Oids);
+
+agn(UserId, Addr, Port, Oids) when is_integer(Port) andalso is_list(Oids) ->
+ agn(UserId, Addr, Port, ?DEFAULT_CONTEXT, Oids);
+
+agn(UserId, Addr, Oids, Expire)
+ when is_list(Oids) andalso is_integer(Expire) ->
+ agn(UserId, Addr, ?DEFAULT_AGENT_PORT, Oids, Expire).
+
+agn(UserId, Addr, Port, CtxName, Oids)
+ when is_integer(Port) andalso is_list(CtxName) andalso is_list(Oids) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_get_next(UserId, TargetName, CtxName, Oids);
+ Error ->
+ Error
+ end;
+
+agn(UserId, Addr, Port, Oids, Expire)
+ when is_integer(Port) andalso is_list(Oids) andalso is_integer(Expire) ->
+ agn(UserId, Addr, Port, ?DEFAULT_CONTEXT, Oids, Expire);
+agn(UserId, Addr, CtxName, Oids, Expire)
+ when is_list(CtxName) andalso is_list(CtxName) andalso is_integer(Expire) ->
+ agn(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, Oids, Expire).
+
+agn(UserId, Addr, Port, CtxName, Oids, Expire) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_get_next(UserId, TargetName, CtxName, Oids, Expire);
+ Error ->
+ Error
+ end.
+
+agn(UserId, Addr, Port, CtxName, Oids, Expire, ExtraInfo) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_get_next(UserId, TargetName, CtxName, Oids, Expire,
+ ExtraInfo);
+ Error ->
+ Error
+ end.
+
+
+
+%% --- synchroneous set-request ---
+%%
+
+sync_set(UserId, TargetName, VarsAndVals) ->
+ sync_set(UserId, TargetName, ?DEFAULT_CONTEXT, VarsAndVals).
+
+sync_set(UserId, TargetName, Context, VarsAndVals)
+ when is_list(Context) andalso is_list(VarsAndVals) ->
+ snmpm_server:sync_set(UserId, TargetName, Context, VarsAndVals);
+
+sync_set(UserId, TargetName, VarsAndVals, Timeout)
+ when is_list(VarsAndVals) andalso is_integer(Timeout) ->
+ sync_set(UserId, TargetName, ?DEFAULT_CONTEXT, VarsAndVals, Timeout).
+
+sync_set(UserId, TargetName, Context, VarsAndVals, Timeout) ->
+ snmpm_server:sync_set(UserId, TargetName, Context, VarsAndVals, Timeout).
+
+sync_set(UserId, TargetName, Context, VarsAndVals, Timeout, ExtraInfo) ->
+ snmpm_server:sync_set(UserId, TargetName, Context, VarsAndVals, Timeout,
+ ExtraInfo).
+
+
+s(UserId, Addr, VarsAndVals) ->
+ s(UserId, Addr, ?DEFAULT_AGENT_PORT, VarsAndVals).
+
+s(UserId, Addr, Port, VarsAndVals)
+ when is_integer(Port) andalso is_list(VarsAndVals) ->
+ s(UserId, Addr, Port, ?DEFAULT_CONTEXT, VarsAndVals);
+
+s(UserId, Addr, CtxName, VarsAndVals)
+ when is_list(CtxName) andalso is_list(VarsAndVals) ->
+ s(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, VarsAndVals);
+
+s(UserId, Addr, VarsAndVals, Timeout)
+ when is_list(VarsAndVals) andalso is_integer(Timeout) ->
+ s(UserId, Addr, ?DEFAULT_AGENT_PORT, VarsAndVals, Timeout).
+
+s(UserId, Addr, Port, CtxName, VarsAndVals)
+ when is_integer(Port) andalso
+ is_list(CtxName) andalso
+ is_list(VarsAndVals) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ sync_set(UserId, TargetName, CtxName, VarsAndVals);
+ Error ->
+ Error
+ end;
+
+s(UserId, Addr, Port, VarsAndVals, Timeout)
+ when is_integer(Port) andalso
+ is_list(VarsAndVals) andalso
+ is_integer(Timeout) ->
+ s(UserId, Addr, Port, ?DEFAULT_CONTEXT, VarsAndVals, Timeout);
+
+s(UserId, Addr, CtxName, VarsAndVals, Timeout)
+ when is_list(CtxName) andalso
+ is_list(VarsAndVals) andalso
+ is_integer(Timeout) ->
+ s(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, VarsAndVals, Timeout).
+
+s(UserId, Addr, Port, CtxName, VarsAndVals, Timeout) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ sync_set(UserId, TargetName, CtxName, VarsAndVals, Timeout);
+ Error ->
+ Error
+ end.
+
+s(UserId, Addr, Port, CtxName, VarsAndVals, Timeout, ExtraInfo) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ sync_set(UserId, TargetName, CtxName, VarsAndVals, Timeout, ExtraInfo);
+ Error ->
+ Error
+ end.
+
+
+
+%% --- asynchroneous set-request ---
+%%
+
+async_set(UserId, TargetName, VarsAndVals) ->
+ async_set(UserId, TargetName, ?DEFAULT_CONTEXT, VarsAndVals).
+
+async_set(UserId, TargetName, Context, VarsAndVals)
+ when is_list(Context) andalso is_list(VarsAndVals) ->
+ snmpm_server:async_set(UserId, TargetName, Context, VarsAndVals);
+
+async_set(UserId, TargetName, VarsAndVals, Expire)
+ when is_list(VarsAndVals) andalso is_integer(Expire) ->
+ async_set(UserId, TargetName, ?DEFAULT_CONTEXT, VarsAndVals, Expire).
+
+async_set(UserId, TargetName, Context, VarsAndVals, Expire) ->
+ snmpm_server:async_set(UserId, TargetName, Context, VarsAndVals, Expire).
+
+async_set(UserId, TargetName, Context, VarsAndVals, Expire, ExtraInfo) ->
+ snmpm_server:async_set(UserId, TargetName, Context, VarsAndVals, Expire,
+ ExtraInfo).
+
+
+as(UserId, Addr, VarsAndVals) ->
+ as(UserId, Addr, ?DEFAULT_AGENT_PORT, VarsAndVals).
+
+as(UserId, Addr, Port, VarsAndVals)
+ when is_integer(Port) andalso is_list(VarsAndVals) ->
+ as(UserId, Addr, Port, ?DEFAULT_CONTEXT, VarsAndVals);
+
+as(UserId, Addr, CtxName, VarsAndVals)
+ when is_list(CtxName) andalso is_list(VarsAndVals) ->
+ as(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, VarsAndVals);
+
+as(UserId, Addr, VarsAndVals, Expire)
+ when is_list(VarsAndVals) andalso is_integer(Expire) ->
+ as(UserId, Addr, ?DEFAULT_AGENT_PORT, VarsAndVals, Expire).
+
+as(UserId, Addr, Port, CtxName, VarsAndVals)
+ when is_integer(Port) andalso
+ is_list(CtxName) andalso
+ is_list(VarsAndVals) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_set(UserId, TargetName, CtxName, VarsAndVals);
+ Error ->
+ Error
+ end;
+
+as(UserId, Addr, Port, VarsAndVals, Expire)
+ when is_integer(Port) andalso
+ is_list(VarsAndVals) andalso
+ is_integer(Expire) ->
+ as(UserId, Addr, Port, ?DEFAULT_CONTEXT, VarsAndVals, Expire);
+
+as(UserId, Addr, CtxName, VarsAndVals, Expire)
+ when is_list(CtxName) andalso
+ is_list(VarsAndVals) andalso
+ is_integer(Expire) ->
+ as(UserId, Addr, ?DEFAULT_AGENT_PORT, CtxName, VarsAndVals, Expire).
+
+as(UserId, Addr, Port, CtxName, VarsAndVals, Expire) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_set(UserId, TargetName, CtxName, VarsAndVals, Expire);
+ Error ->
+ Error
+ end.
+
+as(UserId, Addr, Port, CtxName, VarsAndVals, Expire, ExtraInfo) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_set(UserId, TargetName, CtxName, VarsAndVals, Expire, ExtraInfo);
+ Error ->
+ Error
+ end.
+
+
+
+
+%% --- synchroneous get-bulk ---
+%%
+
+sync_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids) ->
+ sync_get_bulk(UserId, TargetName, NonRep, MaxRep, ?DEFAULT_CONTEXT, Oids).
+
+sync_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids)
+ when is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(Context) andalso
+ is_list(Oids) ->
+ snmpm_server:sync_get_bulk(UserId, TargetName,
+ NonRep, MaxRep,
+ Context, Oids);
+
+sync_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids, Timeout)
+ when is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(Oids) andalso
+ is_integer(Timeout) ->
+ sync_get_bulk(UserId, TargetName, NonRep, MaxRep,
+ ?DEFAULT_CONTEXT, Oids, Timeout).
+
+sync_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids, Timeout) ->
+ snmpm_server:sync_get_bulk(UserId, TargetName, NonRep, MaxRep,
+ Context, Oids, Timeout).
+
+sync_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids, Timeout,
+ ExtraInfo) ->
+ snmpm_server:sync_get_bulk(UserId, TargetName, NonRep, MaxRep,
+ Context, Oids, Timeout, ExtraInfo).
+
+
+gb(UserId, Addr, NonRep, MaxRep, Oids) ->
+ gb(UserId, Addr, ?DEFAULT_AGENT_PORT, NonRep, MaxRep, Oids).
+
+gb(UserId, Addr, Port, NonRep, MaxRep, Oids)
+ when is_integer(Port) andalso
+ is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(Oids) ->
+ gb(UserId, Addr, Port, NonRep, MaxRep, ?DEFAULT_CONTEXT, Oids);
+
+gb(UserId, Addr, NonRep, MaxRep, CtxName, Oids)
+ when is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(CtxName) andalso
+ is_list(Oids) ->
+ gb(UserId, Addr, ?DEFAULT_AGENT_PORT, NonRep, MaxRep, CtxName, Oids);
+
+gb(UserId, Addr, NonRep, MaxRep, Oids, Timeout)
+ when is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(Oids) andalso
+ is_integer(Timeout) ->
+ gb(UserId, Addr, ?DEFAULT_AGENT_PORT, NonRep, MaxRep, Oids, Timeout).
+
+gb(UserId, Addr, Port, NonRep, MaxRep, CtxName, Oids)
+ when is_integer(Port) andalso
+ is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(CtxName) andalso
+ is_list(Oids) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ sync_get_bulk(UserId, TargetName, NonRep, MaxRep, CtxName, Oids);
+ Error ->
+ Error
+ end;
+
+gb(UserId, Addr, Port, NonRep, MaxRep, Oids, Timeout)
+ when is_integer(Port) andalso
+ is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(Oids) andalso
+ is_integer(Timeout) ->
+ gb(UserId, Addr, Port, NonRep, MaxRep, ?DEFAULT_CONTEXT, Oids, Timeout);
+
+gb(UserId, Addr, NonRep, MaxRep, CtxName, Oids, Timeout)
+ when is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(CtxName) andalso
+ is_list(Oids) andalso
+ is_integer(Timeout) ->
+ gb(UserId, Addr, ?DEFAULT_AGENT_PORT, NonRep, MaxRep, CtxName, Oids,
+ Timeout).
+
+gb(UserId, Addr, Port, NonRep, MaxRep, CtxName, Oids, Timeout) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ sync_get_bulk(UserId, TargetName,
+ NonRep, MaxRep, CtxName, Oids, Timeout);
+ Error ->
+ Error
+ end.
+
+gb(UserId, Addr, Port, NonRep, MaxRep, CtxName, Oids, Timeout, ExtraInfo) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ sync_get_bulk(UserId, TargetName,
+ NonRep, MaxRep, CtxName, Oids, Timeout, ExtraInfo);
+ Error ->
+ Error
+ end.
+
+
+
+%% --- asynchroneous get-bulk ---
+%%
+
+async_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids) ->
+ async_get_bulk(UserId, TargetName, NonRep, MaxRep, ?DEFAULT_CONTEXT, Oids).
+
+async_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids)
+ when is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(Context) andalso
+ is_list(Oids) ->
+ snmpm_server:async_get_bulk(UserId, TargetName,
+ NonRep, MaxRep, Context, Oids);
+
+async_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids, Expire)
+ when is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(Oids) andalso
+ is_integer(Expire) ->
+ async_get_bulk(UserId, TargetName,
+ NonRep, MaxRep, ?DEFAULT_CONTEXT, Oids, Expire).
+
+async_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids, Expire) ->
+ snmpm_server:async_get_bulk(UserId, TargetName,
+ NonRep, MaxRep, Context, Oids, Expire).
+
+async_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids, Expire,
+ ExtraInfo) ->
+ snmpm_server:async_get_bulk(UserId, TargetName,
+ NonRep, MaxRep,
+ Context, Oids, Expire, ExtraInfo).
+
+
+agb(UserId, Addr, NonRep, MaxRep, Oids) ->
+ agb(UserId, Addr, ?DEFAULT_AGENT_PORT, NonRep, MaxRep, Oids).
+
+agb(UserId, Addr, Port, NonRep, MaxRep, Oids)
+ when is_integer(Port) andalso
+ is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(Oids) ->
+ agb(UserId, Addr, Port, NonRep, MaxRep, ?DEFAULT_CONTEXT, Oids);
+
+agb(UserId, Addr, NonRep, MaxRep, CtxName, Oids)
+ when is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(CtxName) andalso
+ is_list(Oids) ->
+ agb(UserId, Addr, ?DEFAULT_AGENT_PORT, NonRep, MaxRep, CtxName, Oids);
+
+agb(UserId, Addr, NonRep, MaxRep, Oids, Expire)
+ when is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(Oids) andalso
+ is_integer(Expire) ->
+ agb(UserId, Addr, ?DEFAULT_AGENT_PORT, NonRep, MaxRep, Oids, Expire).
+
+agb(UserId, Addr, Port, NonRep, MaxRep, CtxName, Oids)
+ when is_integer(Port) andalso
+ is_integer(NonRep) andalso
+ is_integer(MaxRep),
+ is_list(CtxName) andalso
+ is_list(Oids) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_get_bulk(UserId, TargetName,
+ NonRep, MaxRep, CtxName, Oids);
+ Error ->
+ Error
+ end;
+
+agb(UserId, Addr, Port, NonRep, MaxRep, Oids, Expire)
+ when is_integer(Port) andalso
+ is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(Oids) andalso
+ is_integer(Expire) ->
+ agb(UserId, Addr, Port, NonRep, MaxRep, ?DEFAULT_CONTEXT, Oids, Expire);
+
+agb(UserId, Addr, NonRep, MaxRep, CtxName, Oids, Expire)
+ when is_integer(NonRep) andalso
+ is_integer(MaxRep) andalso
+ is_list(CtxName) andalso
+ is_list(Oids) andalso
+ is_integer(Expire) ->
+ agb(UserId, Addr, ?DEFAULT_AGENT_PORT, NonRep, MaxRep, CtxName, Oids).
+
+agb(UserId, Addr, Port, NonRep, MaxRep, CtxName, Oids, Expire) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_get_bulk(UserId, TargetName,
+ NonRep, MaxRep, CtxName, Oids, Expire);
+ Error ->
+ Error
+ end.
+
+agb(UserId, Addr, Port, NonRep, MaxRep, CtxName, Oids, Expire, ExtraInfo) ->
+ case target_name(Addr, Port) of
+ {ok, TargetName} ->
+ async_get_bulk(UserId, TargetName,
+ NonRep, MaxRep, CtxName, Oids, Expire,
+ ExtraInfo);
+ Error ->
+ Error
+ end.
+
+
+cancel_async_request(UserId, ReqId) ->
+ snmpm_server:cancel_async_request(UserId, ReqId).
+
+
+%%%-----------------------------------------------------------------
+%%% Audit Trail Log functions (for backward compatibillity)
+%%%-----------------------------------------------------------------
+log_to_txt(LogDir, Mibs) ->
+ OutFile = "snmpm_log.txt",
+ LogName = ?audit_trail_log_name,
+ LogFile = ?audit_trail_log_file,
+ snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile).
+log_to_txt(LogDir, Mibs, OutFile) ->
+ LogName = ?audit_trail_log_name,
+ LogFile = ?audit_trail_log_file,
+ snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile).
+log_to_txt(LogDir, Mibs, OutFile, LogName) ->
+ LogFile = ?audit_trail_log_file,
+ snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile).
+log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile) ->
+ snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile).
+log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start) ->
+ snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start).
+log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start, Stop) ->
+ snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start, Stop).
+
+
+change_log_size(NewSize) ->
+ LogName = ?audit_trail_log_name,
+ snmp:change_log_size(LogName, NewSize).
+
+
+get_log_type() ->
+ snmpm_server:get_log_type().
+
+%% NewType -> atl_type()
+set_log_type(NewType) ->
+ snmpm_server:set_log_type(NewType).
+
+
+reconfigure() ->
+ snmpm_server:reconfigure().
+
+
+%%%-----------------------------------------------------------------
+
+system_start_time() ->
+ {ok, Time} = snmpm_config:system_start_time(),
+ Time.
+
+sys_up_time() ->
+ % time in 0.01 seconds.
+ StartTime = system_start_time(),
+ (snmp_misc:now(cs) - StartTime) rem (2 bsl 31).
+
+
+%%%-----------------------------------------------------------------
+%%% This is just some simple utility functions to create a pretty-
+%%% printable string of the error reason received from either:
+%%%
+%%% * If any of the sync/async get/get-next/set/get-bulk
+%%% returnes {error, Reason}
+%%% * The Reason parameter in the handle_error user callback
+%%% function
+%%%
+%%%-----------------------------------------------------------------
+
+format_reason(Reason) ->
+ format_reason("", Reason).
+
+format_reason(Prefix, Reason) when is_integer(Prefix) and (Prefix >= 0) ->
+ format_reason(lists:duplicate(Prefix, $ ), Reason);
+format_reason(Prefix, Reason) when is_list(Prefix) ->
+ case (catch do_format_reason(Prefix, Reason)) of
+ FL when is_list(FL) ->
+ FL;
+ _ ->
+ %% Crap, try it without any fancy formatting
+ case (catch io_lib:format("~sInternal manager error: ~n"
+ "~s ~p~n",
+ [Prefix, Prefix, Reason])) of
+ L1 when is_list(L1) ->
+ lists:flatten(L1);
+ _ ->
+ %% Really crap, try it without the prefix
+ case (catch io_lib:format("Internal manager error: ~n"
+ " ~p~n",
+ [Reason])) of
+ L2 when is_list(L2) ->
+ lists:flatten(L2);
+ _ ->
+ %% Ok, I give up
+ "Illegal input. Unable to format error reason"
+ end
+ end
+ end.
+
+
+do_format_reason(Prefix, {failed_generating_response, {RePdu, Reason}}) ->
+ FmtPdu = format_pdu(Prefix ++ " ", RePdu),
+ lists:flatten(io_lib:format("~sFailed generating response: ~n"
+ "~s"
+ "~s ~p~n",
+ [Prefix, FmtPdu, Prefix, Reason]));
+do_format_reason(Prefix, {failed_processing_message, Reason}) ->
+ lists:flatten(io_lib:format("~sFailed processing message: ~n"
+ "~s ~p~n",
+ [Prefix, Prefix, Reason]));
+do_format_reason(Prefix, {unexpected_pdu, SnmpInfo}) ->
+ FmtSnmpInfo = format_snmp_info(Prefix ++ " ", SnmpInfo),
+ lists:flatten(io_lib:format("~sUnexpected PDU: ~n~s",
+ [Prefix, FmtSnmpInfo]));
+do_format_reason(Prefix, {send_failed, ReqId, Reason}) ->
+ lists:flatten(io_lib:format("~sSend failed: ~n"
+ "~s Request id: ~w~n"
+ "~s Reason: ~p~n",
+ [Prefix, Prefix, ReqId, Prefix, Reason]));
+do_format_reason(Prefix, {invalid_sec_info, SecInfo, SnmpInfo}) ->
+ FmtSecInfo = format_sec_info(Prefix ++ " ", SecInfo),
+ FmtSnmpInfo = format_snmp_info(Prefix ++ " ", SnmpInfo),
+ lists:flatten(io_lib:format("~sInvalid security info: ~n"
+ "~s"
+ "~s",
+ [Prefix, FmtSecInfo, FmtSnmpInfo]));
+do_format_reason(Prefix, Reason) ->
+ lists:flatten(io_lib:format("~sInternal manager error: ~n"
+ "~s ~p~n", [Prefix, Prefix, Reason])).
+
+format_pdu(Prefix, #pdu{type = Type,
+ request_id = ReqId,
+ error_status = ES,
+ error_index = EI,
+ varbinds = VBs}) ->
+ FmtPdyType = format_pdu_type(Type),
+ FmtErrStatus = format_error_status(ES),
+ FmtErrIdx = format_error_index(EI),
+ FmtVBs = format_varbinds(Prefix ++ " ", VBs),
+ lists:flatten(io_lib:format("~s~s: ~n"
+ "~s Request-id: ~w~n"
+ "~s Error-status: ~s~n"
+ "~s Error-index: ~s~n"
+ "~s",
+ [Prefix, FmtPdyType,
+ Prefix, ReqId,
+ Prefix, FmtErrStatus,
+ Prefix, FmtErrIdx,
+ FmtVBs]));
+format_pdu(Prefix, #trappdu{enterprise = E,
+ agent_addr = AA,
+ generic_trap = GT,
+ specific_trap = ST,
+ time_stamp = TS,
+ varbinds = VBs}) ->
+ FmtVBs = format_varbinds(Prefix ++ " ", VBs),
+ lists:flatten(io_lib:format("~sTrap PDU: ~n"
+ "~s Enterprise: ~p~n"
+ "~s Agent address: ~p~n"
+ "~s Generic trap: ~p~n"
+ "~s Specific trap: ~p~n"
+ "~s Time stamp: ~p~n"
+ "~s",
+ [Prefix,
+ Prefix, E,
+ Prefix, AA,
+ Prefix, GT,
+ Prefix, ST,
+ Prefix, TS,
+ FmtVBs]));
+format_pdu(Prefix, PDU) ->
+ lists:flatten(io_lib:format("~s~p~n", [Prefix, PDU])).
+
+format_pdu_type('get-request') ->
+ "GetRequest-PDU";
+format_pdu_type('get-next-request') ->
+ "GetNextRequest-PDU";
+format_pdu_type('get-response') ->
+ "Response-PDU";
+format_pdu_type('set-request') ->
+ "SetRequest-PDU";
+format_pdu_type('get-bulk-request') ->
+ "GetBulkRequest-PDU";
+format_pdu_type('inform-request') ->
+ "InformRequest-PDU";
+format_pdu_type('snmpv2-trap') ->
+ "SNMPv2-Trap-PDU";
+format_pdu_type(report) ->
+ "Report-PDU";
+format_pdu_type(T) ->
+ lists:flatten(io_lib:format("~p", [T])).
+
+format_snmp_info(Prefix, {ES, EI, VBs}) ->
+ lists:flatten(io_lib:format("~sSNMP info: ~n"
+ "~s Error-status: ~s~n"
+ "~s Error-index: ~s~n"
+ "~s",
+ [Prefix,
+ Prefix, format_error_status(ES),
+ Prefix, format_error_index(EI),
+ format_varbinds(Prefix ++ " ", VBs)]));
+format_snmp_info(Prefix, JunkSnmpInfo) ->
+ lists:flatten(io_lib:format("~sJunk SNMP info: ~n"
+ "~s ~p~n",
+ [Prefix, Prefix, JunkSnmpInfo])).
+
+format_error_status(ES) ->
+ lists:flatten(io_lib:format("~p", [ES])).
+
+format_error_index(EI) ->
+ lists:flatten(io_lib:format("~p", [EI])).
+
+format_sec_info(Prefix, Info) ->
+ FmtSecInfo = do_format_sec_info(Prefix ++ " ", Info),
+ lists:flatten(io_lib:format("~sSecurity info: ~n~s",
+ [Prefix, FmtSecInfo])).
+
+do_format_sec_info(_Prefix, []) ->
+ "";
+do_format_sec_info(Prefix, [{Tag, ExpVal, Val}|T]) ->
+ format_sec_info(Prefix, Tag, ExpVal, Val) ++
+ do_format_sec_info(Prefix, T).
+
+
+format_sec_info(_Prefix, _Tag, Val, Val) ->
+ "";
+format_sec_info(Prefix, Tag, ExpVal, Val) ->
+ lists:flatten(io_lib:format("~s~s:~n"
+ "~s Expected value: ~p~n"
+ "~s Actual value: ~p~n",
+ [Prefix, format_sec_info_tag(Tag),
+ Prefix, ExpVal,
+ Prefix, Val])).
+
+format_sec_info_tag(sec_engine_id) ->
+ "Sec engine id";
+format_sec_info_tag(msg_sec_model) ->
+ "Msg sec model";
+format_sec_info_tag(sec_name) ->
+ "Sec name";
+format_sec_info_tag(sec_level) ->
+ "Sec level";
+format_sec_info_tag(ctx_engine_id) ->
+ "Context engine id";
+format_sec_info_tag(ctx_name) ->
+ "Context name";
+format_sec_info_tag(request_id) ->
+ "Request id";
+format_sec_info_tag(T) ->
+ lists:flatten(io_lib:format("~p", [T])).
+
+format_varbinds(Prefix, []) ->
+ lists:flatten(io_lib:format("~sVarbinds: []~n", [Prefix]));
+format_varbinds(Prefix, VBs) when is_list(VBs) ->
+ lists:flatten(io_lib:format("~sVarbinds: ~n~s",
+ [Prefix, format_vbs(Prefix ++ " ", VBs)]));
+format_varbinds(Prefix, VBs) ->
+ lists:flatten(io_lib:format("~sInvalid varbinds: ~n"
+ "~s ~p~n",
+ [Prefix, Prefix, VBs])).
+
+format_vbs(_Prefix, []) ->
+ "";
+format_vbs(Prefix, [VB|VBs]) ->
+ format_vb(Prefix, VB) ++ format_vbs(Prefix, VBs).
+
+format_vb(Prefix, #varbind{oid = Oid0,
+ variabletype = Type,
+ value = Val,
+ org_index = Idx}) ->
+ Oid =
+ case snmpm:oid_to_name(Oid0) of
+ {ok, O} ->
+ O;
+ _ ->
+ Oid0
+ end,
+ FmtVT = format_vb_variabletype(Prefix ++ " ", Type),
+ FmtVal = format_vb_value(Prefix ++ " ", Type, Val),
+ lists:flatten(io_lib:format("~s~w:~n"
+ "~s"
+ "~s"
+ "~s Org-index: ~p~n",
+ [Prefix, Oid,
+ FmtVT,
+ FmtVal,
+ Prefix, Idx]));
+format_vb(Prefix, JunkVB) ->
+ lists:flatten(io_lib:format("~sJunk varbind:~n"
+ "~s ~p~n", [Prefix, Prefix, JunkVB])).
+
+format_vb_variabletype(Prefix, Type) when is_atom(Type) ->
+ lists:flatten(io_lib:format("~sVariable-type: ~s~n",
+ [Prefix, atom_to_list(Type)]));
+format_vb_variabletype(Prefix, Type) ->
+ lists:flatten(io_lib:format("~sVariable-type: ~p~n", [Prefix, Type])).
+
+format_vb_value(Prefix, _Type, Val) ->
+ lists:flatten(io_lib:format("~sValue: ~p~n", [Prefix, Val])).
+
+
+%% ---------------------------------------------------------------------------
+%%
+%% --- Internal utility functions ---
+%%
+
+target_name(Addr, Port) ->
+ snmpm_config:agent_info(Addr, Port, target_name).
+
+mk_target_name(Addr, Port, Config) ->
+ snmpm_config:mk_target_name(Addr, Port, Config).
+
+ensure_engine_id(Config) ->
+ case lists:keymember(engine_id, 1, Config) of
+ true ->
+ Config;
+ false ->
+ DefaultEngineId = "agentEngine-default",
+ [{engine_id, DefaultEngineId} | Config]
+ end.
+
+
+
+%% p(F) ->
+%% p(F, []).
+
+%% p(F, A) ->
+%% io:format("~w:" ++ F ++ "~n", [?MODULE | A]).