aboutsummaryrefslogtreecommitdiffstats
path: root/lib/snmp/src/app/snmp_app.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/snmp/src/app/snmp_app.erl')
-rw-r--r--lib/snmp/src/app/snmp_app.erl175
1 files changed, 175 insertions, 0 deletions
diff --git a/lib/snmp/src/app/snmp_app.erl b/lib/snmp/src/app/snmp_app.erl
new file mode 100644
index 0000000000..deb42cc373
--- /dev/null
+++ b/lib/snmp/src/app/snmp_app.erl
@@ -0,0 +1,175 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2003-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(snmp_app).
+
+-behaviour(application).
+
+-include("snmp_debug.hrl").
+
+
+%%%-----------------------------------------------------------------
+%%% This module implements the SNMP application.
+%%%-----------------------------------------------------------------
+-export([start/2, stop/0, stop/1, config_change/3]).
+-export([start_agent/0, start_agent/1, start_agent/2]).
+-export([start_manager/0, start_manager/1, start_manager/2]).
+
+start(Type, []) ->
+ ?d("start -> entry with"
+ "~n Type. ~p", [Type]),
+ %% This is the new snmp application config format
+ %% First start the (new) central supervisor,
+ {ok, Pid} = snmp_app_sup:start_link(),
+ Entities = entities(),
+ ok = start_entities(Type, Entities),
+ {ok, Pid}.
+
+entities() ->
+ entities([agent, manager], []).
+
+entities([], []) ->
+ ?d("entities -> entry when no entities", []),
+
+ %% Could be old style snmp (agent) application config format
+ %% but could also be a skeleton start, which means that neither
+ %% agent nor manager config has been specified
+
+ case get_env() of
+ [] ->
+ %% Skeleton start
+ ?d("entities -> skeleton start", []),
+ [];
+ OldConf when is_list(OldConf) ->
+ ?d("entities -> old style config: ~n~p", [OldConf]),
+ %% Old style snmp (agent) application config format
+ Conf = snmpa_app:convert_config(OldConf),
+ ?d("entities -> converted config: ~n~p", [Conf]),
+ [{agent, Conf}]
+ end;
+entities([], E) ->
+ ?d("entities -> done", []),
+ lists:reverse(E);
+entities([ET|ETs], E) ->
+ ?d("entities -> entry with"
+ "~n ET: ~p", [ET]),
+ case application:get_env(snmp, ET) of
+ {ok, Conf} ->
+ entities(ETs, [{ET, Conf}|E]);
+ _ ->
+ entities(ETs, E)
+ end.
+
+start_entities(_Type, []) ->
+ ok;
+start_entities(Type, [{agent, Opts}|Entities]) ->
+ case start_agent(Type, Opts) of
+ ok ->
+ start_entities(Type, Entities);
+ Error ->
+ Error
+ end;
+start_entities(Type, [{manager, Opts}|Entities]) ->
+ case start_manager(Type, Opts) of
+ ok ->
+ start_entities(Type, Entities);
+ Error ->
+ Error
+ end;
+start_entities(Type, [BadEntity|Entities]) ->
+ error_msg("Bad snmp configuration: ~n: ~p", [BadEntity]),
+ start_entities(Type, Entities).
+
+
+start_agent() ->
+ start_agent(normal).
+
+start_agent(Type) when is_atom(Type) ->
+ case application:get_env(snmp, agent) of
+ {ok, Opts} ->
+ start_agent(Type, Opts);
+ _ ->
+ {error, missing_config}
+ end;
+start_agent(Opts) when is_list(Opts) ->
+ start_agent(normal, Opts);
+start_agent(BadArg) ->
+ {error, {bad_arg, BadArg}}.
+
+start_agent(Type, Opts) ->
+ ?d("start_agent -> entry", []),
+ case snmp_app_sup:start_agent(Type, Opts) of
+ {ok, _} ->
+ ok;
+ Error ->
+ Error
+ end.
+
+start_manager() ->
+ start_manager(normal).
+
+start_manager(Type) when is_atom(Type) ->
+ case application:get_env(snmp, manager) of
+ {ok, Opts} ->
+ start_manager(Type, Opts);
+ _ ->
+ {error, missing_config}
+ end;
+start_manager(Opts) when is_list(Opts) ->
+ start_manager(normal, Opts);
+start_manager(BadArg) ->
+ {error, {bad_arg, BadArg}}.
+
+start_manager(Type, Opts) ->
+ ?d("start manager -> entry", []),
+ case snmp_app_sup:start_manager(Type, Opts) of
+ {ok, _} ->
+ ok;
+ Error ->
+ Error
+ end.
+
+
+stop(_) ->
+ ok.
+
+stop() ->
+ snmp_app_sup:stop().
+
+
+get_env() ->
+ Env = application:get_all_env(snmp),
+ DeleteElem = [included_applications],
+ F = fun({Key, _}) -> lists:member(Key, DeleteElem) end,
+ lists:dropwhile(F, Env).
+
+
+%%-----------------------------------------------------------------
+%% The presence of this function means that we will accept changes
+%% in the configuration parameters. However, we won't react upon
+%% those changes until the app is restarted. So we just return
+%% ok.
+%%-----------------------------------------------------------------
+config_change(_Changed, _New, _Removed) ->
+ ok.
+
+%% ---------------------------------------------------------------------
+
+error_msg(F, A) ->
+ error_logger:error_msg("~w: " ++ F ++ "~n", [?MODULE|A]).
+