diff options
Diffstat (limited to 'lib/snmp/src/misc/snmp_mini_mib.erl')
-rw-r--r-- | lib/snmp/src/misc/snmp_mini_mib.erl | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/lib/snmp/src/misc/snmp_mini_mib.erl b/lib/snmp/src/misc/snmp_mini_mib.erl new file mode 100644 index 0000000000..d80270d5c2 --- /dev/null +++ b/lib/snmp/src/misc/snmp_mini_mib.erl @@ -0,0 +1,151 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-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_mini_mib). + +%% need definition of mib record +-include("snmp_types.hrl"). + +-export([ + create/1, + delete/1, + aliasname/2, + oid/2, + type/2 + ]). + + +-record(mini_mib, {cache, db = []}). + + +%%%-------------------------------------------------- +%%% The Mini MIB representation +%%%-------------------------------------------------- + +%% Returns a Mini MIB +create(Mibs) -> + Loaded = lists:append([load_mib(Mib) || Mib <- Mibs]), + Sorted = lists:keysort(1, Loaded), + Db = remove_dubbletts(Sorted), + Cache = ets:new(snmp_mini_mib_cache, [set, {keypos, 1}]), + #mini_mib{cache = Cache, + db = Db}. + +delete(#mini_mib{cache = Cache}) -> + ets:delete(Cache), + ok. + + +%%---------------------------------------------------------------------- +%% Returns: A list of {Oid, Aliasname, Type} +%%---------------------------------------------------------------------- +load_mib(MIB) -> + F1 = snmp_misc:strip_extension_from_filename(MIB, ".bin"), + ActualFileName = lists:append(F1, ".bin"), + case snmp_misc:read_mib(ActualFileName) of + {ok, #mib{mes = MEs, traps = Traps}} -> + make_mini_mib_elem(MEs++Traps); + {error, Reason} -> + exit({error, {MIB, Reason}}) + end. + + +%%---------------------------------------------------------------------- +%% Pre: List is sorted (dublettes are list neighbours) +%%---------------------------------------------------------------------- +remove_dubbletts([]) -> []; +remove_dubbletts([X]) -> [X]; +remove_dubbletts([X,X|T]) -> remove_dubbletts([X|T]); +remove_dubbletts([X|T]) -> [X|remove_dubbletts(T)]. + + +%%---------------------------------------------------------------------- +%% Args: A list if Mes +%% Returns: a list of {Oid, Aliasname, Type} +%%---------------------------------------------------------------------- +make_mini_mib_elem([]) -> []; +make_mini_mib_elem([#me{aliasname = N, + oid = Oid, + entrytype = variable, + asn1_type = #asn1_type{bertype = Type}} | T]) -> + [{Oid, N, Type} | make_mini_mib_elem(T)]; +make_mini_mib_elem([#me{aliasname = N, + oid = Oid, + entrytype = table_column, + asn1_type = ASN1}|T]) + when is_record(ASN1, asn1_type)-> + [{Oid, N, ASN1#asn1_type.bertype} | make_mini_mib_elem(T)]; +make_mini_mib_elem([#me{aliasname = N, + oid = Oid, + asn1_type = undefined}|T]) -> + [{Oid, N, undefined} | make_mini_mib_elem(T)]; +make_mini_mib_elem([#notification{trapname = N, + oid = Oid}|T]) -> + [{Oid, N, undefined} | make_mini_mib_elem(T)]; +make_mini_mib_elem([_|T]) -> + make_mini_mib_elem(T). + + +%%---------------------------------------------------------------------- +%% Returns: false | {Oid, Aliasname, Type} +%%---------------------------------------------------------------------- + +aliasname(#mini_mib{cache = Cache, db = Db}, Oid) -> + Key = {Oid, aliasname}, + case ets:lookup(Cache, Key) of + [{_, Value}] -> + Value; + _ -> + Value = aliasname(Db, Oid, false), + ets:insert(Cache, {Key, Value}), + Value + end. + +aliasname([], _Oid, Res) -> + Res; +aliasname([{Oid, _Aliasname, _Type} = OidData|T], OidX, Res) + when Oid =< OidX -> + case lists:prefix(Oid, OidX) of + true -> + aliasname(T, OidX, OidData); + false -> + aliasname(T, OidX, Res) + end; +aliasname([{_Oid, _Aliasname, _Type}|_T], _OidX, Res) -> + Res. + + +oid(#mini_mib{db = Db}, AliasName) -> + case lists:keysearch(AliasName, 2, Db) of + {value, {Oid, _Aliasname, _Type}} -> + Oid; + false -> + false + end. + + +type(MiniMIB, Oid) -> + case aliasname(MiniMIB, Oid) of + {_Oid, _AliasName, Type} -> + Type; + Else -> + Else + end. + + |