%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 1996-2019. 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% %% %%----------------------------------------------------------------- %% This module implements the config conversion for the old SNMP %% application start method %% The purpose is to extract all agent app-env and convert to the %% new format %% %% --- %% %% What about the restart times for the children %% note_store (snmpa_supervisor) and %% net_if and mib_server (snmpa_misc_sup)? %% %%----------------------------------------------------------------- -module(snmpa_app). -include("snmp_debug.hrl"). -export([convert_config/0, convert_config/1]). %% Internal (test) -export([start/1]). convert_config() -> ?d("convert_config -> entry", []), convert_config( application:get_all_env(snmp) ). convert_config(Opts) -> ?d("convert_config -> Opts: ~p", [Opts]), Prio = get_priority(Opts), DbDir = get_db_dir(Opts), DbInitError = terminate, LdbOpts = get_local_db_opts(Opts), MibStorage = get_mib_storage(Opts), MibsOpts = get_mib_server_opts(Opts), SymOpts = get_symbolic_store_opts(Opts), SetModule = get_set_mechanism(Opts), AuthModule = get_authentication_service(Opts), MultiT = get_multi_threaded(Opts), Vsns = get_versions(Opts), SupOpts = get_supervisor_opts(Opts), ErrorReportMod = get_error_report_mod(Opts), AgentType = get_agent_type(Opts), case AgentType of sub -> ?d("convert_config -> agent type: sub",[]), SaVerb = get_sub_agent_verbosity(Opts), [{agent_type, AgentType}, {agent_verbosity, SaVerb}, {get_mechanism, snmpa_get}, {set_mechanism, SetModule}, {authentication_service, AuthModule}, {priority, Prio}, {versions, Vsns}, {db_dir, DbDir}, {db_init_error, DbInitError}, {multi_threaded, MultiT}, {error_report_mod, ErrorReportMod}, {mib_storage, MibStorage}, {mib_server, MibsOpts}, {local_db, LdbOpts}, {supervisor, SupOpts}, {symbolic_store, SymOpts}]; master -> ?d("convert_config -> agent type: master",[]), MaVerb = get_master_agent_verbosity(Opts), NoteOpts = get_note_store_opts(Opts), NiOptions = get_net_if_options(Opts), NiOpts = [{options, NiOptions}|get_net_if_opts(Opts)], AtlOpts = get_audit_trail_log_opts(Opts), Mibs = get_master_agent_mibs(Opts), ForceLoad = get_force_config_load(Opts), ConfVerb = get_opt(verbosity, SupOpts, silence), ConfDir = get_config_dir(Opts), ConfOpts = [{dir, ConfDir}, {force_load, ForceLoad}, {verbosity, ConfVerb}], [{agent_type, AgentType}, {agent_verbosity, MaVerb}, {get_mechanism, snmpa_get}, {set_mechanism, SetModule}, {authentication_service, AuthModule}, {db_dir, DbDir}, {db_init_error, DbInitError}, {config, ConfOpts}, {priority, Prio}, {versions, Vsns}, {multi_threaded, MultiT}, {error_report_mod, ErrorReportMod}, {supervisor, SupOpts}, {mibs, Mibs}, {mib_storage, MibStorage}, {symbolic_store, SymOpts}, {note_store, NoteOpts}, {net_if, NiOpts}, {mib_server, MibsOpts}, {local_db, LdbOpts}] ++ AtlOpts end. start(Type) -> snmp_app_sup:start_agent(Type, convert_config()). %% ------------------------------------------------------------------ get_db_dir(Opts) -> case get_opt(snmp_db_dir, Opts) of {value, Dir} when is_list(Dir) -> Dir; {value, Bad} -> exit({bad_config, {db_dir, Bad}}); false -> exit({undefined_config, db_dir}) end. %% -- get_priority(Opts) -> case get_opt(snmp_priority, Opts) of {value, Prio} when is_atom(Prio) -> Prio; _ -> normal end. %% -- get_mib_storage(Opts) -> get_opt(snmp_mib_storage, Opts, ets). get_mib_server_opts(Opts) -> Options = [{snmp_mibserver_verbosity, verbosity, silence}, {mibentry_override, mibentry_override, false}, {trapentry_override, trapentry_override, false}], get_opts(Options, Opts, []). %% -- get_audit_trail_log_opts(Opts) -> case get_audit_trail_log(Opts) of false -> []; Type -> Dir = get_audit_trail_log_dir(Opts), Size = get_audit_trail_log_size(Opts), AtlOpts0 = [{type, Type}, {dir, Dir}, {size, Size}, {repair, true}], [{audit_trail_log, AtlOpts0}] end. get_audit_trail_log(Opts) -> case get_opt(audit_trail_log, Opts) of {value, write_log} -> write; {value, read_log} -> read; {value, read_write_log} -> read_write; _ -> false end. get_audit_trail_log_dir(Opts) -> case get_opt(audit_trail_log_dir, Opts) of {value, Dir} when is_list(Dir) -> Dir; {value, Bad} -> exit({bad_config, {audit_trail_log_dir, Bad}}); _ -> exit({undefined_config, audit_trail_log_dir}) end. get_audit_trail_log_size(Opts) -> case get_opt(audit_trail_log_size, Opts) of {value, {MB, MF} = Sz} when is_integer(MB) andalso is_integer(MF) -> Sz; {value, Bad} -> exit({bad_config, {audit_trail_log_size, Bad}}); _ -> exit({undefined_config, audit_trail_log_size}) end. %% -- get_master_agent_verbosity(Opts) -> get_opt(snmp_master_agent_verbosity, Opts, silence). %% -- get_sub_agent_verbosity(Opts) -> get_opt(snmp_subagent_verbosity, Opts, silence). %% -- get_supervisor_opts(Opts) -> Options = [{snmp_supervisor_verbosity, verbosity, silence}], get_opts(Options, Opts, []). %% -- get_symbolic_store_opts(Opts) -> Options = [{snmp_symbolic_store_verbosity, verbosity, silence}], get_opts(Options, Opts, []). %% -- get_note_store_opts(Opts) -> Options = [{snmp_note_store_verbosity, verbosity, silence}], get_opts(Options, Opts, []). %% -- get_local_db_opts(Opts) -> Options = [{snmp_local_db_auto_repair, repair, true}, {snmp_local_db_verbosity, verbosity, silence}], get_opts(Options, Opts, []). %% -- get_multi_threaded(Opts) -> case get_opt(snmp_multi_threaded, Opts) of {value, true} -> true; {value, false} -> false; _ -> false end. get_versions(Opts) -> F = fun(Ver) -> case get_opt(Ver, Opts) of {value, true} -> [Ver]; {value, false} -> []; _ -> [Ver] % Default is true end end, V1 = F(v1), V2 = F(v2), V3 = F(v3), V1 ++ V2 ++ V3. get_set_mechanism(Opts) -> get_opt(set_mechanism, Opts, snmpa_set). get_authentication_service(Opts) -> get_opt(authentication_service, Opts, snmpa_acm). get_error_report_mod(Opts) -> get_opt(snmp_error_report_mod, Opts, snmpa_error_logger). %% -- get_net_if_opts(Opts) -> Options = [{snmp_net_if_module, module, snmpa_net_if}, {snmp_net_if_verbosity, verbosity, silence}], get_opts(Options, Opts, []). get_net_if_options(Opts) -> Options = [recbuf, {req_limit, req_limit, infinity}, {bind_to_ip_address, bind_to, false}, {no_reuse_address, no_reuse, false}], get_opts(Options, Opts, []). %% -- get_agent_type(Opts) -> get_opt(snmp_agent_type, Opts, master). %% -- get_config_dir(Opts) -> case get_opt(snmp_config_dir, Opts) of {value, Dir} when is_list(Dir) -> Dir; {value, Bad} -> exit({bad_config, {config_dir, Bad}}); _ -> exit({undefined_config, config_dir}) end. get_master_agent_mibs(Opts) -> get_opt(snmp_master_agent_mibs, Opts, []). get_force_config_load(Opts) -> case get_opt(force_config_load, Opts) of {value, true} -> true; {value, false} -> false; _ -> false end. %% -- get_opts([], _Options, Opts) -> Opts; get_opts([{Key1, Key2, Def}|KeyVals], Options, Opts) -> %% If not found among Options, then use default value case lists:keysearch(Key1, 1, Options) of {value, {Key1, Val}} -> get_opts(KeyVals, Options, [{Key2, Val}|Opts]); false -> get_opts(KeyVals, Options, [{Key2, Def}|Opts]) end; get_opts([Key|KeyVals], Options, Opts) -> %% If not found among Options, then ignore case lists:keysearch(Key, 1, Options) of {value, KeyVal} -> get_opts(KeyVals, Options, [KeyVal|Opts]); false -> get_opts(KeyVals, Options, Opts) end. %% -- get_opt(Key, Opts, Def) -> case get_opt(Key, Opts) of {value, Val} -> Val; false -> Def end. get_opt(Key, Opts) -> case lists:keysearch(Key, 1, Opts) of {value, {_, Val}} -> {value, Val}; false -> false end. % i(F) -> % i(F, []). % i(F, A) -> % io:format("~p: " ++ F ++ "~n", [?MODULE|A]).