%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2004-2010. 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%
%%
%%% @doc Common Test user interface module for the OTP snmp application
%%%
%%% The purpose of this module is to make snmp configuration easier for
%%% the test case writer. Many test cases can use default values for common
%%% operations and then no snmp configuration files need to be supplied. When
%%% it is necessary to change particular configuration parameters, a subset
%%% of the relevant snmp configuration files may be passed to ct_snmp
%%% by means of Common Test configuration files.
%%% For more specialized configuration parameters, it is possible to place a
%%% "simple snmp configuration file" in the test suite data directory.
%%% To simplify the test suite, Common Test keeps track
%%% of some of the snmp manager information. This way the test suite doesn't
%%% have to handle as many input parameters as it would if it had to interface the
%%% OTP snmp manager directly.
%%%
%%%
The following snmp manager and agent parameters are configurable:
%%% %%%%%% {snmp, %%% %%% Manager config %%% [{start_manager, boolean()} % Optional - default is true %%% {users, [{user_name(), [call_back_module(), user_data()]}]}, %% Optional %%% {usm_users, [{usm_user_name(), usm_config()}]},%% Optional - snmp v3 only %%% % managed_agents is optional %%% {managed_agents,[{agent_name(), [user_name(), agent_ip(), agent_port(), [agent_config()]]}]}, %%% {max_msg_size, integer()}, % Optional - default is 484 %%% {mgr_port, integer()}, % Optional - default is 5000 %%% {engine _id, string()}, % Optional - default is "mgrEngine" %%% %%% %%% Agent config %%% {start_agent, boolean()}, % Optional - default is false %%% {agent_sysname, string()}, % Optional - default is "ct_test" %%% {agent_manager_ip, manager_ip()}, % Optional - default is localhost %%% {agent_vsns, list()}, % Optional - default is [v2] %%% {agent_trap_udp, integer()}, % Optional - default is 5000 %%% {agent_udp, integer()}, % Optional - default is 4000 %%% {agent_notify_type, atom()}, % Optional - default is trap %%% {agent_sec_type, sec_type()}, % Optional - default is none %%% {agent_passwd, string()}, % Optional - default is "" %%% {agent_engine_id, string()}, % Optional - default is "agentEngine" %%% {agent_max_msg_size, string()},% Optional - default is 484 %%% %%% %% The following parameters represents the snmp configuration files %%% %% context.conf, standard.conf, community.conf, vacm.conf, %%% %% usm.conf, notify.conf, target_addr.conf and target_params.conf. %%% %% Note all values in agent.conf can be altered by the parametes %%% %% above. All these configuration files have default values set %%% %% up by the snmp application. These values can be overridden by %%% %% suppling a list of valid configuration values or a file located %%% %% in the test suites data dir that can produce a list %%% %% of valid configuration values if you apply file:consult/1 to the %%% %% file. %%% {agent_contexts, [term()] | {data_dir_file, rel_path()}}, % Optional %%% {agent_community, [term()] | {data_dir_file, rel_path()}},% Optional %%% {agent_sysinfo, [term()] | {data_dir_file, rel_path()}}, % Optional %%% {agent_vacm, [term()] | {data_dir_file, rel_path()}}, % Optional %%% {agent_usm, [term()] | {data_dir_file, rel_path()}}, % Optional %%% {agent_notify_def, [term()] | {data_dir_file, rel_path()}},% Optional %%% {agent_target_address_def, [term()] | {data_dir_file, rel_path()}},% Optional %%% {agent_target_param_def, [term()] | {data_dir_file, rel_path()}},% Optional %%% ]}. %%%%%% %%%
The MgrAgentConfName
parameter in the functions
%%% should be a name you allocate in your test suite using a
%%% require
statement.
%%% Example (where MgrAgentConfName = snmp_mgr_agent
):
suite() -> [{require, snmp_mgr_agent, snmp}].%%%
or
%%%ct:require(snmp_mgr_agent, snmp).%%% %%%
Note that Usm users are needed for snmp v3 configuration and are %%% not to be confused with users.
%%% %%%Snmp traps, inform and report messages are handled by the %%% user callback module. For more information about this see %%% the snmp application.
%%%Note: It is recommended to use the .hrl-files created by the %%% Erlang/OTP mib-compiler to define the oids. %%% Example for the getting the erlang node name from the erlNodeTable %%% in the OTP-MIB:
%%%Oid = ?erlNodeEntry ++ [?erlNodeName, 1]%%% %%%
It is also possible to set values for snmp application configuration
%%% parameters, such as config
, server
,
%%% net_if
, etc (see the "Configuring the application" chapter in
%%% the OTP snmp User's Guide for a list of valid parameters and types). This is
%%% done by defining a configuration data variable on the following form:
%%% {snmp_app, [{manager, [snmp_app_manager_params()]}, %%% {agent, [snmp_app_agent_params()]}]}.%%% %%%
A name for the data needs to be allocated in the suite using
%%% require
(see example above), and this name passed as
%%% the SnmpAppConfName
argument to start/3
.
%%% ct_snmp
specifies default values for some snmp application
%%% configuration parameters (such as {verbosity,trace}
for the
%%% config
parameter). This set of defaults will be
%%% merged with the parameters specified by the user, and user values
%%% override ct_snmp
defaults.
MgrAgentConfName
will be performed. When using snmp
%%% v3 also so called usm users will be registered. Note that users,
%%% usm_users and managed agents may also be registered at a later time
%%% using ct_snmp:register_users/2, ct_snmp:register_agents/2, and
%%% ct_snmp:register_usm_users/2. The agent started will be
%%% called snmp_master_agent
. Use ct_snmp:load_mibs/1 to load
%%% mibs into the agent. With SnmpAppConfName
it's possible
%%% to configure the snmp application with parameters such as config
,
%%% mibs
, net_if
, etc. The values will be merged
%%% with (and possibly override) default values set by ct_snmp
.
start(Config, MgrAgentConfName, SnmpAppConfName) ->
StartManager= ct:get_config({MgrAgentConfName, start_manager}, true),
StartAgent = ct:get_config({MgrAgentConfName, start_agent}, false),
SysName = ct:get_config({MgrAgentConfName, agent_sysname}, "ct_test"),
{ok, HostName} = inet:gethostname(),
{ok, Addr} = inet:getaddr(HostName, inet),
IP = tuple_to_list(Addr),
AgentManagerIP = ct:get_config({MgrAgentConfName, agent_manager_ip}, IP),
prepare_snmp_env(),
setup_agent(StartAgent, MgrAgentConfName, SnmpAppConfName,
Config, SysName, AgentManagerIP, IP),
setup_manager(StartManager, MgrAgentConfName, SnmpAppConfName,
Config, AgentManagerIP),
application:start(snmp),
manager_register(StartManager, MgrAgentConfName).
%%% @spec stop(Config) -> ok
%%% Config = [{Key, Value}]
%%% Key = atom()
%%% Value = term()
%%%
%%% @doc Stops the snmp manager and/or agent removes all files created.
stop(Config) ->
PrivDir = ?config(priv_dir, Config),
application:stop(snmp),
application:stop(mnesia),
MgrDir = filename:join(PrivDir,"mgr"),
ConfDir = filename:join(PrivDir, "conf"),
DbDir = filename:join(PrivDir,"db"),
catch del_dir(MgrDir),
catch del_dir(ConfDir),
catch del_dir(DbDir).
%%% @spec get_values(Agent, Oids, MgrAgentConfName) -> SnmpReply
%%%
%%% Agent = agent_name()
%%% Oids = oids()
%%% MgrAgentConfName = atom()
%%% SnmpReply = snmpreply()
%%%
%%% @doc Issues a synchronous snmp get request.
get_values(Agent, Oids, MgrAgentConfName) ->
[Uid, AgentIp, AgentUdpPort | _] =
agent_conf(Agent, MgrAgentConfName),
{ok, SnmpReply, _} =
snmpm:g(Uid, AgentIp, AgentUdpPort, Oids),
SnmpReply.
%%% @spec get_next_values(Agent, Oids, MgrAgentConfName) -> SnmpReply
%%%
%%% Agent = agent_name()
%%% Oids = oids()
%%% MgrAgentConfName = atom()
%%% SnmpReply = snmpreply()
%%%
%%% @doc Issues a synchronous snmp get next request.
get_next_values(Agent, Oids, MgrAgentConfName) ->
[Uid, AgentIp, AgentUdpPort | _] =
agent_conf(Agent, MgrAgentConfName),
{ok, SnmpReply, _} =
snmpm:gn(Uid, AgentIp, AgentUdpPort, Oids),
SnmpReply.
%%% @spec set_values(Agent, VarsAndVals, MgrAgentConfName, Config) -> SnmpReply
%%%
%%% Agent = agent_name()
%%% Oids = oids()
%%% MgrAgentConfName = atom()
%%% Config = [{Key, Value}]
%%% SnmpReply = snmpreply()
%%%
%%% @doc Issues a synchronous snmp set request.
set_values(Agent, VarsAndVals, MgrAgentConfName, Config) ->
PrivDir = ?config(priv_dir, Config),
[Uid, AgentIp, AgentUdpPort | _] =
agent_conf(Agent, MgrAgentConfName),
Oids = lists:map(fun({Oid, _, _}) -> Oid end, VarsAndVals),
{ok, SnmpGetReply, _} =
snmpm:g(Uid, AgentIp, AgentUdpPort, Oids),
{ok, SnmpSetReply, _} =
snmpm:s(Uid, AgentIp, AgentUdpPort, VarsAndVals),
case SnmpSetReply of
{noError, 0, _} when PrivDir /= false ->
log(PrivDir, Agent, SnmpGetReply, VarsAndVals);
_ ->
set_failed_or_user_did_not_want_to_log
end,
SnmpSetReply.
%%% @spec set_info(Config) -> [{Agent, OldVarsAndVals, NewVarsAndVals}]
%%%
%%% Config = [{Key, Value}]
%%% Agent = agent_name()
%%% OldVarsAndVals = varsandvals()
%%% NewVarsAndVals = varsandvals()
%%%
%%% @doc Returns a list of all successful set requests performed in
%%% the test case in reverse order. The list contains the involved
%%% user and agent, the value prior to the set and the new value. This
%%% is intended to facilitate the clean up in the end_per_testcase
%%% function i.e. the undoing of the set requests and its possible
%%% side-effects.
set_info(Config) ->
PrivDir = ?config(priv_dir, Config),
SetLogFile = filename:join(PrivDir, ?CT_SNMP_LOG_FILE),
case file:consult(SetLogFile) of
{ok, SetInfo} ->
file:delete(SetLogFile),
lists:reverse(SetInfo);
_ ->
[]
end.
%%% @spec register_users(MgrAgentConfName, Users) -> ok | {error, Reason}
%%%
%%% MgrAgentConfName = atom()
%%% Users = [user()]
%%% Reason = term()
%%%
%%% @doc Register the manager entity (=user) responsible for specific agent(s).
%%% Corresponds to making an entry in users.conf
register_users(MgrAgentConfName, Users) ->
{snmp, SnmpVals} = ct:get_config(MgrAgentConfName),
NewSnmpVals = lists:keyreplace(users, 1, SnmpVals, {users, Users}),
ct_config:update_config(MgrAgentConfName, {snmp, NewSnmpVals}),
setup_users(Users).
%%% @spec register_agents(MgrAgentConfName, ManagedAgents) -> ok | {error, Reason}
%%%
%%% MgrAgentConfName = atom()
%%% ManagedAgents = [agent()]
%%% Reason = term()
%%%
%%% @doc Explicitly instruct the manager to handle this agent.
%%% Corresponds to making an entry in agents.conf
register_agents(MgrAgentConfName, ManagedAgents) ->
{snmp, SnmpVals} = ct:get_config(MgrAgentConfName),
NewSnmpVals = lists:keyreplace(managed_agents, 1, SnmpVals,
{managed_agents, ManagedAgents}),
ct_config:update_config(MgrAgentConfName, {snmp, NewSnmpVals}),
setup_managed_agents(ManagedAgents).
%%% @spec register_usm_users(MgrAgentConfName, UsmUsers) -> ok | {error, Reason}
%%%
%%% MgrAgentConfName = atom()
%%% UsmUsers = [usm_user()]
%%% Reason = term()
%%%
%%% @doc Explicitly instruct the manager to handle this USM user.
%%% Corresponds to making an entry in usm.conf
register_usm_users(MgrAgentConfName, UsmUsers) ->
{snmp, SnmpVals} = ct:get_config(MgrAgentConfName),
NewSnmpVals = lists:keyreplace(users, 1, SnmpVals, {usm_users, UsmUsers}),
ct_config:update_config(MgrAgentConfName, {snmp, NewSnmpVals}),
EngineID = ct:get_config({MgrAgentConfName, engine_id}, ?ENGINE_ID),
setup_usm_users(UsmUsers, EngineID).
%%% @spec unregister_users(MgrAgentConfName) -> ok | {error, Reason}
%%%
%%% MgrAgentConfName = atom()
%%% Reason = term()
%%%
%%% @doc Removes information added when calling register_users/2.
unregister_users(MgrAgentConfName) ->
Users = lists:map(fun({UserName, _}) -> UserName end,
ct:get_config({MgrAgentConfName, users})),
{snmp, SnmpVals} = ct:get_config(MgrAgentConfName),
NewSnmpVals = lists:keyreplace(users, 1, SnmpVals, {users, []}),
ct_config:update_config(MgrAgentConfName, {snmp, NewSnmpVals}),
takedown_users(Users).
%%% @spec unregister_agents(MgrAgentConfName) -> ok | {error, Reason}
%%%
%%% MgrAgentConfName = atom()
%%% Reason = term()
%%%
%%% @doc Removes information added when calling register_agents/2.
unregister_agents(MgrAgentConfName) ->
ManagedAgents = lists:map(fun({_, [Uid, AgentIP, AgentPort, _]}) ->
{Uid, AgentIP, AgentPort}
end,
ct:get_config({MgrAgentConfName, managed_agents})),
{snmp, SnmpVals} = ct:get_config(MgrAgentConfName),
NewSnmpVals = lists:keyreplace(managed_agents, 1, SnmpVals,
{managed_agents, []}),
ct_config:update_config(MgrAgentConfName, {snmp, NewSnmpVals}),
takedown_managed_agents(ManagedAgents).
%%% @spec update_usm_users(MgrAgentConfName, UsmUsers) -> ok | {error, Reason}
%%%
%%% MgrAgentConfName = atom()
%%% UsmUsers = usm_users()
%%% Reason = term()
%%%
%%% @doc Alters information added when calling register_usm_users/2.
update_usm_users(MgrAgentConfName, UsmUsers) ->
{snmp, SnmpVals} = ct:get_config(MgrAgentConfName),
NewSnmpVals = lists:keyreplace(usm_users, 1, SnmpVals,
{usm_users, UsmUsers}),
ct_config:update_config(MgrAgentConfName, {snmp, NewSnmpVals}),
EngineID = ct:get_config({MgrAgentConfName, engine_id}, ?ENGINE_ID),
do_update_usm_users(UsmUsers, EngineID).
%%% @spec load_mibs(Mibs) -> ok | {error, Reason}
%%%
%%% Mibs = [MibName]
%%% MibName = string()
%%% Reason = term()
%%%
%%% @doc Load the mibs into the agent 'snmp_master_agent'.
load_mibs(Mibs) ->
snmpa:load_mibs(snmp_master_agent, Mibs).
%%%========================================================================
%%% Internal functions
%%%========================================================================
prepare_snmp_env() ->
%% To make sure application:set_env is not overwritten by any
%% app-file settings.
application:load(snmp),
%% Fix for older versions of snmp where there are some
%% inappropriate default values for alway starting an
%% agent.
application:unset_env(snmp, agent).
%%%---------------------------------------------------------------------------
setup_manager(false, _, _, _, _) ->
ok;
setup_manager(true, MgrConfName, SnmpConfName, Config, IP) ->
PrivDir = ?config(priv_dir, Config),
MaxMsgSize = ct:get_config({MgrConfName,max_msg_size}, ?MAX_MSG_SIZE),
Port = ct:get_config({MgrConfName,mgr_port}, ?MGR_PORT),
EngineID = ct:get_config({MgrConfName,engine_id}, ?ENGINE_ID),
MgrDir = filename:join(PrivDir,"mgr"),
%%% Users, Agents and Usms are in test suites register after the
%%% snmp application is started.
Users = [],
Agents = [],
Usms = [],
file:make_dir(MgrDir),
snmp_config:write_manager_snmp_files(MgrDir, IP, Port, MaxMsgSize,
EngineID, Users, Agents, Usms),
SnmpEnv = merge_snmp_conf([{config, [{dir, MgrDir},{db_dir, MgrDir},
{verbosity, trace}]},
{server, [{verbosity, trace}]},
{net_if, [{verbosity, trace}]},
{versions, [v1, v2, v3]}],
ct:get_config({SnmpConfName,manager})),
application:set_env(snmp, manager, SnmpEnv).
%%%---------------------------------------------------------------------------
setup_agent(false,_, _, _, _, _, _) ->
ok;
setup_agent(true, AgentConfName, SnmpConfName,
Config, SysName, ManagerIP, AgentIP) ->
application:start(mnesia),
PrivDir = ?config(priv_dir, Config),
Vsns = ct:get_config({AgentConfName, agent_vsns}, ?CONF_FILE_VER),
TrapUdp = ct:get_config({AgentConfName, agent_trap_udp}, ?TRAP_UDP),
AgentUdp = ct:get_config({AgentConfName, agent_udp}, ?AGENT_UDP),
NotifType = ct:get_config({AgentConfName, agent_notify_type},
?AGENT_NOTIFY_TYPE),
SecType = ct:get_config({AgentConfName, agent_sec_type}, ?AGENT_SEC_TYPE),
Passwd = ct:get_config({AgentConfName, agent_passwd}, ?AGENT_PASSWD),
AgentEngineID = ct:get_config({AgentConfName, agent_engine_id},
?AGENT_ENGINE_ID),
AgentMaxMsgSize = ct:get_config({AgentConfName, agent_max_msg_size},
?MAX_MSG_SIZE),
ConfDir = filename:join(PrivDir, "conf"),
DbDir = filename:join(PrivDir,"db"),
file:make_dir(ConfDir),
file:make_dir(DbDir),
snmp_config:write_agent_snmp_files(ConfDir, Vsns, ManagerIP, TrapUdp,
AgentIP, AgentUdp, SysName,
atom_to_list(NotifType),
SecType, Passwd, AgentEngineID,
AgentMaxMsgSize),
override_default_configuration(Config, AgentConfName),
SnmpEnv = merge_snmp_conf([{db_dir, DbDir},
{config, [{dir, ConfDir},
{verbosity, trace}]},
{agent_type, master},
{agent_verbosity, trace},
{net_if, [{verbosity, trace}]}],
ct:get_config({SnmpConfName,agent})),
application:set_env(snmp, agent, SnmpEnv).
%%%---------------------------------------------------------------------------
merge_snmp_conf(Defaults, undefined) ->
Defaults;
merge_snmp_conf([Def={Key,DefList=[P|_]}|DefParams], UserParams) when is_tuple(P) ->
case lists:keysearch(Key, 1, UserParams) of
false ->
[Def | merge_snmp_conf(DefParams, UserParams)];
{value,{Key,UserList}} ->
DefList1 = [{SubKey,Val} || {SubKey,Val} <- DefList,
lists:keysearch(SubKey, 1, UserList) == false],
[{Key,DefList1++UserList} | merge_snmp_conf(DefParams,
lists:keydelete(Key, 1, UserParams))]
end;
merge_snmp_conf([Def={Key,_}|DefParams], UserParams) ->
case lists:keysearch(Key, 1, UserParams) of
false ->
[Def | merge_snmp_conf(DefParams, UserParams)];
{value,_} ->
merge_snmp_conf(DefParams, UserParams)
end;
merge_snmp_conf([], UserParams) ->
UserParams.
%%%---------------------------------------------------------------------------
manager_register(false, _) ->
ok;
manager_register(true, MgrAgentConfName) ->
Agents = ct:get_config({MgrAgentConfName, managed_agents}, []),
Users = ct:get_config({MgrAgentConfName, users}, []),
UsmUsers = ct:get_config({MgrAgentConfName, usm_users}, []),
EngineID = ct:get_config({MgrAgentConfName, engine_id}, ?ENGINE_ID),
setup_usm_users(UsmUsers, EngineID),
setup_users(Users),
setup_managed_agents(Agents).
%%%---------------------------------------------------------------------------
setup_users(Users) ->
lists:foreach(fun({Id, [Module, Data]}) ->
snmpm:register_user(Id, Module, Data)
end, Users).
%%%---------------------------------------------------------------------------
setup_managed_agents([]) ->
ok;
setup_managed_agents([{_, [Uid, AgentIp, AgentUdpPort, AgentConf]} |
Rest]) ->
NewAgentIp = case AgentIp of
IpTuple when is_tuple(IpTuple) ->
IpTuple;
HostName when is_list(HostName) ->
{ok,Hostent} = inet:gethostbyname(HostName),
[IpTuple|_] = Hostent#hostent.h_addr_list,
IpTuple
end,
ok = snmpm:register_agent(Uid, NewAgentIp, AgentUdpPort),
lists:foreach(fun({Item, Val}) ->
snmpm:update_agent_info(Uid, NewAgentIp,
AgentUdpPort, Item, Val)
end, AgentConf),
setup_managed_agents(Rest).
%%%---------------------------------------------------------------------------
setup_usm_users(UsmUsers, EngineID)->
lists:foreach(fun({UsmUser, Conf}) ->
snmpm:register_usm_user(EngineID, UsmUser, Conf)
end, UsmUsers).
%%%---------------------------------------------------------------------------
takedown_users(Users) ->
lists:foreach(fun({Id}) ->
snmpm:unregister_user(Id)
end, Users).
%%%---------------------------------------------------------------------------
takedown_managed_agents([{Uid, AgentIp, AgentUdpPort} |
Rest]) ->
NewAgentIp = case AgentIp of
IpTuple when is_tuple(IpTuple) ->
IpTuple;
HostName when is_list(HostName) ->
{ok,Hostent} = inet:gethostbyname(HostName),
[IpTuple|_] = Hostent#hostent.h_addr_list,
IpTuple
end,
ok = snmpm:unregister_agent(Uid, NewAgentIp, AgentUdpPort),
takedown_managed_agents(Rest);
takedown_managed_agents([]) ->
ok.
%%%---------------------------------------------------------------------------
do_update_usm_users(UsmUsers, EngineID) ->
lists:foreach(fun({UsmUser, {Item, Val}}) ->
snmpm:update_usm_user_info(EngineID, UsmUser,
Item, Val)
end, UsmUsers).
%%%---------------------------------------------------------------------------
log(PrivDir, Agent, {_, _, Varbinds}, NewVarsAndVals) ->
Fun = fun(#varbind{oid = Oid, variabletype = Type, value = Value}) ->
{Oid, Type, Value}
end,
OldVarsAndVals = lists:map(Fun, Varbinds),
File = filename:join(PrivDir, ?CT_SNMP_LOG_FILE),
{ok, Fd} = file:open(File, [write, append]),
io:format(Fd, "~p.~n", [{Agent, OldVarsAndVals, NewVarsAndVals}]),
file:close(Fd),
ok.
%%%---------------------------------------------------------------------------
del_dir(Dir) ->
{ok, Files} = file:list_dir(Dir),
FullPathFiles = lists:map(fun(File) -> filename:join(Dir, File) end,
Files),
lists:foreach(fun file:delete/1, FullPathFiles),
file:del_dir(Dir),
ok.
%%%---------------------------------------------------------------------------
agent_conf(Agent, MgrAgentConfName) ->
Agents = ct:get_config({MgrAgentConfName, managed_agents}),
case lists:keysearch(Agent, 1, Agents) of
{value, {Agent, AgentConf}} ->
AgentConf;
_ ->
exit({error, {unknown_agent, Agent, Agents}})
end.
%%%---------------------------------------------------------------------------
override_default_configuration(Config, MgrAgentConfName) ->
override_contexts(Config,
ct:get_config({MgrAgentConfName, agent_contexts}, undefined)),
override_community(Config,
ct:get_config({MgrAgentConfName, agent_community}, undefined)),
override_sysinfo(Config,
ct:get_config({MgrAgentConfName, agent_sysinfo}, undefined)),
override_vacm(Config,
ct:get_config({MgrAgentConfName, agent_vacm}, undefined)),
override_usm(Config,
ct:get_config({MgrAgentConfName, agent_usm}, undefined)),
override_notify(Config,
ct:get_config({MgrAgentConfName, agent_notify_def}, undefined)),
override_target_address(Config,
ct:get_config({MgrAgentConfName,
agent_target_address_def},
undefined)),
override_target_params(Config,
ct:get_config({MgrAgentConfName, agent_target_param_def},
undefined)).
%%%---------------------------------------------------------------------------
override_contexts(_, undefined) ->
ok;
override_contexts(Config, {data_dir_file, File}) ->
Dir = ?config(data_dir, Config),
FullPathFile = filename:join(Dir, File),
{ok, ContextInfo} = file:consult(FullPathFile),
override_contexts(Config, ContextInfo);
override_contexts(Config, Contexts) ->
Dir = ?config(priv_dir, Config),
File = filename:join(Dir,"context.conf"),
file:delete(File),
snmp_config:write_agent_context_config(Dir, "", Contexts).
%%%---------------------------------------------------------------------------
override_sysinfo(_, undefined) ->
ok;
override_sysinfo(Config, {data_dir_file, File}) ->
Dir = ?config(data_dir, Config),
FullPathFile = filename:join(Dir, File),
{ok, SysInfo} = file:consult(FullPathFile),
override_sysinfo(Config, SysInfo);
override_sysinfo(Config, SysInfo) ->
Dir = ?config(priv_dir, Config),
File = filename:join(Dir,"standard.conf"),
file:delete(File),
snmp_config:write_agent_standard_config(Dir, "", SysInfo).
%%%---------------------------------------------------------------------------
override_target_address(_, undefined) ->
ok;
override_target_address(Config, {data_dir_file, File}) ->
Dir = ?config(data_dir, Config),
FullPathFile = filename:join(Dir, File),
{ok, TargetAddressConf} = file:consult(FullPathFile),
override_target_address(Config, TargetAddressConf);
override_target_address(Config, TargetAddressConf) ->
Dir = ?config(priv_dir, Config),
File = filename:join(Dir,"target_addr.conf"),
file:delete(File),
snmp_config:write_agent_target_addr_config(Dir, "", TargetAddressConf).
%%%---------------------------------------------------------------------------
override_target_params(_, undefined) ->
ok;
override_target_params(Config, {data_dir_file, File}) ->
Dir = ?config(data_dir, Config),
FullPathFile = filename:join(Dir, File),
{ok, TargetParamsConf} = file:consult(FullPathFile),
override_target_params(Config, TargetParamsConf);
override_target_params(Config, TargetParamsConf) ->
Dir = ?config(priv_dir, Config),
File = filename:join(Dir,"target_params.conf"),
file:delete(File),
snmp_config:write_agent_target_params_config(Dir, "", TargetParamsConf).
%%%---------------------------------------------------------------------------
override_notify(_, undefined) ->
ok;
override_notify(Config, {data_dir_file, File}) ->
Dir = ?config(data_dir, Config),
FullPathFile = filename:join(Dir, File),
{ok, NotifyConf} = file:consult(FullPathFile),
override_notify(Config, NotifyConf);
override_notify(Config, NotifyConf) ->
Dir = ?config(priv_dir, Config),
File = filename:join(Dir,"notify.conf"),
file:delete(File),
snmp_config:write_agent_notify_config(Dir, "", NotifyConf).
%%%---------------------------------------------------------------------------
override_usm(_, undefined) ->
ok;
override_usm(Config, {data_dir_file, File}) ->
Dir = ?config(data_dir, Config),
FullPathFile = filename:join(Dir, File),
{ok, UsmConf} = file:consult(FullPathFile),
override_usm(Config, UsmConf);
override_usm(Config, UsmConf) ->
Dir = ?config(priv_dir, Config),
File = filename:join(Dir,"usm.conf"),
file:delete(File),
snmp_config:write_agent_usm_config(Dir, "", UsmConf).
%%%--------------------------------------------------------------------------
override_community(_, undefined) ->
ok;
override_community(Config, {data_dir_file, File}) ->
Dir = ?config(data_dir, Config),
FullPathFile = filename:join(Dir, File),
{ok, CommunityConf} = file:consult(FullPathFile),
override_community(Config, CommunityConf);
override_community(Config, CommunityConf) ->
Dir = ?config(priv_dir, Config),
File = filename:join(Dir,"community.conf"),
file:delete(File),
snmp_config:write_agent_community_config(Dir, "", CommunityConf).
%%%---------------------------------------------------------------------------
override_vacm(_, undefined) ->
ok;
override_vacm(Config, {data_dir_file, File}) ->
Dir = ?config(data_dir, Config),
FullPathFile = filename:join(Dir, File),
{ok, VacmConf} = file:consult(FullPathFile),
override_vacm(Config, VacmConf);
override_vacm(Config, VacmConf) ->
Dir = ?config(priv_dir, Config),
File = filename:join(Dir,"vacm.conf"),
file:delete(File),
snmp_config:write_agent_vacm_config(Dir, "", VacmConf).