aboutsummaryrefslogtreecommitdiffstats
path: root/lib/snmp/test/snmp_agent_mibs_test.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/snmp/test/snmp_agent_mibs_test.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/snmp/test/snmp_agent_mibs_test.erl')
-rw-r--r--lib/snmp/test/snmp_agent_mibs_test.erl721
1 files changed, 721 insertions, 0 deletions
diff --git a/lib/snmp/test/snmp_agent_mibs_test.erl b/lib/snmp/test/snmp_agent_mibs_test.erl
new file mode 100644
index 0000000000..5f1ff53a79
--- /dev/null
+++ b/lib/snmp/test/snmp_agent_mibs_test.erl
@@ -0,0 +1,721 @@
+%%
+%% %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%
+%%
+
+%%
+%%----------------------------------------------------------------------
+%% Purpose:
+%%----------------------------------------------------------------------
+-module(snmp_agent_mibs_test).
+
+%%----------------------------------------------------------------------
+%% Include files
+%%----------------------------------------------------------------------
+-include("test_server.hrl").
+-include("snmp_test_lib.hrl").
+-include_lib("snmp/include/snmp_types.hrl").
+-include_lib("snmp/include/SNMP-COMMUNITY-MIB.hrl").
+-include_lib("snmp/include/SNMP-VIEW-BASED-ACM-MIB.hrl").
+-include_lib("snmp/include/SNMP-USER-BASED-SM-MIB.hrl").
+-include("snmp_test_data/Test2.hrl").
+
+
+%%----------------------------------------------------------------------
+%% External exports
+%%----------------------------------------------------------------------
+-export([
+ all/1,
+ init_per_testcase/2, fin_per_testcase/2,
+ init_all/1, finish_all/1,
+
+ start_and_stop/1,
+ size_check/1,
+ size_check_ets/1,
+ size_check_dets/1,
+ size_check_mnesia/1,
+ load_unload/1,
+ me_lookup/1,
+ which_mib/1,
+ cache_test/1
+
+ ]).
+
+%%----------------------------------------------------------------------
+%% Internal exports
+%%----------------------------------------------------------------------
+-export([
+ ]).
+
+%%----------------------------------------------------------------------
+%% Macros
+%%----------------------------------------------------------------------
+
+%%----------------------------------------------------------------------
+%% Records
+%%----------------------------------------------------------------------
+
+%%======================================================================
+%% External functions
+%%======================================================================
+
+init_per_testcase(size_check_dets, Config) when is_list(Config) ->
+ Dir = ?config(priv_dir, Config),
+ DetsDir = join(Dir, "dets_dir/"),
+ ?line ok = file:make_dir(DetsDir),
+ [{dets_dir, DetsDir}|Config];
+init_per_testcase(size_check_mnesia, Config) when is_list(Config) ->
+ Dir = ?config(priv_dir, Config),
+ MnesiaDir = join(Dir, "mnesia_dir/"),
+ ?line ok = file:make_dir(MnesiaDir),
+ mnesia_start([{dir, MnesiaDir}]),
+ [{mnesia_dir, MnesiaDir}|Config];
+init_per_testcase(cache_test, Config) when is_list(Config) ->
+ Min = timer:minutes(5),
+ Timeout =
+ case lists:keysearch(tc_timeout, 1, Config) of
+ {value, {tc_timeout, TcTimeout}} when TcTimeout < Min ->
+ Min;
+ {value, {tc_timeout, TcTimeout}} ->
+ TcTimeout;
+ _ ->
+ Min
+ end,
+ Dog = test_server:timetrap(Timeout),
+ [{watchdog, Dog} | Config];
+init_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
+
+fin_per_testcase(size_check_dets, Config) when is_list(Config) ->
+ Dir = ?config(dets_dir, Config),
+ ?line ok = ?DEL_DIR(Dir),
+ lists:keydelete(dets_dir, 1, Config);
+fin_per_testcase(size_check_mnesia, Config) when is_list(Config) ->
+ mnesia_stop(),
+ Dir = ?config(mnesia_dir, Config),
+ ?line ok = ?DEL_DIR(Dir),
+ lists:keydelete(mnesia_dir, 1, Config);
+fin_per_testcase(cache_test, Config) when is_list(Config) ->
+ Dog = ?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ Config;
+fin_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
+
+
+%%======================================================================
+%% Test case definitions
+%%======================================================================
+
+all(suite) ->
+ {conf, init_all, cases(), finish_all}.
+
+cases() ->
+ [
+ start_and_stop,
+ load_unload,
+ size_check,
+ me_lookup,
+ which_mib,
+ cache_test
+ ].
+
+init_all(Config) when is_list(Config) ->
+ %% Data dir points wrong
+ DataDir0 = ?config(data_dir, Config),
+ DataDir1 = filename:split(filename:absname(DataDir0)),
+ [_|DataDir2] = lists:reverse(DataDir1),
+ DataDir = filename:join(lists:reverse(DataDir2) ++ [?snmp_test_data]),
+ [{snmp_data_dir, DataDir ++ "/"}|Config].
+
+finish_all(Config) when is_list(Config) ->
+ lists:keydelete(snmp_data_dir, 1, Config).
+
+
+%%======================================================================
+%% Test functions
+%%======================================================================
+
+start_and_stop(suite) -> [];
+start_and_stop(Config) when is_list(Config) ->
+ Prio = normal,
+ Verbosity = trace,
+
+ ?line sym_start(Prio, Verbosity),
+ ?line MibsPid = mibs_start(Prio, Verbosity),
+
+ ?line mibs_info(MibsPid),
+
+ ?line mibs_stop(MibsPid),
+ ?line sym_stop(),
+
+ ok.
+
+
+%% ---------------------------------------------------------------------
+
+load_unload(suite) -> [];
+load_unload(Config) when is_list(Config) ->
+ Prio = normal,
+ Verbosity = log,
+ %% MibStorage = ets,
+ MibDir = ?config(snmp_data_dir, Config),
+
+ ?DBG("load_unload -> start symbolic store", []),
+ ?line sym_start(Prio, Verbosity),
+
+ ?DBG("load_unload -> start mib server", []),
+ ?line MibsPid = mibs_start(Prio, Verbosity),
+
+ ?DBG("load_unload -> load one not already loaded mib", []),
+ ?line ok = verify_loaded_mibs(MibsPid, MibDir, []),
+ ?line ok = load_mibs(MibsPid, MibDir, ["Test2"]),
+ ?line ok = verify_loaded_mibs(MibsPid, MibDir, ["Test2"]),
+
+ ?DBG("load_unload -> load one already loaded mib", []),
+ ?line {error, _} = load_mibs(MibsPid, MibDir, ["Test2"]),
+
+ ?DBG("load_unload -> load 2 not already loaded mibs", []),
+ ?line ok = load_mibs(MibsPid, MibDir, ["TestTrap", "TestTrapv2"]),
+ ?line ok = verify_loaded_mibs(MibsPid, MibDir,
+ ["Test2", "TestTrap", "TestTrapv2"]),
+
+ ?DBG("load_unload -> unload one loaded mib", []),
+ ?line ok = unload_mibs(MibsPid, ["Test2"]),
+ ?line ok = verify_loaded_mibs(MibsPid, MibDir, ["TestTrap", "TestTrapv2"]),
+
+ ?DBG("load_unload -> try unload two loaded mibs and one not loaded", []),
+ ?line {error, _} = unload_mibs(MibsPid, ["TestTrap","Test2","TestTrapv2"]),
+ ?line ok = verify_loaded_mibs(MibsPid, MibDir, ["TestTrapv2"]),
+
+ ?DBG("load_unload -> unload the remaining loaded mib", []),
+ ?line ok = unload_mibs(MibsPid, ["TestTrapv2"]),
+ ?line ok = verify_loaded_mibs(MibsPid, MibDir, []),
+
+ ?DBG("load_unload -> stop mib server", []),
+ ?line mibs_stop(MibsPid),
+
+ ?DBG("load_unload -> stop symbolic store", []),
+ ?line sym_stop(),
+
+ ok.
+
+
+%% ---------------------------------------------------------------------
+
+size_check(suite) ->
+ [
+ size_check_ets,
+ size_check_dets,
+ size_check_mnesia
+ ].
+
+size_check_ets(suite) ->
+ [];
+size_check_ets(Config) when is_list(Config) ->
+ do_size_check([{mib_storage, ets}|Config]).
+
+size_check_dets(suite) ->
+ [];
+size_check_dets(Config) when is_list(Config) ->
+ Dir = ?config(dets_dir, Config),
+ do_size_check([{mib_storage, {dets, Dir}}|Config]).
+
+size_check_mnesia(suite) ->
+ [];
+size_check_mnesia(Config) when is_list(Config) ->
+ do_size_check([{mib_storage, {mnesia, [node()]}}|Config]).
+
+do_size_check(Config) ->
+ ?DBG("do_size_check -> start", []),
+ Prio = normal,
+ Verbosity = trace,
+
+ MibStorage = ?config(mib_storage, Config),
+ ?DBG("do_size_check -> MibStorage: ~p", [MibStorage]),
+ MibDir = ?config(snmp_data_dir, Config),
+ StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
+
+ ?DBG("do_size_check -> start symbolic store", []),
+ ?line sym_start(Prio, MibStorage, Verbosity),
+ ?DBG("do_size_check -> start mib server", []),
+ ?line MibsPid = mibs_start(Prio, MibStorage, Verbosity),
+
+ Mibs = ["Test2", "TestTrap", "TestTrapv2"],
+ StdMibs = ["OTP-SNMPEA-MIB",
+ "SNMP-COMMUNITY-MIB",
+ "SNMP-FRAMEWORK-MIB",
+ "SNMP-MPD-MIB",
+ "SNMP-NOTIFICATION-MIB",
+ "SNMP-TARGET-MIB",
+ "SNMP-USER-BASED-SM-MIB",
+ "SNMP-VIEW-BASED-ACM-MIB",
+ "SNMPv2-MIB",
+ "SNMPv2-TC",
+ "SNMPv2-TM"],
+
+ ?DBG("do_size_check -> load mibs", []),
+ ?line load_mibs(MibsPid, MibDir, Mibs),
+ ?DBG("do_size_check -> load std mibs", []),
+ ?line load_mibs(MibsPid, StdMibDir, StdMibs),
+
+ ?SLEEP(2000),
+ ?DBG("do_size_check -> display mem usage", []),
+ ?line display_memory_usage(MibsPid),
+
+ ?DBG("do_size_check -> unload std mibs", []),
+ ?line unload_mibs(MibsPid, StdMibs),
+ ?DBG("do_size_check -> unload mibs", []),
+ ?line unload_mibs(MibsPid, Mibs),
+
+ ?DBG("do_size_check -> stop mib server", []),
+ ?line mibs_stop(MibsPid),
+ ?DBG("do_size_check -> stop symbolic store", []),
+ ?line sym_stop(),
+
+ ?DBG("do_size_check -> done", []),
+ ok.
+
+
+%% ---------------------------------------------------------------------
+
+me_lookup(suite) -> [];
+me_lookup(Config) when is_list(Config) ->
+ Prio = normal,
+ Verbosity = trace,
+ %% MibStorage = ets,
+ MibDir = ?config(snmp_data_dir, Config),
+ StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
+ Mibs = ["Test2", "TestTrap", "TestTrapv2"],
+ StdMibs = ["OTP-SNMPEA-MIB",
+ "SNMP-COMMUNITY-MIB",
+ "SNMP-FRAMEWORK-MIB",
+ "SNMP-MPD-MIB",
+ "SNMP-NOTIFICATION-MIB",
+ "SNMP-TARGET-MIB",
+ %% "SNMP-USER-BASED-SM-MIB",
+ "SNMP-VIEW-BASED-ACM-MIB",
+ "SNMPv2-MIB",
+ "SNMPv2-TC",
+ "SNMPv2-TM"],
+
+ ?DBG("me_lookup -> start symbolic store", []),
+ ?line sym_start(Prio, Verbosity),
+
+ ?DBG("me_lookup -> start mib server", []),
+ ?line MibsPid = mibs_start(Prio, Verbosity),
+
+ ?DBG("me_lookup -> load mibs", []),
+ ?line load_mibs(MibsPid, MibDir, Mibs),
+ ?DBG("me_lookup -> load std mibs", []),
+ ?line load_mibs(MibsPid, StdMibDir, StdMibs),
+
+ ?DBG("me_lookup -> find ~w from SNMP-COMMUNITY-MIB",
+ [?snmpTrapCommunity_instance]),
+ ?line ok = me_lookup(MibsPid, ?snmpTrapCommunity_instance),
+
+ ?DBG("me_lookup -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
+ [?vacmViewSpinLock_instance]),
+ ?line ok = me_lookup(MibsPid, ?vacmViewSpinLock_instance),
+
+ ?DBG("me_lookup -> find ~w from SNMP-USER-BASED-SM-MIB",
+ [?usmStatsNotInTimeWindows_instance]),
+ ?line {error, _} = me_lookup(MibsPid, ?usmStatsNotInTimeWindows_instance),
+
+ ?DBG("me_lookup -> stop mib server", []),
+ ?line mibs_stop(MibsPid),
+
+ ?DBG("me_lookup -> stop symbolic store", []),
+ ?line sym_stop(),
+
+ ok.
+
+
+%% ---------------------------------------------------------------------
+
+which_mib(suite) -> [];
+which_mib(Config) when is_list(Config) ->
+ Prio = normal,
+ Verbosity = trace,
+ %% MibStorage = ets,
+ MibDir = ?config(snmp_data_dir, Config),
+ StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
+ Mibs = ["Test2", "TestTrap", "TestTrapv2"],
+ StdMibs = ["OTP-SNMPEA-MIB",
+ "SNMP-COMMUNITY-MIB",
+ "SNMP-FRAMEWORK-MIB",
+ "SNMP-MPD-MIB",
+ "SNMP-NOTIFICATION-MIB",
+ "SNMP-TARGET-MIB",
+ %% "SNMP-USER-BASED-SM-MIB",
+ "SNMP-VIEW-BASED-ACM-MIB",
+ "SNMPv2-MIB",
+ "SNMPv2-TC",
+ "SNMPv2-TM"],
+
+ ?DBG("which_mib -> start symbolic store", []),
+ ?line sym_start(Prio, Verbosity),
+
+ ?DBG("which_mib -> start mib server", []),
+ ?line MibsPid = mibs_start(Prio, Verbosity),
+
+ ?DBG("which_mib -> load mibs", []),
+ ?line load_mibs(MibsPid, MibDir, Mibs),
+ ?DBG("which_mib -> load std mibs", []),
+ ?line load_mibs(MibsPid, StdMibDir, StdMibs),
+
+ ?DBG("which_mib -> find ~w from SNMP-COMMUNITY-MIB",
+ [?snmpTrapCommunity_instance]),
+ ?line ok = which_mib(MibsPid, ?snmpTrapCommunity_instance,
+ "SNMP-COMMUNITY-MIB"),
+
+ ?DBG("which_mib -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
+ [?vacmViewSpinLock_instance]),
+ ?line ok = which_mib(MibsPid, ?vacmViewSpinLock_instance,
+ "SNMP-VIEW-BASED-ACM-MIB"),
+
+ ?DBG("which_mib -> find ~w from SNMP-USER-BASED-SM-MIB (not loaded)",
+ [?usmStatsNotInTimeWindows_instance]),
+ ?line {error, _} = which_mib(MibsPid, ?usmStatsNotInTimeWindows_instance,
+ "SNMP-USER-BASED-SM-MIB"),
+
+ ?DBG("which_mib -> stop mib server", []),
+ ?line mibs_stop(MibsPid),
+
+ ?DBG("which_mib -> stop symbolic store", []),
+ ?line sym_stop(),
+
+ ok.
+
+
+%% ---------------------------------------------------------------------
+
+cache_test(suite) -> [];
+cache_test(Config) when is_list(Config) ->
+ ?DBG("cache_test -> start", []),
+ Prio = normal,
+ Verbosity = trace,
+ MibStorage = ets,
+ MibDir = ?config(snmp_data_dir, Config),
+ StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
+ Mibs = ["Test2", "TestTrap", "TestTrapv2"],
+ StdMibs = ["OTP-SNMPEA-MIB",
+ "SNMP-COMMUNITY-MIB",
+ "SNMP-FRAMEWORK-MIB",
+ "SNMP-MPD-MIB",
+ "SNMP-NOTIFICATION-MIB",
+ "SNMP-TARGET-MIB",
+ %% "SNMP-USER-BASED-SM-MIB",
+ "SNMP-VIEW-BASED-ACM-MIB",
+ "SNMPv2-MIB",
+ "SNMPv2-TC",
+ "SNMPv2-TM"],
+
+ ?DBG("cache_test -> start symbolic store", []),
+ ?line sym_start(Prio, MibStorage, Verbosity),
+
+ ?DBG("cache_test -> start mib server", []),
+ GcLimit = 2,
+ Age = timer:seconds(10),
+ CacheOpts = [{autogc, false}, {age, Age}, {gclimit, GcLimit}],
+ ?line MibsPid = mibs_start(Prio, MibStorage, [], Verbosity, CacheOpts),
+
+ ?DBG("cache_test -> load mibs", []),
+ ?line load_mibs(MibsPid, MibDir, Mibs),
+ ?DBG("cache_test -> load std mibs", []),
+ ?line load_mibs(MibsPid, StdMibDir, StdMibs),
+
+ ?DBG("cache_test -> do a simple walk to populate the cache", []),
+ ?line ok = walk(MibsPid),
+
+ {ok, Sz1} = snmpa_mib:which_cache_size(MibsPid),
+ ?DBG("cache_test -> Size1: ~p", [Sz1]),
+
+ ?DBG("cache_test -> sleep 5 secs", []),
+ ?SLEEP(timer:seconds(5)),
+
+ ?DBG("cache_test -> perform gc, expect nothing", []),
+ {ok, 0} = snmpa_mib:gc_cache(MibsPid),
+
+ ?DBG("cache_test -> sleep 10 secs", []),
+ ?SLEEP(timer:seconds(10)),
+
+ ?DBG("cache_test -> perform gc, expect GcLimit", []),
+ GcLimit1 = GcLimit + 1,
+ {ok, GcLimit1} = snmpa_mib:gc_cache(MibsPid, Age, GcLimit1),
+
+ Sz2 = Sz1 - GcLimit1,
+ {ok, Sz2} = snmpa_mib:which_cache_size(MibsPid),
+ ?DBG("cache_test -> Size2: ~p", [Sz2]),
+
+ ?DBG("cache_test -> enable cache autogc", []),
+ ?line ok = snmpa_mib:enable_cache_autogc(MibsPid),
+
+ ?DBG("cache_test -> wait 65 seconds to allow gc to happen", []),
+ ?SLEEP(timer:seconds(65)),
+ Sz3 = Sz2 - GcLimit,
+ {ok, Sz3} = snmpa_mib:which_cache_size(MibsPid),
+ ?DBG("cache_test -> Size3: ~p", [Sz3]),
+
+ ?DBG("cache_test -> "
+ "wait 2 minutes to allow gc to happen, expect empty cache", []),
+ ?SLEEP(timer:minutes(2)),
+ {ok, 0} = snmpa_mib:which_cache_size(MibsPid),
+
+ ?DBG("cache_test -> stop mib server", []),
+ ?line mibs_stop(MibsPid),
+
+ ?DBG("cache_test -> stop symbolic store", []),
+ ?line sym_stop(),
+ ok.
+
+walk(MibsPid) ->
+ MibView = snmpa_acm:get_root_mib_view(),
+ do_walk(MibsPid, ?snmpTrapCommunity_instance, MibView),
+ do_walk(MibsPid, ?vacmViewSpinLock_instance, MibView),
+ do_walk(MibsPid, ?usmStatsNotInTimeWindows_instance, MibView),
+ do_walk(MibsPid, ?tDescr_instance, MibView).
+
+
+do_walk(MibsPid, Oid, MibView) ->
+ io:format("do_walk -> entry with"
+ "~n Oid: ~p"
+ "~n", [Oid]),
+ case snmpa_mib:next(MibsPid, Oid, MibView) of
+ {table, _, _, #me{oid = Oid}} ->
+ ok;
+ {table, _, _, #me{oid = Next}} ->
+ do_walk(MibsPid, Next, MibView);
+ {variable, #me{oid = Oid}, _} ->
+ ok;
+ {variable, #me{oid = Next}, _} ->
+ do_walk(MibsPid, Next, MibView)
+ end.
+
+
+%%======================================================================
+%% Internal functions
+%%======================================================================
+
+%% -- Mnesia functions
+
+mnesia_start(Opts) ->
+ mnesia_start(Opts, [node()]).
+
+mnesia_start(Opts, Nodes) ->
+ ?DBG("mnesia_start -> load mnesia", []),
+ ?line ok = application:load(mnesia),
+ F = fun({Key, Val}) ->
+ ?DBG("mnesia_start -> set mnesia env: ~n~p -> ~p", [Key,Val]),
+ ?line application_controller:set_env(mnesia, Key, Val)
+ end,
+ lists:foreach(F, Opts),
+ ?DBG("mnesia_start -> create mnesia schema on ~p", [Nodes]),
+ ?line ok = mnesia:create_schema(Nodes),
+ ?DBG("mnesia_start -> start mnesia", []),
+ ?line ok = application:start(mnesia),
+ ok.
+
+mnesia_stop() ->
+ ?DBG("mnesia_stop -> stop mnesia", []),
+ application:stop(mnesia),
+ ?DBG("mnesia_stop -> unload mnesia", []),
+ application:unload(mnesia),
+ ok.
+
+%% - Symbolic Store mini interface
+
+sym_start(Prio, Verbosity) ->
+ sym_start(Prio, ets, Verbosity).
+
+sym_start(Prio, MibStorage, Verbosity) ->
+ Opts = [{mib_storage, MibStorage}, {verbosity,Verbosity}],
+ {ok, _Pid} = snmpa_symbolic_store:start_link(Prio, Opts),
+ ok.
+
+sym_stop() ->
+ ok = snmpa_symbolic_store:stop().
+
+sym_info() ->
+ snmpa_symbolic_store:info().
+
+
+%% -- MIB server mini interface
+
+mibs_start(Prio, Verbosity) when is_atom(Prio) andalso is_atom(Verbosity) ->
+ mibs_start(Prio, ets, [], Verbosity).
+
+mibs_start(Prio, MibStorage, Verbosity)
+ when is_atom(Prio) andalso is_atom(Verbosity) ->
+ mibs_start(Prio, MibStorage, [], Verbosity).
+
+mibs_start(Prio, MibStorage, Mibs, Verbosity)
+ when is_atom(Prio) andalso
+ is_list(Mibs) andalso
+ is_atom(Verbosity) ->
+ mibs_start(Prio, MibStorage, Mibs, Verbosity, []).
+
+mibs_start(Prio, MibStorage, Mibs, Verbosity, CacheOpts)
+ when is_atom(Prio) andalso
+ is_list(Mibs) andalso
+ is_atom(Verbosity) andalso
+ is_list(CacheOpts) ->
+ Opts = [{mib_storage, MibStorage},
+ {verbosity, Verbosity},
+ {cache, CacheOpts}],
+ {ok, Pid} = snmpa_mib:start_link(Prio, Mibs, Opts),
+ Pid.
+
+mibs_stop(Pid) ->
+ ok = snmpa_mib:stop(Pid).
+
+mibs_info(Pid) ->
+ snmpa_mib:info(Pid).
+
+load_mibs(Pid, Dir, Mibs0) ->
+ Mibs = [join(Dir, Mib) || Mib <- Mibs0],
+ snmpa_mib:load_mibs(Pid, Mibs).
+
+unload_mibs(Pid, Mibs) ->
+ snmpa_mib:unload_mibs(Pid, Mibs).
+
+verify_loaded_mibs(Pid, Dir, ExpectedMibs0) ->
+ ExpectedMibs = [join(Dir, Mib) || Mib <- ExpectedMibs0],
+ case snmpa_mib:info(Pid, loaded_mibs) of
+ ExpectedMibs ->
+ ok;
+ LoadedMibs0 ->
+ ?DBG("verify_loaded_mibs -> LoadedMibs0: ~p", [LoadedMibs0]),
+ LoadedMibs = [filename:rootname(FN, ".bin") || FN <- LoadedMibs0],
+ ?DBG("verify_loaded_mibs -> LoadedMibs: ~p", [LoadedMibs]),
+ ExpNotLoadedMibs = ExpectedMibs -- LoadedMibs,
+ LoadedNotExpMibs = LoadedMibs -- ExpectedMibs,
+ ?DBG("verify_loaded_mibs -> "
+ "~n ExpNotLoadedMibs: ~p"
+ "~n LoadedNotExpMibs: ~p",
+ [ExpNotLoadedMibs, LoadedNotExpMibs]),
+ case ExpNotLoadedMibs of
+ [] ->
+ case LoadedNotExpMibs of
+ [] ->
+ ok;
+ _ ->
+ {error, {unexpected_loaded_mibs, LoadedNotExpMibs}}
+ end;
+ _ ->
+ case LoadedNotExpMibs of
+ [] ->
+ {error, {not_loaded_mibs, ExpNotLoadedMibs}};
+ _ ->
+ {error, {unexpected_mibs,
+ ExpNotLoadedMibs, LoadedNotExpMibs}}
+ end
+ end
+
+ end.
+
+me_lookup(Pid, Oid) ->
+ case snmpa_mib:lookup(Pid, Oid) of
+ {variable, #me{oid = Oid}} ->
+ ok;
+ {variable, #me{oid = OtherOid}} ->
+ case lists:reverse(Oid) of
+ [0|Rest] ->
+ case lists:reverse(Rest) of
+ OtherOid ->
+ ok;
+ AnotherOid ->
+ {error, {invalid_oid, Oid, AnotherOid}}
+ end;
+ _ ->
+ {error, {invalid_oid, Oid, OtherOid}}
+ end;
+ {table_column, _ME, _TableEntryOid} ->
+ ok;
+ {subagent, SubAgentPid, _SANextOid} ->
+ {error, {subagent, SubAgentPid}};
+ {false, Reason} ->
+ {error, Reason};
+ Else ->
+ {error, Else}
+ end.
+
+
+which_mib(Pid, Oid, Mib1) ->
+ case snmpa_mib:which_mib(Pid, Oid) of
+ {ok, Mib2} when is_atom(Mib2) ->
+ Mib3 = atom_to_list(Mib2),
+ which_mib(Mib1, Mib3);
+ {ok, Mib2} ->
+ which_mib(Mib1, Mib2);
+ {error, Reason} ->
+ {error, Reason};
+ Else ->
+ {error, Else}
+ end.
+
+which_mib(M, M) ->
+ ok;
+which_mib(M1, M2) ->
+ {error, {invalid_mib, M1, M2}}.
+
+
+%% --
+
+display_memory_usage(MibsPid) ->
+ SymInfo = sym_info(),
+ SymProcSize = key1search(process_memory, SymInfo),
+ DbSize = key1search(db_memory, SymInfo),
+ MibsInfo = mibs_info(MibsPid),
+ TreeSize = key1search(tree_size_bytes, MibsInfo),
+ MibsProcMem = key1search(process_memory, MibsInfo),
+ MibDbSize = key1search([db_memory,mib], MibsInfo),
+ NodeDbSize = key1search([db_memory,node], MibsInfo),
+ TreeDbSize = key1search([db_memory,tree], MibsInfo),
+ ?INF("Symbolic store memory usage: "
+ "~n Process memory size: ~p"
+ "~n Db size: ~p"
+ "~n"
+ "~nMib server memory usage: "
+ "~n Tree size: ~p"
+ "~n Process memory size: ~p"
+ "~n Mib db size: ~p"
+ "~n Node db size: ~p"
+ "~n Tree db size: ~p"
+ "~n",
+ [SymProcSize, DbSize,
+ TreeSize, MibsProcMem, MibDbSize, NodeDbSize, TreeDbSize]).
+
+key1search([], Res) ->
+ Res;
+key1search([Key|Keys], List) when is_atom(Key) andalso is_list(List) ->
+ case lists:keysearch(Key, 1, List) of
+ {value, {Key, Val}} ->
+ key1search(Keys, Val);
+ false ->
+ undefined
+ end;
+key1search(Key, List) when is_atom(Key) ->
+ case lists:keysearch(Key, 1, List) of
+ {value, {Key, Val}} ->
+ Val;
+ false ->
+ undefined
+ end.
+
+join(Dir, File) ->
+ filename:join(Dir, File).