/lib/snmp/src/manager/snmpm_config.erl
Erlang | 3436 lines | 2667 code | 443 blank | 326 comment | 12 complexity | fc2c18c5dd9e4923635fb9af07858fcd MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1, MPL-2.0-no-copyleft-exception, Apache-2.0
Large files files are truncated, but you can click here to view the full file
- %%
- %% %CopyrightBegin%
- %%
- %% Copyright Ericsson AB 2004-2016. All Rights Reserved.
- %%
- %% Licensed under the Apache License, Version 2.0 (the "License");
- %% you may not use this file except in compliance with the License.
- %% You may obtain a copy of the License at
- %%
- %% http://www.apache.org/licenses/LICENSE-2.0
- %%
- %% Unless required by applicable law or agreed to in writing, software
- %% distributed under the License is distributed on an "AS IS" BASIS,
- %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- %% See the License for the specific language governing permissions and
- %% limitations under the License.
- %%
- %% %CopyrightEnd%
- %%
- %% -------------------------------------------------------------------------
- %%
- %% Some of the stuff stored here should really be persistent!!
- %% (e.g. snmp-engine-boot)
- %%
- %% -------------------------------------------------------------------------
- -module(snmpm_config).
- -behaviour(gen_server).
- %% External exports
- %% Avoid warning for local function error/1 clashing with autoimported BIF.
- -compile({no_auto_import,[error/1]}).
- -export([start_link/1, stop/0, is_started/0]).
- -export([register_user/4, unregister_user/1,
- which_users/0,
- user_info/0, user_info/1, user_info/2,
- register_agent/3, unregister_agent/2,
- agent_info/0, agent_info/2, agent_info/3,
- update_agent_info/3, update_agent_info/4,
- which_agents/0, which_agents/1,
- is_known_engine_id/2,
- get_agent_engine_id/1,
- get_agent_engine_max_message_size/1,
- get_agent_version/1,
- get_agent_mp_model/1,
- get_agent_user_id/1, get_agent_user_id/2,
- get_agent_user_info/2,
-
- system_info/0, system_info/1,
- %% update_system_info/2,
- get_engine_id/0, get_engine_max_message_size/0,
- 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,
- get_usm_user/2, get_usm_user_from_sec_name/2,
- is_usm_engine_id_known/1,
- get_engine_boots/0, get_engine_time/0,
- set_engine_boots/1, set_engine_time/1,
- get_usm_eboots/1, get_usm_etime/1, get_usm_eltime/1,
- set_usm_eboots/2, set_usm_etime/2, set_usm_eltime/2,
- reset_usm_cache/1,
-
- cre_counter/2,
- incr_counter/2,
- increment_counter/3, increment_counter/4,
- cre_stats_counter/2,
- maybe_cre_stats_counter/2,
- incr_stats_counter/2,
- reset_stats_counter/1,
- get_stats_counters/0, get_stats_counter/1,
- load_mib/1, unload_mib/1, which_mibs/0,
- make_mini_mib/0,
- name_to_oid/1, oid_to_name/1, oid_to_type/1,
- system_start_time/0,
- info/0,
- verbosity/1,
- backup/1,
- mk_target_name/3,
-
- default_transport_domain/0
- ]).
- %% Backward compatibillity exports
- -export([
- register_user/3,
- unregister_agent/3,
- update_agent_info/5,
- is_known_engine_id/3,
- get_agent_engine_id/2,
- get_agent_engine_max_message_size/2,
- get_agent_version/2,
- get_agent_mp_model/2
- ]).
- -export([
- order_manager_config/2,
- check_manager_config/2,
- check_user_config/1,
- check_agent_config/1,
- check_usm_user_config/1]).
- %% gen_server callbacks
- -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
- code_change/3, terminate/2]).
- %% Includes:
- -include_lib("kernel/include/file.hrl").
- -include("snmp_types.hrl").
- -include("snmpm_internal.hrl").
- -include("snmpm_usm.hrl").
- -include("snmp_debug.hrl").
- -include("snmp_verbosity.hrl").
- %% Types:
- -record(user, {id, mod, data, default_agent_config}).
- -record(state, {backup}).
- %% Macros and Constants:
- -define(SERVER, ?MODULE).
- -define(BACKUP_DB, snmpm_config_backup).
- -define(CONFIG_DB, snmpm_config_db).
- -define(DEFAULT_USER, default_user).
- -define(DEFAULT_AGENT_PORT, 161).
- -define(IRB_DEFAULT, auto).
- %% -define(IRB_DEFAULT, {user, timer:seconds(15)}).
- -define(USER_MOD_DEFAULT, snmpm_user_default).
- -define(USER_DATA_DEFAULT, undefined).
- %% -define(DEF_ADDR_TAG, default_addr_tag).
- -define(DEFAULT_TARGETNAME, default_agent).
- -define(DEF_PORT_TAG, default_port_tag).
- -define(SUPPORTED_DOMAINS, [transportDomainUdpIpv4, transportDomainUdpIpv6]).
- -ifdef(snmp_debug).
- -define(GS_START_LINK(Opts),
- gen_server:start_link({local, ?SERVER}, ?MODULE, [Opts],
- [{debug,[trace]}])).
- -else.
- -define(GS_START_LINK(Opts),
- gen_server:start_link({local, ?SERVER}, ?MODULE, [Opts], [])).
- -endif.
- %%%-------------------------------------------------------------------
- %%% API
- %%%-------------------------------------------------------------------
- default_transport_domain() ->
- snmpUDPDomain.
- start_link(Opts) ->
- ?d("start_link -> entry with"
- "~n Opts: ~p", [Opts]),
- ?GS_START_LINK(Opts).
- stop() ->
- call(stop).
- is_started() ->
- call(is_started, 1000).
- backup(BackupDir) when is_list(BackupDir) ->
- call({backup, BackupDir}).
- %% Backward compatibillity
- register_user(UserId, UserMod, UserData) ->
- register_user(UserId, UserMod, UserData, []).
- register_user(UserId, UserMod, UserData, DefaultAgentConfig)
- when (UserId =/= ?DEFAULT_USER) andalso is_list(DefaultAgentConfig) ->
- case (catch verify_user_behaviour(UserMod)) of
- ok ->
- {ok, SystemDefaultAgentConfig} = agent_info(),
- Config =
- ensure_config(SystemDefaultAgentConfig,
- DefaultAgentConfig),
- %% Config = default_agent_config(DefaultAgentConfig),
- call({register_user, UserId, UserMod, UserData, Config});
- Error ->
- Error
- end;
- register_user(UserId, _UserMod, _UserData, DefaultAgentConfig)
- when (UserId =/= ?DEFAULT_USER) ->
- {error, {bad_default_agent_config, DefaultAgentConfig}};
- register_user(UserId, _, _, _) ->
- {error, {bad_user_id, UserId}}.
- %% default_agent_config(DefaultAgentConfig) ->
- %% {ok, SystemDefaultAgentConfig} = agent_info(),
- %% default_agent_config(SystemDefaultAgentConfig, DefaultAgentConfig).
- %% default_agent_config([], DefaultAgentConfig) ->
- %% DefaultAgentConfig;
- %% default_agent_config([{Key, _} = Entry|T], DefaultAgentConfig) ->
- %% case lists:keymember(Key, 1, DefaultAgentConfig) of
- %% true ->
- %% default_agent_config(T, DefaultAgentConfig);
- %% false ->
- %% default_agent_config(T, [Entry|DefaultAgentConfig])
- %% end.
- verify_user_behaviour(UserMod) ->
- case snmp_misc:verify_behaviour(snmpm_user, UserMod) of
- ok ->
- ok;
- Error ->
- %% This user may implement the old behaviour, check it
- case snmp_misc:verify_behaviour(snmpm_user_old, UserMod) of
- ok ->
- ok;
- _ ->
- throw(Error)
- end
- end.
- unregister_user(UserId) when UserId =/= ?DEFAULT_USER ->
- call({unregister_user, UserId});
- unregister_user(BadUserId) ->
- {error, {bad_user_id, BadUserId}}.
- which_users() ->
- Pattern = #user{id = '$1', _ = '_'},
- Match = ets:match(snmpm_user_table, Pattern),
- [UserId || [UserId] <- Match, UserId =/= ?DEFAULT_USER].
- user_info() ->
- UserId = ?DEFAULT_USER,
- case user_info(UserId) of
- {ok, Mod, Data} ->
- {ok, UserId, Mod, Data};
- Error ->
- Error
- end.
- user_info(UserId) ->
- case ets:lookup(snmpm_user_table, UserId) of
- [#user{mod = UserMod, data = UserData}] ->
- {ok, UserMod, UserData};
- _ ->
- {error, not_found}
- end.
- user_info(UserId, Item) ->
- case (catch do_user_info(UserId, Item)) of
- {'EXIT', _} ->
- {error, {not_found, Item}};
- Val ->
- {ok, Val}
- end.
- do_user_info(UserId, module) ->
- ets:lookup_element(snmpm_user_table, UserId, #user.mod);
- do_user_info(UserId, data) ->
- ets:lookup_element(snmpm_user_table, UserId, #user.data);
- do_user_info(UserId, default_agent_config) ->
- ets:lookup_element(snmpm_user_table, UserId, #user.default_agent_config);
- do_user_info(_UserId, BadItem) ->
- error({not_found, BadItem}).
- %% A target-name constructed in this way is a string with the following:
- %% <IP-address>:<Port>-<Version>
- %% This is intended for backward compatibility and therefore has
- %% only support for IPv4 addresses and *no* other transport domain.
- mk_target_name(Domain, Addr, Config)
- when is_atom(Domain), is_list(Config) ->
- Version =
- case lists:keysearch(version, 1, Config) of
- {value, {_, V}} ->
- V;
- false ->
- select_lowest_supported_version()
- end,
- try
- lists:flatten(
- io_lib:format(
- "~s-~w", [snmp_conf:mk_addr_string({Domain, Addr}), Version]))
- catch
- _ ->
- lists:flatten(
- io_lib:format("~p-~w", [Addr, Version]))
- end;
- mk_target_name(Ip, Port, Config)
- when is_integer(Port), is_list(Config) ->
- Domain = default_transport_domain(),
- try fix_address(Domain, {Ip, Port}) of
- Address ->
- mk_target_name(Domain, Address, Config)
- catch
- _ ->
- Version =
- case lists:keysearch(version, 1, Config) of
- {value, {_, V}} ->
- V;
- false ->
- select_lowest_supported_version()
- end,
- lists:flatten(
- io_lib:format("~p:~w-~w", [Ip, Port, Version]))
- end.
- select_lowest_supported_version() ->
- {ok, Versions} = system_info(versions),
- select_lowest_supported_version([v1, v2, v3], Versions).
- select_lowest_supported_version([], Versions) ->
- error({bad_versions, Versions});
- select_lowest_supported_version([H|T], Versions) ->
- case lists:member(H, Versions) of
- true ->
- H;
- false ->
- select_lowest_supported_version(T, Versions)
- end.
- register_agent(UserId, _TargetName, _Config0) when (UserId =:= user_id) ->
- {error, {bad_user_id, UserId}};
- register_agent(UserId, TargetName, Config0)
- when (is_list(TargetName) andalso
- (length(TargetName) > 0) andalso
- is_list(Config0)) ->
- ?vtrace("register_agent -> entry with"
- "~n UserId: ~p"
- "~n TargetName: ~p"
- "~n Config0: ~p", [UserId, TargetName, Config0]),
- %% Check:
- %% 1) That the mandatory configs are present
- %% 2) That no illegal config, e.g. user_id (used internally),
- %% is not present
- %% 3) Check that there are no invalid or erroneous configs
- %% 4) Check that the manager is capable of using the selected version
- try
- verify_mandatory(Config0, [engine_id, reg_type]),
- verify_someof(Config0, [address, taddress]),
- verify_illegal(Config0, [user_id]),
- Config = verify_agent_config(Config0),
- Vsns = versions(),
- Vsn = which_version(Config),
- verify_version(Vsn, Vsns),
- call({register_agent, UserId, TargetName, Config})
- catch
- Error ->
- Error
- end.
- versions() ->
- case system_info(versions) of
- {ok, Vsns} ->
- Vsns;
- {error, _} = ERROR ->
- throw(ERROR)
- end.
- which_version(Conf) ->
- case lists:keysearch(version, 1, Conf) of
- {value, {version, V}} ->
- V;
- false ->
- v1
- end.
- verify_version(Vsn, Vsns) ->
- case lists:member(Vsn, Vsns) of
- true ->
- ok;
- false ->
- Reason = {version_not_supported_by_manager, Vsn, Vsns},
- error(Reason)
- end.
- unregister_agent(UserId, TargetName) ->
- call({unregister_agent, UserId, TargetName}).
- %% This is the old style agent unregistration (using Addr and Port).
- unregister_agent(UserId, Domain, Address) when is_atom(Domain) ->
- try fix_address(Domain, Address) of
- NAddress ->
- do_unregister_agent(UserId, Domain, NAddress)
- catch
- _ ->
- {error, not_found}
- end;
- unregister_agent(UserId, Ip, Port) when is_integer(Port) ->
- Domain = default_transport_domain(),
- try fix_address(Domain, {Ip, Port}) of
- Address ->
- do_unregister_agent(UserId, Domain, Address)
- catch
- _ ->
- {error, not_found}
- end.
- do_unregister_agent(UserId, Domain, Address) ->
- case do_agent_info(Domain, Address, target_name) of
- {ok, TargetName} ->
- unregister_agent(UserId, TargetName);
- Error ->
- Error
- end.
- agent_info() ->
- agent_info(?DEFAULT_TARGETNAME, all).
- agent_info(TargetName, all) ->
- case ets:match_object(snmpm_agent_table, {{TargetName, '_'}, '_'}) of
- [] ->
- {error, not_found};
- All ->
- {ok, [{Item, Val} || {{_, Item}, Val} <- All]}
- end;
- %% Begin backwards compatibility
- agent_info(TargetName, address) ->
- case agent_info({TargetName, taddress}) of
- {ok, Val} ->
- {Addr, _} = Val,
- {ok, Addr};
- _ ->
- %% This should be redundant since 'taddress' should exist
- agent_info({TargetName, address})
- end;
- agent_info(TargetName, port) ->
- case agent_info({TargetName, taddress}) of
- {ok, Val} ->
- {_, Port} = Val,
- {ok, Port};
- _ ->
- %% This should be redundant since 'taddress' should exist
- agent_info({TargetName, port})
- end;
- %% End backwards compatibility
- agent_info(TargetName, Item) ->
- agent_info({TargetName, Item}).
- agent_info(Key) ->
- case ets:lookup(snmpm_agent_table, Key) of
- [{_, Val}] ->
- {ok, Val};
- [] ->
- {error, not_found}
- end.
- agent_info(Domain, Address, Item) when is_atom(Domain) ->
- try fix_address(Domain, Address) of
- NAddress ->
- do_agent_info(Domain, NAddress, Item)
- catch
- _Thrown ->
- %% p(?MODULE_STRING":agent_info(~p, ~p, ~p) throwed ~p at.~n"
- %% " ~p",
- %% [Domain, Address, Item, _Thrown, erlang:get_stacktrace()]),
- {error, not_found}
- end;
- agent_info(Ip, Port, Item) when is_integer(Port) ->
- %% p(?MODULE_STRING":agent_info(~p, ~p, ~p) entry~n",
- %% [Ip, Port, Item]),
- Domain = default_transport_domain(),
- try fix_address(Domain, {Ip, Port}) of
- Address ->
- do_agent_info(Domain, Address, Item)
- catch
- _Thrown ->
- %% p(?MODULE_STRING":agent_info(~p, ~p, ~p) throwed ~p at.~n"
- %% " ~p",
- %% [Ip, Port, Item, _Thrown, erlang:get_stacktrace()]),
- {error, not_found}
- end.
- do_agent_info(Domain, Address, target_name = Item) ->
- %% p(?MODULE_STRING":do_agent_info(~p, ~p, ~p) entry~n",
- %% [Domain, Address, Item]),
- case ets:lookup(snmpm_agent_table, {Domain, Address, Item}) of
- [{_, Val}] ->
- {ok, Val};
- [] ->
- {error, not_found}
- end;
- do_agent_info(Domain, Address, Item) ->
- %% p(?MODULE_STRING":do_agent_info(~p, ~p, ~p) entry~n",
- %% [Domain, Address, Item]),
- case do_agent_info(Domain, Address, target_name) of
- {ok, TargetName} ->
- agent_info(TargetName, Item);
- Error ->
- Error
- end.
- ensure_agent_info(_, [], Info) ->
- Info;
- ensure_agent_info(TargetName, [Item|Items], Info) ->
- case lists:keymember(Item, 1, Info) of
- true ->
- ensure_agent_info(TargetName, Items, Info);
- false ->
- {ok, Value} = agent_info(TargetName, Item),
- ensure_agent_info(TargetName, Items, [{Item, Value}|Info])
- end.
- which_agents() ->
- which_agents('_').
- which_agents(UserId) ->
- Pat = {{'$1', user_id}, UserId},
- Agents = ets:match(snmpm_agent_table, Pat),
- [TargetName || [TargetName] <- Agents].
- update_agent_info(UserId, TargetName, Info) ->
- call({update_agent_info, UserId, TargetName, Info}).
- %% <BACKWARD-COMPAT-2>
- %% This is wrapped in the interface module, so this function is
- %% only here to catch code-upgrade problems.
- update_agent_info(UserId, TargetName, Item, Val) ->
- update_agent_info(UserId, TargetName, [{Item, Val}]).
- %% </BACKWARD-COMPAT-2>
- %% <BACKWARD-COMPAT-1>
- update_agent_info(UserId, Addr, Port, Item, Val) ->
- case agent_info(Addr, Port, target_name) of
- {ok, TargetName} ->
- update_agent_info(UserId, TargetName, Item, Val);
- Error ->
- Error
- end.
- %% </BACKWARD-COMPAT-1>
- is_known_engine_id(EngineID, TargetName) ->
- case agent_info(TargetName, engine_id) of
- {ok, EngineID} ->
- true;
- {ok, _OtherEngineID} ->
- false;
- _ ->
- false
- end.
-
- %% Backward compatibillity
- is_known_engine_id(EngineID, Addr, Port) ->
- case agent_info(Addr, Port, target_name) of
- {ok, TargetName} ->
- is_known_engine_id(EngineID, TargetName);
- _ ->
- false
- end.
- get_agent_engine_id(TargetName) ->
- agent_info(TargetName, engine_id).
- %% Backward compatibillity
- get_agent_engine_id(Addr, Port) ->
- agent_info(Addr, Port, engine_id).
- get_agent_engine_max_message_size(TargetName) ->
- agent_info(TargetName, max_message_size).
- %% Backward compatibillity
- get_agent_engine_max_message_size(Addr, Port) ->
- agent_info(Addr, Port, max_message_size).
- get_agent_version(TargetName) ->
- agent_info(TargetName, version).
- %% Backward compatibillity
- get_agent_version(Addr, Port) ->
- agent_info(Addr, Port, version).
- get_agent_mp_model(TargetName) ->
- case agent_info(TargetName, version) of
- {ok, v2} ->
- {ok, v2c};
- {ok, V} ->
- {ok, V};
- Err ->
- Err
- end.
- %% Backward compatibillity
- get_agent_mp_model(Addr, Port) ->
- case agent_info(Addr, Port, target_name) of
- {ok, TargetName} ->
- get_agent_mp_model(TargetName);
- Error ->
- Error
- end.
- get_agent_user_id(TargetName) ->
- agent_info(TargetName, user_id).
- get_agent_user_id(Addr, Port) ->
- agent_info(Addr, Port, user_id).
- get_agent_user_info(Addr, Port) ->
- case agent_info(Addr, Port, target_name) of
- {ok, Target} ->
- case agent_info(Target, reg_type) of
- {ok, RegType} ->
- case agent_info(Target, user_id) of
- {ok, UserId} ->
- {ok, UserId, Target, RegType};
- {error, not_found} ->
- {error, {user_id_not_found, Target}}
- end;
- {error, not_found} ->
- {error, {reg_type_not_found, Target}}
- end;
- {error, not_found} ->
- {error, {target_name_not_found, Addr, Port}}
- end.
-
- system_info() ->
- system_info(all).
- system_info(all) ->
- lists:sort(ets:tab2list(snmpm_config_table));
- system_info(Key) when is_atom(Key) ->
- case ets:lookup(snmpm_config_table, Key) of
- [{_, Val}] ->
- {ok, Val};
- _ ->
- {error, not_found}
- end.
- %% update_system_info(Key, Val) ->
- %% call({update_system_info, Key, Val}).
- system_start_time() ->
- system_info(system_start_time).
- get_engine_id() ->
- system_info(engine_id).
- get_engine_max_message_size() ->
- system_info(max_message_size).
- get_engine_boots() ->
- case dets:lookup(?CONFIG_DB, snmp_engine_boots) of
- [{_, Boots}] ->
- {ok, Boots};
- _ ->
- {error, not_found}
- end.
- set_engine_boots(Boots) ->
- case (whereis(?SERVER) =:= self()) of
- false ->
- call({set_engine_boots, Boots});
- true ->
- dets:insert(?CONFIG_DB, {snmp_engine_boots, Boots}),
- ok
- end.
-
- get_engine_time() ->
- case system_info(snmp_engine_base) of
- {ok, EngineBase} ->
- {ok, snmp_misc:now(sec) - EngineBase};
- Error ->
- Error
- end.
- get_usm_eboots(SnmpEngineID) ->
- Key = {eboots, SnmpEngineID},
- case get_usm_cache(Key) of
- {ok, Boots} ->
- {ok, Boots};
- _ ->
- {ok, 0}
- end.
- get_usm_etime(SnmpEngineID) ->
- Key = {etime, SnmpEngineID},
- case get_usm_cache(Key) of
- {ok, Diff} ->
- {ok, snmp_misc:now(sec) - Diff};
- _ ->
- {ok, 0}
- end.
- get_usm_eltime(SnmpEngineID) ->
- Key = {eltime, SnmpEngineID},
- case get_usm_cache(Key) of
- {ok, Time} ->
- {ok, Time};
- _ ->
- {ok, 0}
- end.
- get_usm_cache(Key) ->
- case ets:lookup(snmpm_usm_table, {usm_cache, Key}) of
- [{_, Val}] ->
- {ok, Val};
- _ ->
- {error, not_found}
- end.
-
- set_usm_eboots(SnmpEngineID, EngineBoots) ->
- set_usm_cache({eboots, SnmpEngineID}, EngineBoots).
- set_usm_etime(SnmpEngineID, Diff) ->
- set_usm_cache({etime, SnmpEngineID}, Diff).
- set_usm_eltime(SnmpEngineID, Time) ->
- set_usm_cache({eltime, SnmpEngineID}, Time).
- set_usm_cache(Key, Val) ->
- call({set_usm_cache, Key, Val}).
- reset_usm_cache(SnmpEngineID) ->
- case (whereis(?SERVER) =:= self()) of
- false ->
- call({reset_usm_cache, SnmpEngineID});
- true ->
- Pat = {{usm_cache, {'_', SnmpEngineID}}, '_'},
- ets:match_delete(snmpm_usm_table, Pat),
- ok
- end.
- set_engine_time(Time) ->
- call({set_engine_time, Time}).
- register_usm_user(EngineID, Name, Config)
- when is_list(EngineID) andalso is_list(Name) ->
- case verify_usm_user_config(EngineID, Name, Config) of
- {ok, User} ->
- call({register_usm_user, User});
- Error ->
- Error
- end.
- unregister_usm_user(EngineID, Name)
- when is_list(EngineID) andalso is_list(Name) ->
- call({unregister_usm_user, EngineID, Name}).
- verify_usm_user_config(EngineID, Name, Config) ->
- try
- begin
- verify_mandatory(Config, []),
- verify_illegal(Config, [engine_id, name]),
- verify_usm_user_config2(EngineID, Name, Config)
- end
- catch
- throw:Error ->
- Error
- end.
- verify_usm_user_config2(EngineID, Name, Config) ->
- SecName = verify_usm_user_get(sec_name, Name, Config),
- Auth = verify_usm_user_get(auth, usmNoAuthProtocol, Config),
- AuthKey = verify_usm_user_get(auth_key, [], Config),
- Priv = verify_usm_user_get(priv, usmNoPrivProtocol, Config),
- PrivKey = verify_usm_user_get(priv_key, [], Config),
- User = {EngineID, Name, SecName, Auth, AuthKey, Priv, PrivKey},
- verify_usm_user(User).
-
- verify_usm_user_get(Item, Default, Config) ->
- case lists:keysearch(Item, 1, Config) of
- {value, {_, Val}} ->
- Val;
- false ->
- Default
- end.
- which_usm_users() ->
- Pattern = {usm_key('$1', '$2'), '_'},
- Match = ets:match(snmpm_usm_table, Pattern),
- [{EngineID, UserName} || [EngineID, UserName] <- Match].
- which_usm_users(EngineID) ->
- Pattern = {usm_key(EngineID, '$1'), '_'},
- Match = ets:match(snmpm_usm_table, Pattern),
- [UserName || [UserName] <- Match].
- usm_user_info(EngineID, UserName, Item) ->
- case ets:lookup(snmpm_usm_table, usm_key(EngineID, UserName)) of
- [] ->
- {error, not_found};
- [{_Key, UsmUser}] ->
- do_usm_user_info(UsmUser, Item)
- end.
- do_usm_user_info(#usm_user{sec_name = SecName}, sec_name) ->
- {ok, SecName};
- do_usm_user_info(#usm_user{auth = AuthP}, auth) ->
- {ok, AuthP};
- do_usm_user_info(#usm_user{auth_key = AuthKey}, auth_key) ->
- {ok, AuthKey};
- do_usm_user_info(#usm_user{priv = PrivP}, priv) ->
- {ok, PrivP};
- do_usm_user_info(#usm_user{priv_key = PrivKey}, priv_key) ->
- {ok, PrivKey};
- do_usm_user_info(#usm_user{engine_id = EngineID}, engine_id) ->
- {ok, EngineID};
- do_usm_user_info(#usm_user{name = Name}, name) ->
- {ok, Name};
- do_usm_user_info(_, Item) ->
- {error, {bad_iten, Item}}.
- update_usm_user_info(EngineID, UserName, Item, Val)
- when (Item =/= engine_id) andalso (Item =/= name) ->
- call({update_usm_user_info, EngineID, UserName, Item, Val}).
- get_usm_user(EngineID, UserName) ->
- Key = usm_key(EngineID, UserName),
- case ets:lookup(snmpm_usm_table, Key) of
- [{_, User}] ->
- {ok, User};
- _ ->
- {error, not_found}
- end.
- is_usm_engine_id_known(EngineID) ->
- Pattern = {usm_key(EngineID, '$1'), '_'},
- case ets:match(snmpm_usm_table, Pattern) of
- [] ->
- false;
- _ ->
- true
- end.
- get_usm_user_from_sec_name(EngineID, SecName) ->
- %% Since the normal mapping between UserName and SecName is the
- %% identity-function, we first try to use the SecName as UserName,
- %% and check the resulting row. If it doesn't match, we'll have to
- %% loop through the entire table.
- Key = usm_key(EngineID, SecName),
- case ets:lookup(snmpm_usm_table, Key) of
- [{Key, #usm_user{sec_name = SecName} = User}] ->
- {ok, User};
- _ ->
- %% That did not work, so we have to search
- Pattern = {usm_key(EngineID, '_'),
- #usm_user{sec_name = SecName, _ = '_'}},
- case ets:match_object(snmpm_usm_table, Pattern) of
- [{_, User}|_] ->
- {ok, User};
- _ ->
- {error, not_found}
- end
- end.
- %% Wrap-counters (wrapping at 2147483647 or 4294967295)
- cre_counter(Counter, Initial) ->
- case (whereis(?SERVER) =:= self()) of
- false ->
- call({cre_counter, Counter, Initial});
- true ->
- ets:insert(snmpm_counter_table, {Counter, Initial}),
- Initial
- end.
- incr_counter(usm_salt, Incr) -> % Backward compatibillity (upgrade)
- incr_counter(usm_des_salt, Incr); % Backward compatibillity (upgrade)
- incr_counter(usm_des_salt, Incr) ->
- incr_counter(usm_des_salt, Incr, 4294967295);
- incr_counter(usm_aes_salt, Incr) ->
- incr_counter(usm_aes_salt, Incr, 36893488147419103231);
- incr_counter(Counter, Incr) ->
- incr_counter(Counter, Incr, 2147483647).
- incr_counter(Counter, Incr, Wrap) ->
- case (catch ets:update_counter(snmpm_counter_table, Counter, Incr)) of
- {'EXIT', _} ->
- cre_counter(Counter, Incr);
- NewVal when NewVal =< Wrap ->
- NewVal;
- N ->
- cre_counter(Counter, N - Wrap)
- end.
- %% <ATL Sequence Number>
- increment_counter(Counter, Initial, Max) ->
- Increment = 1,
- increment_counter(Counter, Initial, Increment, Max).
- increment_counter(Counter, Initial, Increment, Max) ->
- %% This is to make sure no one else increments our counter
- Key = {Counter, self()},
- %% Counter data
- Position = 2,
- Threshold = Max,
- SetValue = Initial,
- UpdateOp = {Position, Increment, Threshold, SetValue},
- %% And now for the actual increment
- Tab = snmpm_counter_table,
- case (catch ets:update_counter(Tab, Key, UpdateOp)) of
- {'EXIT', {badarg, _}} ->
- %% Oups, first time
- ets:insert(Tab, {Key, Initial}),
- Initial;
- Next when is_integer(Next) ->
- Next
- end.
- %% </ATL Sequence Number>
- maybe_cre_stats_counter(Counter, Initial) ->
- case ets:lookup(snmpm_stats_table, Counter) of
- [_] ->
- ok;
- _ ->
- cre_stats_counter(Counter, Initial)
- end.
-
- cre_stats_counter(Counter, Initial) ->
- case (whereis(?SERVER) =:= self()) of
- false ->
- call({cre_stats_counter, Counter, Initial});
- true ->
- ets:insert(snmpm_stats_table, {Counter, Initial}),
- Initial
- end.
- incr_stats_counter(Counter, Incr) ->
- case (catch ets:update_counter(snmpm_stats_table, Counter, Incr)) of
- {'EXIT', _} ->
- cre_counter(Counter, Incr);
- NewVal ->
- NewVal
- end.
- reset_stats_counter(Counter) ->
- case (whereis(?SERVER) =:= self()) of
- false ->
- call({reset_stats_counter, Counter});
- true ->
- ets:insert(snmpm_stats_table, {Counter, 0})
- end,
- ok.
-
- get_stats_counter(Counter) ->
- case ets:lookup(snmpm_stats_table, Counter) of
- [{Counter, Value}] ->
- {ok, Value};
- _ ->
- {error, not_found}
- end.
-
- get_stats_counters() ->
- ets:tab2list(snmpm_stats_table).
-
- load_mib(Mib) when is_list(Mib) ->
- call({load_mib, Mib}).
- unload_mib(Mib) when is_list(Mib) ->
- call({unload_mib, Mib}).
- which_mibs() ->
- Pattern = {{mib, '_'}, '$1', '$2'},
- Mibs = ets:match(snmpm_mib_table, Pattern),
- [list_to_tuple(X) || X <- Mibs].
- name_to_oid(Name) ->
- Pat = {{mini_mib, '$1'}, Name, '_', '_'},
- case ets:match(snmpm_mib_table, Pat) of
- [] ->
- {error, not_found};
- X ->
- Oids = [Oid || [Oid] <- X],
- {ok, Oids}
- end.
- oid_to_name(Oid) ->
- case ets:lookup(snmpm_mib_table, {mini_mib, Oid}) of
- [{_, Name, _, _}] ->
- {ok, Name};
- [] ->
- {error, not_found}
- end.
- oid_to_type(Oid) ->
- case ets:lookup(snmpm_mib_table, {mini_mib, Oid}) of
- [{_, _, Type, _}] ->
- {ok, Type};
- [] ->
- {error, not_found}
- end.
- make_mini_mib() ->
- Pat = {{mini_mib, '$1'}, '$2', '$3', '_'},
- MiniElems = ets:match(snmpm_mib_table, Pat),
- lists:keysort(1, [list_to_tuple(MiniElem) || MiniElem <- MiniElems]).
- info() ->
- call(info).
- verbosity(Verbosity) ->
- case ?vvalidate(Verbosity) of
- Verbosity ->
- call({verbosity, Verbosity});
- _ ->
- {error, {invalid_verbosity, Verbosity}}
- end.
- %%%-------------------------------------------------------------------
- %%% Callback functions from gen_server
- %%%-------------------------------------------------------------------
- %%--------------------------------------------------------------------
- %% Func: init/1
- %% Returns: {ok, State} |
- %% {ok, State, Timeout} |
- %% ignore |
- %% {stop, Reason}
- %%--------------------------------------------------------------------
- init([Opts]) ->
- % put(sname, mconf),
- % put(verbosity, trace),
- ?d("init -> entry with"
- "~n Opts: ~p", [Opts]),
- case (catch do_init(Opts)) of
- ok ->
- {ok, #state{}};
- {error, Reason} ->
- error_msg("init error: ~p", [Reason]),
- {stop, Reason};
- {'EXIT', Reason} ->
- error_msg("init exit: ~p", [Reason]),
- {stop, Reason};
- Error ->
- error_msg("init failed: ~p", [Error]),
- {stop, Error}
- end.
- do_init(Opts) ->
- process_flag(trap_exit, true),
- %% Mandatory = [versions, {config, [dir]}],
- Mandatory = [{config, [dir, db_dir]}],
- verify_options(Opts, Mandatory),
- ets:new(snmpm_counter_table, [set, public, named_table, {keypos, 1}]),
- ets:new(snmpm_stats_table, [set, public, named_table, {keypos, 1}]),
- ets:new(snmpm_mib_table, [set, protected, named_table, {keypos, 1}]),
- ets:new(snmpm_config_table, [set, protected, named_table, {keypos, 1}]),
- ets:new(snmpm_agent_table, [set, protected, named_table, {keypos, 1}]),
- ets:new(snmpm_user_table, [set, protected, named_table, {keypos, 2}]),
- ets:new(snmpm_usm_table, [set, protected, named_table, {keypos, 1}]),
- %% -- System start time --
- ets:insert(snmpm_config_table, {system_start_time, snmp_misc:now(cs)}),
-
- %% --- Own options (dir and db_dir mandatory) ---
- ConfOpts = get_opt(config, Opts, []),
- ConfVerb = get_opt(verbosity, ConfOpts, silence),
- ConfDir = get_opt(dir, ConfOpts),
- ConfDbDir = get_opt(db_dir, ConfOpts),
- ConfDbInitErr = get_opt(db_init_error, ConfOpts, terminate),
- ConfRep = get_opt(repair, ConfOpts, true),
- ConfAs = get_opt(auto_save, ConfOpts, 5000),
- ets:insert(snmpm_config_table, {config_verbosity, ConfVerb}),
- ets:insert(snmpm_config_table, {config_dir, ConfDir}),
- ets:insert(snmpm_config_table, {config_db_dir, ConfDbDir}),
- ets:insert(snmpm_config_table, {config_db_init_error, ConfDbInitErr}),
- ets:insert(snmpm_config_table, {config_repair, ConfRep}),
- ets:insert(snmpm_config_table, {config_auto_save, ConfAs}),
- put(sname, mconf),
- put(verbosity, ConfVerb),
- ?vlog("starting", []),
- %% -- Create dets file used for storing persistent data --
- dets_open(ConfDbDir, ConfDbInitErr, ConfRep, ConfAs),
-
- %% -- Prio (optional) --
- Prio = get_opt(priority, Opts, normal),
- ets:insert(snmpm_config_table, {prio, Prio}),
- try process_flag(priority, Prio)
- catch
- error:badarg ->
- error({invalid_priority,Prio})
- end,
- %% -- Server (optional) --
- ServerOpts = get_opt(server, Opts, []),
- ServerVerb = get_opt(verbosity, ServerOpts, silence),
- ServerGct = get_opt(timeout, ServerOpts, 30000),
- ServerMt = get_opt(multi_threaded, ServerOpts, true),
- ets:insert(snmpm_config_table, {server_verbosity, ServerVerb}),
- ets:insert(snmpm_config_table, {server_timeout, ServerGct}),
- ets:insert(snmpm_config_table, {server_multi_threaded, ServerMt}),
-
- %% -- Mibs (optional) --
- ?vdebug("initiate mini mib", []),
- Mibs = get_opt(mibs, Opts, []),
- ets:insert(snmpm_config_table, {mibs, Mibs}),
- init_mini_mib(Mibs),
- %% -- Net-if (optional) --
- ?vdebug("net_if options", []),
- NetIfIrb =
- case get_opt(inform_request_behaviour, Opts, ?IRB_DEFAULT) of
- user ->
- {user, timer:seconds(15)};
- Irb ->
- Irb
- end,
- NetIfOpts = get_opt(net_if, Opts, []),
- NetIfMod = get_opt(module, NetIfOpts, snmpm_net_if),
- NetIfVerb = get_opt(verbosity, NetIfOpts, silence),
- NetIfOptions = get_opt(options, NetIfOpts, []),
- ets:insert(snmpm_config_table, {net_if_module, NetIfMod}),
- ets:insert(snmpm_config_table, {net_if_verbosity, NetIfVerb}),
- ets:insert(snmpm_config_table, {net_if_irb, NetIfIrb}),
- ets:insert(snmpm_config_table, {net_if_options, NetIfOptions}),
- %% -- Versions (optional) --
- %% -- Versions (mandatory) ???????????? --
- ?vdebug("versions", []),
- Vsns = get_opt(versions, Opts, [v1, v2, v3]),
- ets:insert(snmpm_config_table, {versions, Vsns}),
- %% -- Audit trail log (optional) --
- ?vdebug("audit trail log", []),
- case get_opt(audit_trail_log, Opts, []) of
- [] ->
- ?vtrace("no ATL", []),
- ets:insert(snmpm_config_table, {audit_trail_log, false});
- AuditTrailLogOpts ->
- ?vtrace("ATL options: ~p", [AuditTrailLogOpts]),
- ets:insert(snmpm_config_table, {audit_trail_log, true}),
- LogDir = get_atl_dir(AuditTrailLogOpts),
- LogType = get_atl_type(AuditTrailLogOpts),
- LogSize = get_atl_size(AuditTrailLogOpts),
- LogRep = get_atl_repair(AuditTrailLogOpts),
- LogSeqNo = get_atl_seqno(AuditTrailLogOpts),
- ets:insert(snmpm_config_table, {audit_trail_log_dir, LogDir}),
- ets:insert(snmpm_config_table, {audit_trail_log_type, LogType}),
- ets:insert(snmpm_config_table, {audit_trail_log_size, LogSize}),
- ets:insert(snmpm_config_table, {audit_trail_log_repair, LogRep}),
- ets:insert(snmpm_config_table, {audit_trail_log_seqno, LogSeqNo})
- end,
- %% -- System default agent config --
- ?vdebug("system default agent config", []),
- init_agent_default(),
- %% -- User (optional) --
- ?vdebug("default user", []),
- DefUserMod = get_opt(def_user_mod, Opts, ?USER_MOD_DEFAULT),
- DefUserData = get_opt(def_user_data, Opts, ?USER_DATA_DEFAULT),
- ets:insert(snmpm_config_table, {def_user_mod, DefUserMod}),
- ets:insert(snmpm_config_table, {def_user_data, DefUserData}),
-
- {ok, SystemDefaultAgentConfig} = agent_info(),
- DefUser = #user{id = ?DEFAULT_USER,
- mod = DefUserMod,
- data = DefUserData,
- default_agent_config = SystemDefaultAgentConfig},
- ok = handle_register_user(DefUser),
-
- %% -- Note store --
- ?vdebug("note store", []),
- NoteStoreOpts = get_opt(note_store, Opts, []),
- NoteStoreVerb = get_opt(verbosity, NoteStoreOpts, silence),
- NoteStoreTimeout = get_opt(timeout, NoteStoreOpts, 30000),
- ets:insert(snmpm_config_table, {note_store_verbosity, NoteStoreVerb}),
- ets:insert(snmpm_config_table, {note_store_timeout, NoteStoreTimeout}),
-
- %% -- Manager SNMP config --
- ?vdebug("manager snmp config", []),
- MgrConf = read_manager_config_file(ConfDir),
- init_manager_config(MgrConf),
- %% -- User config --
- ?vdebug("users config", []),
- Users = read_users_config_file(ConfDir),
- init_users_config(Users),
- %% -- Agents config --
- ?vdebug("agents config", []),
- Agents = read_agents_config_file(ConfDir),
- init_agents_config(Agents),
- %% -- USM config --
- UsmUsers = read_usm_config_file(ConfDir),
- init_usm_users_config(UsmUsers),
- %% -- snmp engine init --
- init_engine(),
- ?vlog("started", []),
- ok.
- dets_open(Dir, DbInitError, Repair, AutoSave) ->
- Name = ?CONFIG_DB,
- Filename = dets_filename(Name, Dir),
- case file:read_file_info(Filename) of
- {ok, _} ->
- %% File exists
- case do_dets_open(Name, Filename, Repair, AutoSave) of
- {ok, _Dets} ->
- ok;
- {error, Reason1} ->
- info_msg("Corrupt local database: ~p", [Filename]),
- case DbInitError of
- terminate ->
- error({failed_reopen_dets, Filename, Reason1});
- _ ->
- Saved = Filename ++ ".saved",
- file:rename(Filename, Saved),
- case do_dets_open(Name, Filename,
- Repair, AutoSave) of
- {ok, _Dets} ->
- ok;
- {error, Reason2} ->
- error({failed_open_dets, Filename,
- Reason1, Reason2})
- end
- end
- end;
- _ ->
- case DbInitError of
- create_db_and_dir ->
- ok = filelib:ensure_dir(Filename);
- _ ->
- ok
- end,
- case do_dets_open(Name, Filename, Repair, AutoSave) of
- {ok, _Dets} ->
- ok;
- {error, Reason} ->
- error({failed_open_dets, Filename, Reason})
- end
- end.
-
- do_dets_open(Name, Filename, Repair, AutoSave) ->
- Opts = [{repair, Repair},
- {auto_save, AutoSave},
- {file, Filename}],
- dets:open_file(Name, Opts).
- dets_filename(Name, Dir) when is_atom(Name) ->
- dets_filename(atom_to_list(Name), Dir);
- dets_filename(Name, Dir) ->
- filename:join(dets_filename1(Dir), Name).
- dets_filename1([]) -> ".";
- dets_filename1(Dir) -> Dir.
- %% ------------------------------------------------------------------------
- init_engine() ->
- case get_engine_boots() of
- {ok, Val} when Val < 2147483647 ->
- set_engine_boots(Val + 1);
- {ok, _} ->
- ok;
- _ ->
- set_engine_boots(1)
- end,
- reset_engine_base().
- reset_engine_base() ->
- ets:insert(snmpm_config_table, {snmp_engine_base, snmp_misc:now(sec)}).
- %% ------------------------------------------------------------------------
- verify_options(Opts, Mandatory) ->
- ?d("verify_options -> entry with"
- "~n Opts: ~p"
- "~n Mandatory: ~p", [Opts, Mandatory]),
- verify_mandatory_options(Opts, Mandatory),
- verify_options(Opts).
- verify_options([]) ->
- ?d("verify_options -> done", []),
- ok;
- verify_options([Opt|Opts]) ->
- ?d("verify_options -> entry with"
- "~n Opt: ~p", [Opt]),
- verify_option(Opt),
- verify_options(Opts).
- verify_option({prio, Prio}) ->
- verify_prio(Prio);
- verify_option({mibs, Mibs}) ->
- verify_mibs(Mibs);
- verify_option({inform_request_behaviour, IRB}) ->
- verify_irb(IRB);
- verify_option({net_if, NetIfOpts}) ->
- verify_net_if_opts(NetIfOpts);
- verify_option({server, ServerOpts}) ->
- verify_server_opts(ServerOpts);
- verify_option({note_store, NoteStoreOpts}) ->
- verify_note_store_opts(NoteStoreOpts);
- verify_option({config, ConfOpts0}) ->
- %% Make sure any db_dir option is first in the options list to make it
- %% easier to check if the db_init_error option specifies that a missing
- %% db_dir should be created.
- ConfOpts = case lists:keytake(db_dir, 1, ConfOpts0) of
- false -> ConfOpts0;
- {value, Result, OtherOpts} -> [Result|OtherOpts]
- end,
- verify_config_opts(ConfOpts);
- verify_option({versions, Vsns}) ->
- verify_versions(Vsns);
- verify_option({audit_trail_log, LogOpts}) ->
- Mandatory = [dir, size],
- case (catch verify_mandatory_options(LogOpts, Mandatory)) of
- ok ->
- verify_audit_trail_log_opts(LogOpts);
- {error, {missing_mandatory, LogOpt}} ->
- error({missing_mandatory, audit_trail_log, LogOpt})
- end;
- verify_option({def_user_mod, Mod}) ->
- verify_module(def_user_mod, Mod);
- verify_option({def_user_data, _Data}) ->
- ok;
- verify_option(Opt) ->
- {error, {invalid_option, Opt}}.
- verify_prio(Prio) when is_atom(Prio) ->
- ok;
- verify_prio(Prio) ->
- error({invalid_prio, Prio}).
- verify_irb(auto) ->
- ok;
- verify_irb(user) ->
- ok;
- verify_irb({user, To}) when is_integer(To) andalso (To > 0) ->
- ok;
- verify_irb(IRB) ->
- error({invalid_irb, IRB}).
- verify_mibs([]) ->
- ok;
- verify_mibs([Mib|Mibs]) when is_list(Mib) ->
- verify_mibs(Mibs);
- verify_mibs(Mibs) ->
- error({invalid_mibs, Mibs}).
- verify_config_opts([]) ->
- ok;
- verify_config_opts([{verbosity, Verbosity}|Opts]) ->
- verify_verbosity(Verbosity),
- verify_config_opts(Opts);
- verify_config_opts([{dir, Dir}|Opts]) ->
- verify_conf_dir(Dir),
- verify_config_opts(Opts);
- verify_config_opts([{db_dir, Dir}|Opts]) ->
- case lists:keyfind(db_init_error, 1, Opts) of
- {db_init_error, create_db_and_dir} ->
- verify_conf_db_dir(Dir, false);
- _ ->
- verify_conf_db_dir(Dir, true)
- end,
- verify_config_opts(Opts);
- verify_config_opts([{db_init_error, DbInitErr}|Opts]) ->
- verify_conf_db_init_error(DbInitErr),
- verify_config_opts(Opts);
- verify_config_opts([{repair, Repair}|Opts]) ->
- verify_conf_repair(Repair),
- verify_config_opts(Opts);
- verify_config_opts([{auto_save, AutoSave}|Opts]) ->
- verify_conf_auto_save(AutoSave),
- verify_config_opts(Opts);
- verify_config_opts([Opt|_]) ->
- error({invalid_config_option, Opt}).
- verify_server_opts([]) ->
- ok;
- verify_server_opts([{verbosity, Verbosity}|Opts]) ->
- verify_verbosity(Verbosity),
- verify_server_opts(Opts);
- verify_server_opts([{timeout, Timeout}|Opts]) ->
- verify_server_timeout(Timeout),
- verify_server_opts(Opts);
- verify_server_opts([Opt|_]) ->
- error({invalid_server_option, Opt}).
- verify_server_timeout(T) when is_integer(T) andalso (T > 0) ->
- ok;
- verify_server_timeout(T) ->
- error({invalid_server_timeout, T}).
- verify_net_if_opts([]) ->
- ok;
- verify_net_if_opts([{module, Mod}|Opts]) ->
- verify_network_interface_behaviour(Mod),
- verify_net_if_opts(Opts);
- verify_net_if_opts([{verbosity, Verbosity}|Opts]) ->
- verify_verbosity(Verbosity),
- verify_net_if_opts(Opts);
- verify_net_if_opts([{options, Options}|Opts]) when is_list(Options) ->
- verify_net_if_opts(Opts);
- verify_net_if_opts([Opt|_]) ->
- error({invalid_net_if_option, Opt}).
- verify_network_interface_behaviour(Mod) ->
- case snmp_misc:verify_behaviour(snmpm_network_interface, Mod) of
- ok ->
- ok;
- Error ->
- throw(Error)
- end.
-
-
- verify_note_store_opts([]) ->
- ok;
- verify_note_store_opts([{verbosity, Verbosity}|Opts]) ->
- verify_verbosity(Verbosity),
- verify_note_store_opts(Opts);
- verify_note_store_opts([{timeout, Timeout}|Opts]) ->
- verify_note_store_timeout(Timeout),
- verify_note_store_opts(Opts);
- verify_note_store_opts([Opt|_]) ->
- error({invalid_note_store_option, Opt}).
- verify_note_store_timeout(T) when is_integer(T) andalso (T > 0) ->
- ok;
- verify_note_store_timeout(T) ->
- error({invalid_note_store_timeout, T}).
- verify_conf_dir(Dir) ->
- case (catch verify_dir(Dir)) of
- ok ->
- ok;
- {error, Reason} ->
- error({invalid_conf_dir, Dir, Reason});
- _ ->
- error({invalid_conf_dir, Dir})
- end.
- verify_conf_db_dir(Dir, true) ->
- case (catch verify_dir(Dir)) of
- ok ->
- ok;
- {error, Reason} ->
- error({invalid_conf_db_dir, Dir, Reason});
- _ ->
- error({invalid_conf_db_dir, Dir})
- end;
- verify_conf_db_dir(_Dir, false) ->
- ok.
- verify_conf_db_init_error(terminate) ->
- ok;
- verify_conf_db_init_error(create) ->
- ok;
- verify_conf_db_init_error(create_db_and_dir) ->
- ok;
- verify_conf_db_init_error(InvalidDbInitError) ->
- error({invalid_conf_db_init_error, InvalidDbInitError}).
- verify_conf_repair(true) ->
- ok;
- verify_conf_repair(false) ->
- ok;
- verify_conf_repair(force) ->
- ok;
- verify_conf_repair(InvalidRepair) ->
- error({invalid_conf_db_repair, InvalidRepair}).
- verify_conf_auto_save(infinity) ->
- ok;
- verify_conf_auto_save(AutoSave)
- when is_integer(AutoSave) andalso (AutoSave > 0) ->
- ok;
- verify_conf_auto_save(InvalidAutoSave) ->
- error({invalid_conf_db_auto_save, InvalidAutoSave}).
- verify_versions([]) ->
- ok;
- verify_versions([Vsn|Vsns]) ->
- verify_version(Vsn),
- verify_versions(Vsns);
- verify_versions(Vsns) ->
- error({invalid_versions, Vsns}).
- verify_version(v1) ->
- ok;
- verify_version(v2) ->
- ok;
- verify_version(v3) ->
- ok;
- verify_version(Vsn) ->
- error({invalid_version, Vsn}).
- verify_audit_trail_log_opts([]) ->
- ok;
- verify_audit_trail_log_opts([{dir, Dir}|Opts]) ->
- verify_log_dir(Dir),
- verify_audit_trail_log_opts(Opts);
- verify_audit_trail_log_opts([{type, Type}|Opts]) ->
- verify_log_type(Type),
- verify_audit_trail_log_opts(Opts);
- verify_audit_trail_log_opts([{size, Size}|Opts]) ->
- verify_log_size(Size),
- verify_audit_trail_log_opts(Opts);
- verify_audit_trail_log_opts([{repair, Repair}|Opts]) ->
- verify_log_repair(Repair),
- verify_audit_trail_log_opts(Opts);
- verify_audit_trail_log_opts([{seqno, SeqNo}|Opts]) ->
- verify_log_seqno(SeqNo),
- verify_audit_trail_log_opts(Opts);
- verify_audit_trail_log_opts([Opt|_Opts]) ->
- error({invalid_audit_trail_log_option, Opt}).
- verify_log_type(read) ->
- ok;
- verify_log_type(write) ->
- ok;
- verify_log_type(read_write) ->
- ok;
- verify_log_type(Type) ->
- error({invalid_audit_trail_log_type, Type}).
- verify_log_dir(Dir) ->
- case (catch verify_dir(Dir)) of
- ok ->
- ok;
- {error, Reason} ->
- error({invalid_audit_trail_log_dir, Dir, Reason});
- _ ->
- error({invalid_audit_trail_log_dir, Dir})
- end.
- verify_log_size(Sz) when is_integer(Sz) andalso (Sz > 0) ->
- ok;
- verify_log_size(infinity) ->
- ok;
- verify_log_size({MaxNoBytes, MaxNoFiles})
- when (is_integer(MaxNoBytes) andalso
- (MaxNoBytes > 0) andalso
- is_integer(MaxNoFiles) andalso
- (MaxNoFiles > 0) andalso
- (MaxNoFiles < 65000)) ->
- ok;
- verify_log_size(Sz) ->
- error({invalid_audit_trail_log_size, Sz}).
- verify_log_repair(true) -> ok;
- verify_log_repair(false) -> ok;
- verify_log_repair(truncate) -> ok;
- verify_log_repair(Repair) ->
- error({invalid_audit_trail_log_repair, Repair}).
- verify_log_seqno(true) -> ok;
- verify_log_seqno(false) -> ok;
- verify_log_seqno(SeqNo) ->
- error({invalid_audit_trail_log_seqno, SeqNo}).
- verify_module(_, Mod) when is_atom(Mod) ->
- ok;
- verify_module(ReasonTag, Mod) ->
- error({invalid_module, ReasonTag, Mod}).
- % verify_bool(_, true) ->
- % ok;
- % verify_bool(_, false) ->
- % ok;
- % verify_bool(ReasonTag, Bool) ->
- % error({invalid_bool, ReasonTag, Bool}).
- verify_dir(Dir) when is_list(Dir) ->
- case file:read_file_info(Dir) of
- {ok, #file_info{type = directory}} ->
- ok;
- {ok, _} ->
- {error, not_directory};
- {error, _Reason} ->
- {error, not_found}
- end;
- verify_dir(Dir) ->
- {error, {invalid_log_dir, Dir}}.
- verify_verbosity(Verbosity) ->
- case snmp_verbosity:validate(Verbosity) of
- Verbosity ->
- ok;
- _ ->
- error({invalid_verbosity, Verbosity})
- end.
-
- %% mandatory() -> [mand()]
- %% mand() -> atom() | {atom, [atom()]}
- verify_mandatory_options(_Opts, []) ->
- ok;
- verify_mandatory_options(Opts, [Mand|Mands]) ->
- verify_mandatory_option(Opts, Mand),
- verify_mandatory_options(Opts, Mands).
- verify_mandatory_option(Opts, {Mand, MandSubOpts}) ->
- ?d("verify_mandatory_option -> entry with"
- "~n Mand: ~p"
- "~n MandSubObjs: ~p", [Mand, MandSubOpts]),
- case lists:keysearch(Mand, 1, Opts) of
- {value, {Mand, SubOpts}} ->
- verify_mandatory_options(SubOpts, MandSubOpts);
- false ->
- ?d("missing mandatory option: ~w [~p]", [Mand, MandSubOpts]),
- error({missing_mandatory, Mand, MandSubOpts})
- end;
- verify_mandatory_option(Opts, Mand) ->
- ?d("verify_mandatory_option -> entry with"
- "~n Mand: ~p", [Mand]),
- case lists:keymember(Mand, 1, Opts) of
- true ->
- ok;
- false ->
- ?d("missing mandatory option: ~w", [Mand]),
- error({missing_mandatory, Mand})
- end.
- %% ------------------------------------------------------------------------
- init_manager_config([]) ->
- ok;
- init_manager_config([{Key, Val}|Confs]) ->
- ets:insert(snmpm_config_table, {Key, Val}),
- init_manager_config(Confs).
- init_agent_default() ->
- %% The purpose of the default_agent is only to have a place
- %% to store system wide default values related to agents.
- %%
- AgentDefaultConfig =
- [{port, ?DEFAULT_AGENT_PORT}, % Port
- {timeout, 10000}, % Timeout
- {max_message_size, 484}, % Max message (packet) size
- {version, v2}, % MPModel
- {sec_model, v2c}, % SecModel
- {sec_name, "initial"}, % SecName
- {sec_level, noAuthNoPriv}, % SecLevel
- {community, "all-rights"}], % Community
- do_update_agent_info(default_agent, AgentDefaultConfig).
- read_agents_config_file(Dir) ->
- Order = fun snmp_conf:no_order/2,
- Check = fun check_agent_config/2,
- try read_file(Dir, "agents.conf", Order, Check, [])
- catch
- throw:Error ->
- ?vlog("agent config error: ~p", [Error]),
- erlang:raise(throw, Error, erlang:get_stacktrace())
- end.
- check_agent_config(Agent, State) ->
- {ok, {UserId, TargetName, Conf, Version}} = check_agent_config(Agent),
- {ok, Vsns} = system_info(versions),
- case lists:member(Version, Vsns) of
- true ->
- {{ok, {UserId, TargetName, Conf}}, State};
- false ->
- error({version_not_supported_by_manager, Version, Vsns})
- end.
- %% For backward compatibility
- check_agent_config(
- {UserId, TargetName, Community, Domain, Addr,
- EngineId, Timeout, MaxMessageSize,
- Version, SecModel, SecName, SecLevel}) when is_atom(Domain) ->
- check_agent_config(
- UserId, TargetName, Community, Domain, Addr,
- EngineId, Timeout, MaxMessageSize,
- Version, SecModel, SecName, SecLevel);
- check_agent_config(
- {UserId, TargetName, Community, Ip, Port,
- EngineId, Timeout, MaxMessageSize,
- Version, SecModel, SecName, SecLevel}) when is_integer(Port) ->
- Domain = default_transport_domain(),
- Addr = {Ip, Port},
- check_agent_config(
- UserId, TargetName, Community, Domain, Addr,
- EngineId, Timeout, MaxMessageSize,
- Version, SecModel, SecName, SecLevel);
- check_agent_config(
- {_UserId, _TargetName, _Community, Domain, Addr,
- _EngineId, _Timeout, _MaxMessageSize,
- _Version, _SecModel, _SecName, _SecLevel}) ->
- error({bad_address, {Domain, Addr}});
- check_agent_config(
- {UserId, TargetName, Community, Domain, Ip, Port,
- EngineId, Timeout, MaxMessageSize,
- Version, SecModel, SecName, SecLevel}) ->
- Addr = {Ip, Port},
- check_agent_config(
- UserId, TargetName, Community, Domain, Addr,
- EngineId, Timeout, MaxMessageSize,
- Version, SecModel, SecName, SecLevel);
- check_agent_config(Agent) ->
- error({bad_agent_config, Agent}).
- check_agent_config(
- UserId, TargetName, Comm, Domain, Addr,
- EngineId, Timeout, MMS,
- Version, SecModel, SecName, SecLevel) ->
- ?vdebug("check_agent_config -> entry with"
- "~n UserId: ~p"
- "~n TargetName: ~p", [UserId, TargetName]),
- snmp_conf:check_string(TargetName, {gt, 0}),
- %% Note that the order of Conf *is* important.
- %% Some properties may depend on others, so that
- %% in order to verify one property, another must
- %% be already verified (and present). An example
- %% of this is the property 'taddress', for which
- %% the property tdomain is needed.
- Conf =
- [{reg_type, target_name},
- {tdomain, …
Large files files are truncated, but you can click here to view the full file