diff options
Diffstat (limited to 'lib/snmp/src/agent/snmpa.erl')
-rw-r--r-- | lib/snmp/src/agent/snmpa.erl | 580 |
1 files changed, 580 insertions, 0 deletions
diff --git a/lib/snmp/src/agent/snmpa.erl b/lib/snmp/src/agent/snmpa.erl new file mode 100644 index 0000000000..79493bd892 --- /dev/null +++ b/lib/snmp/src/agent/snmpa.erl @@ -0,0 +1,580 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-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(snmpa). + + +%%---------------------------------------------------------------------- +%% This module contains the user interface to the snmp agent toolkit. +%%---------------------------------------------------------------------- + +-export([verbosity/2, + + current_request_id/0, current_community/0, current_address/0, + current_context/0, current_net_if_data/0, + + get_symbolic_store_db/0, + which_aliasnames/0, + which_tables/0, + which_variables/0, + which_notifications/0, + name_to_oid/1, name_to_oid/2, + oid_to_name/1, oid_to_name/2, + int_to_enum/2, int_to_enum/3, + enum_to_int/2, enum_to_int/3, + + info/0, info/1, old_info_format/1, + load_mibs/1, load_mibs/2, + unload_mibs/1, unload_mibs/2, + which_mibs/0, which_mibs/1, + whereis_mib/1, whereis_mib/2, + dump_mibs/0, dump_mibs/1, + mib_of/1, mib_of/2, + me_of/1, me_of/2, + invalidate_mibs_cache/0, invalidate_mibs_cache/1, + enable_mibs_cache/0, enable_mibs_cache/1, + disable_mibs_cache/0, disable_mibs_cache/1, + gc_mibs_cache/0, gc_mibs_cache/1, gc_mibs_cache/2, gc_mibs_cache/3, + enable_mibs_cache_autogc/0, enable_mibs_cache_autogc/1, + disable_mibs_cache_autogc/0, disable_mibs_cache_autogc/1, + update_mibs_cache_age/1, update_mibs_cache_age/2, + update_mibs_cache_gclimit/1, update_mibs_cache_gclimit/2, + + get/2, get/3, get_next/2, get_next/3, + + register_subagent/3, unregister_subagent/2, + + send_notification/3, send_notification/4, send_notification/5, + send_notification/6, + send_trap/3, send_trap/4, + + discovery/2, discovery/3, discovery/4, discovery/5, discovery/6, + + sys_up_time/0, system_start_time/0, + + backup/1, backup/2, + + convert_config/1, + + restart_worker/0, restart_worker/1, + restart_set_worker/0, restart_set_worker/1]). + +%% USM functions: +-export([passwd2localized_key/3, localize_key/3]). + +%% Agent Capabilities functions +-export([add_agent_caps/2, del_agent_caps/1, get_agent_caps/0]). + +%% Audit Trail Log functions +-export([log_to_txt/2, log_to_txt/3, log_to_txt/4, + log_to_txt/5, log_to_txt/6, log_to_txt/7, + change_log_size/1, + get_log_type/0, get_log_type/1, + change_log_type/1, change_log_type/2, + set_log_type/1, set_log_type/2 + ]). + +%% Message filter / load regulation functions +-export([ + register_notification_filter/3, + register_notification_filter/4, + register_notification_filter/5, + unregister_notification_filter/1, + unregister_notification_filter/2, + which_notification_filter/0, + which_notification_filter/1, + + get_request_limit/0, get_request_limit/1, + set_request_limit/1, set_request_limit/2 + ]). + +-include("snmpa_atl.hrl"). + +-define(EXTRA_INFO, undefined). + + +%%----------------------------------------------------------------- +%% This utility function is used to convert an old SNMP application +%% config (prior to snmp-4.0) to a SNMP agent config (as of +%% snmp-4.0). +%% This is the config structure of the SNMP application as of +%% snmp-4.0: +%% {snmp, snmp_config()} +%% snmp_config() -> [snmp_config_item()] +%% snmp_config_item() -> {agent, agent_config()} | +%% {manager, manager_config()} +%%----------------------------------------------------------------- + +convert_config(Opts) -> + snmpa_app:convert_config(Opts). + + +%%----------------------------------------------------------------- +%% Note that verbosity for the agents is actually only implemented +%% (properly) for the master agent. +%%----------------------------------------------------------------- + +verbosity(all,Verbosity) -> + catch snmpa_agent:verbosity(sub_agents,Verbosity), + catch snmpa_agent:verbosity(master_agent,Verbosity), + catch snmpa_agent:verbosity(net_if,Verbosity), + catch snmpa_agent:verbosity(mib_server,Verbosity), + catch snmpa_agent:verbosity(note_store,Verbosity), + catch snmpa_symbolic_store:verbosity(Verbosity), + catch snmpa_local_db:verbosity(Verbosity); +verbosity(master_agent,Verbosity) -> + catch snmpa_agent:verbosity(master_agent,Verbosity); +verbosity(net_if,Verbosity) -> + catch snmpa_agent:verbosity(net_if,Verbosity); +verbosity(note_store,Verbosity) -> + catch snmpa_agent:verbosity(note_store, Verbosity); +verbosity(mib_server,Verbosity) -> + catch snmpa_agent:verbosity(mib_server,Verbosity); +verbosity(symbolic_store,Verbosity) -> + catch snmpa_symbolic_store:verbosity(Verbosity); +verbosity(local_db,Verbosity) -> + catch snmpa_local_db:verbosity(Verbosity); +verbosity(Agent,{subagents,Verbosity}) -> + catch snmpa_agent:verbosity(Agent,{sub_agents,Verbosity}); +verbosity(Agent,Verbosity) -> + catch snmpa_agent:verbosity(Agent,Verbosity). + + +%%----------------------------------------------------------------- +%% +%% Some symbolic store (internal database) utility functions +%% +%%----------------------------------------------------------------- + +get_symbolic_store_db() -> + snmpa_symbolic_store:get_db(). + + +which_aliasnames() -> + snmpa_symbolic_store:which_aliasnames(). + +which_tables() -> + snmpa_symbolic_store:which_tables(). + +which_variables() -> + snmpa_symbolic_store:which_variables(). + +which_notifications() -> + snmpa_symbolic_store:which_notifications(). + + +%%----------------------------------------------------------------- +%% These 8 functions returns {value, Val} | false +%%----------------------------------------------------------------- +name_to_oid(Name) -> + snmpa_symbolic_store:aliasname_to_oid(Name). + +name_to_oid(Db, Name) -> + snmpa_symbolic_store:aliasname_to_oid(Db, Name). + +oid_to_name(OID) -> + snmpa_symbolic_store:oid_to_aliasname(OID). + +oid_to_name(Db, OID) -> + snmpa_symbolic_store:oid_to_aliasname(Db, OID). + +enum_to_int(Name, Enum) -> + snmpa_symbolic_store:enum_to_int(Name, Enum). + +enum_to_int(Db, Name, Enum) -> + snmpa_symbolic_store:enum_to_int(Db, Name, Enum). + +int_to_enum(Name, Int) -> + snmpa_symbolic_store:int_to_enum(Name, Int). + +int_to_enum(Db, Name, Int) -> + snmpa_symbolic_store:int_to_enum(Db, Name, Int). + + +%%----------------------------------------------------------------- +%% These functions must only be called in the process context +%% where the instrumentation functions are called! +%%----------------------------------------------------------------- +current_request_id() -> current_get(snmp_request_id). +current_context() -> current_get(snmp_context). +current_community() -> current_get(snmp_community). +current_address() -> current_get(snmp_address). +current_net_if_data() -> current_get(net_if_data). + +current_get(Tag) -> + case get(Tag) of + undefined -> false; + X -> {value, X} + end. + + +%% - + +get(Agent, Vars) -> snmpa_agent:get(Agent, Vars). +get(Agent, Vars, Context) -> snmpa_agent:get(Agent, Vars, Context). + +get_next(Agent, Vars) -> snmpa_agent:get_next(Agent, Vars). +get_next(Agent, Vars, Context) -> snmpa_agent:get_next(Agent, Vars, Context). + + +info() -> info(snmp_master_agent). +info(Agent) -> snmpa_agent:info(Agent). + +old_info_format(Info) when is_list(Info) -> + {value, Vsns} = lists:keysearch(vsns, 1, Info), + {value, {_, MibInfo}} = lists:keysearch(mib_server, 1, Info), + {value, SAa} = lists:keysearch(subagents, 1, MibInfo), + {value, LoadedMibs} = lists:keysearch(loaded_mibs, 1, MibInfo), + {value, TreeSz} = lists:keysearch(tree_size_bytes, 1, MibInfo), + {value, ProcMem} = lists:keysearch(process_memory, 1, MibInfo), + {value, DbMem} = lists:keysearch(db_memory, 1, MibInfo), + [Vsns, SAa, LoadedMibs, TreeSz, ProcMem, DbMem]. + + +%% - + +backup(BackupDir) -> + backup(snmp_master_agent, BackupDir). + +backup(Agent, BackupDir) -> + snmpa_agent:backup(Agent, BackupDir). + + +%% - + +dump_mibs() -> snmpa_agent:dump_mibs(snmp_master_agent). +dump_mibs(File) -> snmpa_agent:dump_mibs(snmp_master_agent, File). + +load_mibs(Mibs) -> + load_mibs(snmp_master_agent, Mibs). +load_mibs(Agent, Mibs) when is_list(Mibs) -> + snmpa_agent:load_mibs(Agent, Mibs). + +unload_mibs(Mibs) -> + unload_mibs(snmp_master_agent, Mibs). +unload_mibs(Agent, Mibs) when is_list(Mibs) -> + snmpa_agent:unload_mibs(Agent, Mibs). + +which_mibs() -> which_mibs(snmp_master_agent). +which_mibs(Agent) -> snmpa_agent:which_mibs(Agent). + +whereis_mib(Mib) -> + whereis_mib(snmp_master_agent, Mib). +whereis_mib(Agent, Mib) when is_atom(Mib) -> + snmpa_agent:whereis_mib(Agent, Mib). + + +%% - + +mib_of(Oid) -> + snmpa_agent:mib_of(Oid). + +mib_of(Agent, Oid) -> + snmpa_agent:mib_of(Agent, Oid). + +me_of(Oid) -> + snmpa_agent:me_of(Oid). + +me_of(Agent, Oid) -> + snmpa_agent:me_of(Agent, Oid). + + +invalidate_mibs_cache() -> + invalidate_mibs_cache(snmp_master_agent). + +invalidate_mibs_cache(Agent) -> + snmpa_agent:invalidate_mibs_cache(Agent). + + +enable_mibs_cache() -> + enable_mibs_cache(snmp_master_agent). + +enable_mibs_cache(Agent) -> + snmpa_agent:enable_mibs_cache(Agent). + + +disable_mibs_cache() -> + disable_mibs_cache(snmp_master_agent). + +disable_mibs_cache(Agent) -> + snmpa_agent:disable_mibs_cache(Agent). + + +gc_mibs_cache() -> + gc_mibs_cache(snmp_master_agent). + +gc_mibs_cache(Agent) when is_atom(Agent) orelse is_pid(Agent) -> + snmpa_agent:gc_mibs_cache(Agent); +gc_mibs_cache(Age) -> + gc_mibs_cache(snmp_master_agent, Age). + +gc_mibs_cache(Agent, Age) when is_atom(Agent) orelse is_pid(Agent) -> + snmpa_agent:gc_mibs_cache(Agent, Age); +gc_mibs_cache(Age, GcLimit) -> + gc_mibs_cache(snmp_master_agent, Age, GcLimit). + +gc_mibs_cache(Agent, Age, GcLimit) when is_atom(Agent) orelse is_pid(Agent) -> + snmpa_agent:gc_mibs_cache(Agent, Age, GcLimit). + + +enable_mibs_cache_autogc() -> + enable_mibs_cache_autogc(snmp_master_agent). + +enable_mibs_cache_autogc(Agent) -> + snmpa_agent:enable_mibs_cache_autogc(Agent). + + +disable_mibs_cache_autogc() -> + disable_mibs_cache_autogc(snmp_master_agent). + +disable_mibs_cache_autogc(Agent) -> + snmpa_agent:disable_mibs_cache_autogc(Agent). + + +update_mibs_cache_age(Age) -> + update_mibs_cache_age(snmp_master_agent, Age). + +update_mibs_cache_age(Agent, Age) -> + snmpa_agent:update_mibs_cache_age(Agent, Age). + + +update_mibs_cache_gclimit(GcLimit) -> + update_mibs_cache_age(snmp_master_agent, GcLimit). + +update_mibs_cache_gclimit(Agent, GcLimit) -> + snmpa_agent:update_mibs_cache_gclimit(Agent, GcLimit). + + + + +%% - message filter / load regulation + +register_notification_filter(Id, Mod, Data) when is_atom(Mod) -> + register_notification_filter(snmp_master_agent, Id, Mod, Data, last). + +register_notification_filter(Agent, Id, Mod, Data) + when is_atom(Agent) andalso is_atom(Mod) -> + register_notification_filter(Agent, Id, Mod, Data, last); +register_notification_filter(Agent, Id, Mod, Data) + when is_pid(Agent) andalso is_atom(Mod) -> + register_notification_filter(Agent, Id, Mod, Data, last); +register_notification_filter(Id, Mod, Data, Where) when is_atom(Mod) -> + register_notification_filter(snmp_master_agent, Id, Mod, Data, Where). + +register_notification_filter(Agent, Id, Mod, Data, Where) -> + snmpa_agent:register_notification_filter(Agent, Id, Mod, Data, Where). + +unregister_notification_filter(Id) -> + unregister_notification_filter(snmp_master_agent, Id). + +unregister_notification_filter(Agent, Id) -> + snmpa_agent:unregister_notification_filter(Agent, Id). + +which_notification_filter() -> + which_notification_filter(snmp_master_agent). + +which_notification_filter(Agent) -> + snmpa_agent:which_notification_filter(Agent). + + +get_request_limit() -> + get_request_limit(snmp_master_agent). +get_request_limit(Agent) -> + snmpa_agent:get_request_limit(Agent). + +set_request_limit(NewLimit) -> + set_request_limit(snmp_master_agent, NewLimit). +set_request_limit(Agent, NewLimit) -> + snmpa_agent:set_request_limit(Agent, NewLimit). + + +%% - + +send_notification(Agent, Notification, Recv) -> + send_notification(Agent, Notification, Recv, "", "", []). + +send_notification(Agent, Notification, Recv, Varbinds) -> + send_notification(Agent, Notification, Recv, "", "", Varbinds). + +send_notification(Agent, Notification, Recv, NotifyName, Varbinds) -> + send_notification(Agent, Notification, Recv, NotifyName, "", Varbinds). + +send_notification(Agent, Notification, Recv, + NotifyName, ContextName, Varbinds) + when (is_list(NotifyName) andalso + is_list(ContextName) andalso + is_list(Varbinds)) -> + snmpa_agent:send_trap(Agent, Notification, NotifyName, + ContextName, Recv, Varbinds). + +%% Kept for backwards compatibility +send_trap(Agent, Trap, Community) -> + send_notification(Agent, Trap, no_receiver, Community, "", []). + +send_trap(Agent, Trap, Community, Varbinds) -> + send_notification(Agent, Trap, no_receiver, Community, "", Varbinds). + + +%%%----------------------------------------------------------------- + +discovery(TargetName, Notification) -> + Varbinds = [], + discovery(TargetName, Notification, Varbinds). + +discovery(TargetName, Notification, Varbinds) when is_list(Varbinds) -> + ContextName = "", + discovery(TargetName, Notification, ContextName, Varbinds); +discovery(TargetName, Notification, DiscoHandler) + when is_atom(DiscoHandler) -> + Varbinds = [], + discovery(TargetName, Notification, Varbinds, DiscoHandler). + +discovery(TargetName, Notification, ContextName, Varbinds) + when is_list(Varbinds) -> + DiscoHandler = snmpa_discovery_handler_default, + discovery(TargetName, Notification, ContextName, Varbinds, + DiscoHandler); +discovery(TargetName, Notification, Varbinds, DiscoHandler) + when is_atom(DiscoHandler) -> + ContextName = "", + discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler). + +discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler) -> + ExtraInfo = ?EXTRA_INFO, + discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler, + ExtraInfo). + +discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler, + ExtraInfo) + when (is_list(TargetName) andalso (length(TargetName) > 0) andalso + is_atom(Notification) andalso + is_list(ContextName) andalso + is_list(Varbinds) andalso + is_atom(DiscoHandler)) -> + case (catch snmpa_discovery_handler:verify(DiscoHandler)) of + ok -> + snmpa_agent:discovery(TargetName, Notification, ContextName, + Varbinds, DiscoHandler, ExtraInfo); + Error -> + Error + end. + + +%%%----------------------------------------------------------------- + +register_subagent(Agent, SubTree, SubAgent) -> + snmpa_agent:register_subagent(Agent, SubTree, SubAgent). + +unregister_subagent(Agent, SubOidOrPid) -> + snmpa_agent:unregister_subagent(Agent, SubOidOrPid). + +system_start_time() -> + [{_, Time}] = ets:lookup(snmp_agent_table, system_start_time), + Time. + +sys_up_time() -> + % time in 0.01 seconds. + StartTime = system_start_time(), + (snmp_misc:now(cs) - StartTime) rem (2 bsl 31). + + +%%%----------------------------------------------------------------- + +restart_worker() -> + restart_worker(snmp_master_agent). + +restart_worker(Agent) -> + snmpa_agent:restart_worker(Agent). + + +restart_set_worker() -> + restart_set_worker(snmp_master_agent). + +restart_set_worker(Agent) -> + snmpa_agent:restart_set_worker(Agent). + + +%%%----------------------------------------------------------------- +%%% USM functions +%%%----------------------------------------------------------------- +passwd2localized_key(Alg, Passwd, EngineID) -> + snmp_usm:passwd2localized_key(Alg, Passwd, EngineID). + +localize_key(Alg, Key, EngineID) -> + snmp_usm:localize_key(Alg, Key, EngineID). + + +%%%----------------------------------------------------------------- +%%% Agent Capabilities functions +%%%----------------------------------------------------------------- +add_agent_caps(Oid, Descr) -> + snmp_standard_mib:add_agent_caps(Oid, Descr). + +del_agent_caps(Index) -> + snmp_standard_mib:del_agent_caps(Index). + +get_agent_caps() -> + snmp_standard_mib:get_agent_caps(). + + +%%%----------------------------------------------------------------- +%%% Audit Trail Log functions +%%%----------------------------------------------------------------- +log_to_txt(LogDir, Mibs) -> + OutFile = "snmpa_log.txt", + LogName = ?audit_trail_log_name, + LogFile = ?audit_trail_log_file, + snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile). +log_to_txt(LogDir, Mibs, OutFile) -> + LogName = ?audit_trail_log_name, + LogFile = ?audit_trail_log_file, + snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile). +log_to_txt(LogDir, Mibs, OutFile, LogName) -> + LogFile = ?audit_trail_log_file, + snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile). +log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile) -> + snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile). +log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start) -> + snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start). +log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start, Stop) -> + snmp:log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start, Stop). + + +change_log_size(NewSize) -> + LogName = ?audit_trail_log_name, % The old (agent) default + snmp:change_log_size(LogName, NewSize). + + +get_log_type() -> + get_log_type(snmp_master_agent). + +get_log_type(Agent) -> + snmpa_agent:get_log_type(Agent). + +%% NewType -> atl_type() +change_log_type(NewType) -> + set_log_type(NewType). + +change_log_type(Agent, NewType) -> + set_log_type(Agent, NewType). + +set_log_type(NewType) -> + set_log_type(snmp_master_agent, NewType). + +set_log_type(Agent, NewType) -> + snmpa_agent:set_log_type(Agent, NewType). |