aboutsummaryrefslogtreecommitdiffstats
path: root/lib/snmp/src/agent/snmp_standard_mib.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/snmp/src/agent/snmp_standard_mib.erl')
-rw-r--r--lib/snmp/src/agent/snmp_standard_mib.erl316
1 files changed, 316 insertions, 0 deletions
diff --git a/lib/snmp/src/agent/snmp_standard_mib.erl b/lib/snmp/src/agent/snmp_standard_mib.erl
new file mode 100644
index 0000000000..3928a8afe6
--- /dev/null
+++ b/lib/snmp/src/agent/snmp_standard_mib.erl
@@ -0,0 +1,316 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-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_standard_mib).
+
+%%%-----------------------------------------------------------------
+%%% This module implements the configure- and reinit-functions
+%%% for the STANDARD-MIB and SNMPv2-MIB.
+%%%-----------------------------------------------------------------
+
+-include("snmp_types.hrl").
+-include("STANDARD-MIB.hrl").
+
+-define(VMODULE,"STANDARD-MIB").
+-include("snmp_verbosity.hrl").
+
+-define(enabled, 1).
+-define(disabled, 2).
+
+%% External exports
+-export([configure/1, reconfigure/1, reset/0, sys_up_time/0, sys_up_time/1,
+ snmp_enable_authen_traps/1, snmp_enable_authen_traps/2,
+ sys_object_id/1, sys_object_id/2, sys_or_table/3,
+ variable_func/1, variable_func/2,
+ inc/1, inc/2]).
+-export([dummy/1, snmp_set_serial_no/1, snmp_set_serial_no/2]).
+-export([add_agent_caps/2, del_agent_caps/1, get_agent_caps/0]).
+-export([check_standard/1]).
+
+
+%%-----------------------------------------------------------------
+%% Func: configure/1
+%% Args: Dir is the directory with trailing dir_separator where
+%% the configuration files can be found.
+%% Purpose: Reads the config-files for the standard mib, and
+%% inserts the data. Persistent data that is already
+%% present is *not* changed! (use reconfigure for that)
+%% Returns: ok
+%% Fails: exit(configuration_error)
+%%-----------------------------------------------------------------
+configure(Dir) ->
+ case (catch do_configure(Dir)) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ ?vinfo("configure error: ~p", [Reason]),
+ config_err("configure failed: ~p", [Reason]),
+ exit(configuration_error);
+ Error ->
+ ?vinfo("configure failed: ~p", [Error]),
+ config_err("configure failed: ~p", [Error]),
+ exit(configuration_error)
+ end.
+
+do_configure(Dir) ->
+ case snmpa_agent:get_agent_mib_storage() of
+ mnesia ->
+ ok;
+ _ ->
+ Standard = read_standard(Dir),
+ lists:map(fun maybe_create_persistent_var/1, Standard)
+ end,
+ snmpa_local_db:variable_set({next_sys_or_index, volatile}, 1),
+ %% sysORTable is always volatile
+ snmp_generic:table_func(new, {sysORTable, volatile}),
+ ok.
+
+
+%%-----------------------------------------------------------------
+%% Func: reconfigure/1
+%% Args: Dir is the directory with trailing dir_separator where
+%% the configuration files can be found.
+%% Purpose: Reads the config-files for the standard mib, and
+%% inserts the data. Persistent data that is already
+%% present is deleted. Makes sure the config file
+%% data is used.
+%% Returns: ok
+%% Fails: exit(configuration_error)
+%%-----------------------------------------------------------------
+reconfigure(Dir) ->
+ set_sname(),
+ case (catch do_reconfigure(Dir)) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ ?vinfo("reconfigure error: ~p", [Reason]),
+ config_err("reconfigure failed: ~p", [Reason]),
+ exit(configuration_error);
+ Error ->
+ ?vinfo("reconfigure failed: ~p", [Error]),
+ config_err("reconfigure failed: ~p", [Error]),
+ exit(configuration_error)
+ end.
+
+do_reconfigure(Dir) ->
+ Standard = read_standard(Dir),
+ lists:map(fun create_persistent_var/1, Standard),
+ snmpa_local_db:variable_set({next_sys_or_index, volatile}, 1),
+ snmp_generic:table_func(new, {sysORTable, volatile}),
+ ok.
+
+
+%%-----------------------------------------------------------------
+%% Func: read_standard/1
+%% Args: Dir is the directory with trailing dir_separator where
+%% the configuration files can be found.
+%% Purpose: Reads th standard configuration file.
+%% Returns: A list of standard variables
+%% Fails: If an error occurs, the process will die with Reason
+%% configuration_error.
+%%-----------------------------------------------------------------
+read_standard(Dir) ->
+ ?vdebug("check standard config file",[]),
+ Gen = fun(_) -> ok end,
+ Filter = fun(Standard) -> sort_standard(Standard) end,
+ Check = fun(Entry) -> check_standard(Entry) end,
+ [Standard] =
+ snmp_conf:read_files(Dir, [{Gen, Filter, Check, "standard.conf"}]),
+ Standard.
+
+
+%%-----------------------------------------------------------------
+%% Make sure that each mandatory standard attribute is present, and
+%% provide default values for the other non-present attributes.
+%%-----------------------------------------------------------------
+sort_standard(L) ->
+ Mand = [{sysContact, {value, ""}},
+ {sysDescr, {value, ""}},
+ {sysLocation, {value, ""}},
+ {sysName, {value, ""}},
+ {sysObjectID, mandatory},
+ {sysServices, mandatory},
+ {snmpEnableAuthenTraps, mandatory}],
+ {ok, L2} = snmp_conf:check_mandatory(L, Mand),
+ lists:keysort(1, L2).
+
+
+%%-----------------------------------------------------------------
+%% Standard
+%% {Name, Value}.
+%%-----------------------------------------------------------------
+check_standard({sysDescr, Value}) -> snmp_conf:check_string(Value);
+check_standard({sysObjectID, Value}) -> snmp_conf:check_oid(Value);
+check_standard({sysContact, Value}) -> snmp_conf:check_string(Value);
+check_standard({sysName, Value}) -> snmp_conf:check_string(Value);
+check_standard({sysLocation, Value}) -> snmp_conf:check_string(Value);
+check_standard({sysServices, Value}) -> snmp_conf:check_integer(Value);
+check_standard({snmpEnableAuthenTraps, Value}) ->
+ Atoms = [{enabled, ?snmpEnableAuthenTraps_enabled},
+ {disabled, ?snmpEnableAuthenTraps_disabled}],
+ {ok, Val} = snmp_conf:check_atom(Value, Atoms),
+ {ok, {snmpEnableAuthenTraps, Val}};
+check_standard({Attrib, _Value}) -> error({unknown_attribute, Attrib});
+check_standard(X) -> error({invalid_standard_specification, X}).
+
+
+%%-----------------------------------------------------------------
+%% Func: reset/0
+%% Purpose: Resets all counters (sets them to 0).
+%%-----------------------------------------------------------------
+reset() ->
+ snmpa_mpd:reset().
+
+maybe_create_persistent_var({Var, Val}) ->
+ VarDB = db(Var),
+ case snmp_generic:variable_get(VarDB) of
+ {value, _} -> ok;
+ _ -> snmp_generic:variable_set(VarDB, Val)
+ end.
+
+create_persistent_var({Var, Val}) ->
+ snmp_generic:variable_set(db(Var), Val).
+
+variable_func(_Op) -> ok.
+
+variable_func(get, Name) ->
+ [{_, Val}] = ets:lookup(snmp_agent_table, Name),
+ {value, Val}.
+
+
+%%-----------------------------------------------------------------
+%% inc(VariableName) increments the variable (Counter) in
+%% the local mib. (e.g. snmpInPkts)
+%%-----------------------------------------------------------------
+inc(Name) -> inc(Name, 1).
+inc(Name, N) -> ets:update_counter(snmp_agent_table, Name, N).
+
+%%-----------------------------------------------------------------
+%% This is the instrumentation function for sysUpTime.
+%%-----------------------------------------------------------------
+sys_up_time() ->
+ snmpa:sys_up_time().
+
+sys_up_time(get) ->
+ {value, snmpa:sys_up_time()}.
+
+%%-----------------------------------------------------------------
+%% This is the instrumentation function for snmpEnableAuthenTraps
+%%-----------------------------------------------------------------
+snmp_enable_authen_traps(new) ->
+ snmp_generic:variable_func(new, db(snmpEnableAuthenTraps));
+
+snmp_enable_authen_traps(delete) ->
+ ok;
+
+snmp_enable_authen_traps(get) ->
+ snmp_generic:variable_func(get, db(snmpEnableAuthenTraps)).
+
+snmp_enable_authen_traps(set, NewVal) ->
+ snmp_generic:variable_func(set, NewVal, db(snmpEnableAuthenTraps)).
+
+%%-----------------------------------------------------------------
+%% This is the instrumentation function for sysObjectId
+%%-----------------------------------------------------------------
+sys_object_id(new) ->
+ snmp_generic:variable_func(new, db(sysObjectID));
+
+sys_object_id(delete) ->
+ ok;
+
+sys_object_id(get) ->
+ snmp_generic:variable_func(get, db(sysObjectID)).
+
+sys_object_id(set, NewVal) ->
+ snmp_generic:variable_func(set, NewVal, db(sysObjectID)).
+
+%%-----------------------------------------------------------------
+%% This is a dummy instrumentation function for objects like
+%% snmpTrapOID, that is accessible-for-notify, with different
+%% values each time. This function will only be called with
+%% new/delete.
+%%-----------------------------------------------------------------
+dummy(_Op) -> ok.
+
+%%-----------------------------------------------------------------
+%% This is the instrumentation function for snmpSetSerialNo.
+%% It is always volatile.
+%%-----------------------------------------------------------------
+snmp_set_serial_no(new) ->
+ snmp_generic:variable_func(new, {snmpSetSerialNo, volatile}),
+ {A1,A2,A3} = erlang:now(),
+ random:seed(A1,A2,A3),
+ Val = random:uniform(2147483648) - 1,
+ snmp_generic:variable_func(set, Val, {snmpSetSerialNo, volatile});
+
+snmp_set_serial_no(delete) ->
+ ok;
+
+snmp_set_serial_no(get) ->
+ snmp_generic:variable_func(get, {snmpSetSerialNo, volatile}).
+
+snmp_set_serial_no(is_set_ok, NewVal) ->
+ case snmp_generic:variable_func(get, {snmpSetSerialNo, volatile}) of
+ {value, NewVal} -> noError;
+ _ -> inconsistentValue
+ end;
+snmp_set_serial_no(set, NewVal) ->
+ snmp_generic:variable_func(set, (NewVal + 1) rem 2147483648,
+ {snmpSetSerialNo, volatile}).
+
+%%-----------------------------------------------------------------
+%% This is the instrumentation function for sysOrTable
+%%-----------------------------------------------------------------
+sys_or_table(Op, RowIndex, Cols) ->
+ snmp_generic:table_func(Op, RowIndex, Cols, {sysORTable, volatile}).
+
+add_agent_caps(Oid, Descr) when is_list(Oid) andalso is_list(Descr) ->
+ {value, Next} = snmpa_local_db:variable_get({next_sys_or_index, volatile}),
+ snmpa_local_db:variable_set({next_sys_or_index, volatile}, Next+1),
+ SysUpTime = sys_up_time(),
+ Row = {Next, Oid, Descr, SysUpTime},
+ snmpa_local_db:table_create_row({sysORTable, volatile}, [Next], Row),
+ snmpa_local_db:variable_set({sysORLastChange, volatile}, SysUpTime),
+ Next.
+
+del_agent_caps(Index) ->
+ snmpa_local_db:table_delete_row({sysORTable, volatile}, [Index]),
+ snmpa_local_db:variable_set({sysORLastChange, volatile}, sys_up_time()).
+
+get_agent_caps() ->
+ snmpa_local_db:match({sysORTable, volatile}, {'$1', '$2', '$3', '$4'}).
+
+
+db(Var) -> snmpa_agent:db(Var).
+
+
+%% -----
+
+set_sname() ->
+ set_sname(get(sname)).
+
+set_sname(undefined) ->
+ put(sname,conf);
+set_sname(_) -> %% Keep it, if already set.
+ ok.
+
+error(Reason) ->
+ throw({error, Reason}).
+
+config_err(F, A) ->
+ snmpa_error:config_err("[STANDARD-MIB]: " ++ F, A).