snmp_mini_mib.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 143 行
ERL
143 行
%% ``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 via the world wide web 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.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %% $Id$%%-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 MIBcreate(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 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.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?