查看源代码 SNMP 应用程序
描述
本章描述 OTP 中的 snmp
应用程序。SNMP 应用程序提供以下服务
- 一个多语言可扩展的 SNMP 代理
- 一个 SNMP 管理器
- 一个 MIB 编译器
配置
为 SNMP 应用程序定义了以下配置参数。有关配置参数的更多信息,请参阅 application(3)。
配置文件中指定配置参数的 snmp 部分基本上是以下元组
{snmp, snmp_components_config()}
一个用于启动同时具有管理器和代理的节点的最小配置文件
[{snmp,
[{agent, [{db_dir, "/tmp/snmp/agent/db"},
{config, [{dir, "/tmp/snmp/agent/conf"}]}]},
{manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
{db_dir, "/tmp/snmp/manager/db"}]}]}]}
]
}
].
每个 snmp 组件都有自己的一组配置参数,即使某些类型在两个组件中都是通用的。
snmp_components_config() -> [snmp_component_config()]
snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
agent_options() = [agent_option()]
agent_option() = {restart_type, restart_type()} |
{agent_type, agent_type()} |
{agent_verbosity, verbosity()} |
{discovery, agent_discovery()} |
{versions, versions()} |
{gb_max_vbs, gb_max_vbs()} |
{priority, priority()} |
{multi_threaded, multi_threaded()} |
{db_dir, db_dir()} |
{db_init_error, db_init_error()} |
{local_db, local_db()} |
{net_if, agent_net_if()} |
{mibs, mibs()} |
{mib_storage, mib_storage()} |
{mib_server, mib_server()} |
{audit_trail_log, audit_trail_log()} |
{error_report_mod, error_report_mod()} |
{note_store, note_store()} |
{symbolic_store, symbolic_store()} |
{target_cache, target_cache()} |
{config, agent_config()}
manager_options() = [manager_option()]
manager_option() = {restart_type, restart_type()} |
{net_if, manager_net_if()} |
{server, server()} |
{note_store, note_store()} |
{config, manager_config()} |
{inform_request_behaviour, manager_irb()} |
{mibs, manager_mibs()} |
{priority, priority()} |
{audit_trail_log, audit_trail_log()} |
{versions, versions()} |
{def_user_mod, def_user_module() |
{def_user_data, def_user_data()}
代理特定的配置选项和类型
agent_type() = master | sub <可选>
- 如果为master
,则启动一个主代理。否则,不启动任何代理。默认为
master
。agent_discovery() = [agent_discovery_opt()] <可选>
-agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}
terminating
选项影响由管理器发起的发现。originating
选项影响由此代理发起的发现。有关默认值,请参阅
agent_discovery_opt()
中的选项。agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <可选>
-agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}
这些是影响此代理中
terminating
发现的选项(即由管理器发起的)。terminating
发现选项的默认值为- enable:
true
- stage2:
discovery
- trigger_username:
""
- enable:
agent_originating_discovery_opts() = [agent_originating_discovery_opt()] <可选>
-agent_originating_discovery_opt() = {enable, boolean()}
这些是影响此代理中
originating
发现的选项。originating
发现选项的默认值为- enable:
true
- enable:
multi_threaded() = bool() | extended <可选>
- 如果为true
(或extended
),则代理是多线程的,每个 get 请求一个线程。值
extended
表示还会创建一个特殊的“进程”,旨在处理所有通知。true
- 一个工作线程专门用于“set 请求”,一个(主)工作线程用于所有其他请求(“get 请求”和通知)。如果“主”工作线程正忙,则会生成一个临时进程来处理该作业(“get 请求”或通知)。
extended
- 一个工作线程专门用于“set 请求”,一个工作线程专门用于通知,一个(主)工作线程用于所有“get 请求”。如果“主”工作线程正忙,则会生成一个临时进程来处理该“get 请求”。
注意
即使将多线程设置为
extended
,当发送需要响应的 inform 请求时,仍然存在“重新排序”的风险(因此可能需要重新发送)。此外,一旦数据包进入网络,当然无法保证顺序。
默认为
false
。db_dir() = string() <强制>
- 定义 SNMP 代理内部数据库文件的存储位置。gb_max_vbs() = pos_integer() | infinity <可选>
- 定义 Get-BULK 响应中允许的最大 varbind 数量。默认为
1000
。local_db() = [local_db_opt()] <可选>
-local_db_opt() = {repair, agent_repair()} | {auto_save, agent_auto_save()} | {verbosity, verbosity()}
定义 SNMP 代理本地数据库特定的选项。
有关默认值,请参阅
local_db_opt()
中的选项。agent_repair() = false | true | force <可选>
- 启动 snmpa_local_db 时,它始终尝试打开现有数据库。如果为false
,并且发生一些错误,则会创建一个新数据库。如果为true
,则将修复现有文件。如果为force
,即使表已正确关闭,也会修复表。默认为
true
。agent_auto_save() = integer() | infinity <可选>
- 自动保存间隔。只要在此时间内未访问表,就会将表刷新到磁盘。默认为
5000
。agent_net_if() = [agent_net_if_opt()] <可选>
-agent_net_if_opt() = {module, agent_net_if_module()} | {verbosity, verbosity()} | {options, agent_net_if_options()}
定义 SNMP 代理网络接口实体特定的选项。
有关默认值,请参阅
agent_net_if_opt()
中的选项。agent_net_if_module() = atom() <可选>
- 处理 SNMP 代理网络接口部分的模块。必须实现snmpa_network_interface
行为。默认为
snmpa_net_if
。agent_net_if_options() = [agent_net_if_option()] <可选>
-agent_net_if_option() = {bind_to, bind_to()} | {sndbuf, sndbuf()} | {recbuf, recbuf()} | {no_reuse, no_reuse()} | {req_limit, req_limit()} | {filter, agent_net_if_filter_options()} | {open_err_filters, agent_net_if_open_err_filters()} | {extra_sock_opts, extra_socket_options()} | {inet_backend, inet_backend()}
这些选项实际上是特定于所用模块的。此处显示的选项适用于默认的
agent_net_if_module()
。注意
如果用户配置了带有选项的传输,则这些选项将优先于这些选项。有关更多信息,请参阅代理信息。
有关默认值,请参阅
agent_net_if_option()
中的选项。req_limit() = integer() | infinity <可选>
- 代理处理的最大并发请求数。默认为
infinity
。agent_net_if_filter_options() = [agent_net_if_filter_option()] <可选>
-agent_net_if_filter_option() = {module, agent_net_if_filter_module()}
这些选项实际上是特定于所用模块的。此处显示的选项适用于默认的
agent_net_if_filter_module()
。有关默认值,请参阅
agent_net_if_filter_option()
中的选项。agent_net_if_filter_module() = atom() <可选>
- 处理 SNMP 代理网络接口筛选器部分的模块。必须实现snmpa_network_interface_filter
行为。默认为
snmpa_net_if_filter
。agent_net_if_open_err_filters() = [agent_net_if_open_err_filter()] <可选>
-agent_net_if_open_err_filter() = atom()
在代理初始化期间,将打开传输 UDP 套接字。如果此操作失败,则 net-if(和代理)将无法启动(崩溃)。此(筛选器)列表包含将使 net-if “正常”失败的错误(原因)。此(筛选器)列表应该包含 gen_udp:open/1,2 可以返回的错误(原因)。效果是,gen_udp:open 返回的任何在此列表中的错误都将被视为“非致命”,并且只会产生一条信息消息,而不是错误消息。Net If 和代理仍会崩溃,但会产生不那么令人反感的错误消息。
agent_mibs() = [string()] <可选>
- 指定一个 MIB 列表(包括路径),该列表定义哪些 MIB 最初加载到 SNMP 主代理中。请注意,始终会加载以下 mib
- 版本 v1:
STANDARD-MIB
- 版本 v2:
SNMPv2
- 版本 v3:
SNMPv2
、SNMP-FRAMEWORK-MIB
和SNMP-MPD-MIB
默认为
[]
。- 版本 v1:
mib_storage() = [mib_storage_opt()] <可选>
-mib_storage_opt() = {module, mib_storage_module()} | {options, mib_storage_options()}
此选项指定如何存储基本 mib 数据。snmp 代理的两个部分使用此选项:mib 服务器和符号存储。
默认为
[{module, snmpa_mib_storage_ets}]
。mib_storage_module() = snmpa_mib_data_ets | snmpa_mib_data_dets | snmpa_mib_data_mnesia | module()
- 将 SNMP 代理的 mib 存储模块定义为snmpa_mib_storage
行为所定义的。snmp 代理的几个实体(
mib-server
通过其数据模块和symbolic-store
)使用此选项来存储加载 mib 时检索的各种 mib 相关数据。代理提供了几种实现:
snmpa_mib_storage_ets
、snmpa_mib_storage_dets
和snmpa_mib_storage_mnesia
。默认模块是
snmpa_mib_storage_ets
。mib_storage_options() = list() <可选>
- 这是与实现相关的。也就是说,它取决于模块。对于每个模块,都有一组特定的有效选项。对于应用程序提供的模块,支持以下选项snmpa_mib_storage_ets
:{dir, filename()} | {action, keep | clear}, {checksum, boolean()}
dir
- 如果存在,则指向一个目录,在该目录中,所有 ets 表中的数据都将“同步”到一个文件中。此外,打开表时,会读取此文件(如果存在)。
默认情况下,这不会被使用。
action
- 指定找到非空文件时的行为:保留其内容或清除它。默认为
keep
。checksum
- 定义是否对文件进行校验和。默认为
false
。
snmpa_mib_storage_dets
:{dir, filename()} | {action, keep | clear}, {auto_save, default | pos_integer()} | {repair, force | boolean()}
dir
- 此强制性选项指向放置 dets 表文件的目录。action
- 指定找到非空文件时的行为:保留其内容或清除它。默认为
keep
。auto_save
- 定义 dets 自动保存频率。默认为
default
。repair
- 定义 dets 修复行为。默认为
false
。
snmpa_mib_storage_mnesia
:{action, keep | clear}, {nodes, [node()]}
action
- 指定当非空、已存在的表时的行为:保留其内容或清除它。默认为
keep
。nodes
- 一个节点名称列表(或描述节点列表的原子),用于定义在何处打开表。用户有责任确保 mnesia 实际上在指定的节点上运行。以下是可识别的不同值
[]
- 转换为自身节点的列表:[node()]
all
-erlang:nodes()
visible
-erlang:nodes(visible)
connected
-erlang:nodes(connected)
db_nodes
-mnesia:system_info(db_nodes)
默认值是调用
erlang:nodes()
的结果。
mib_server() = [mib_server_opt()] <optional>
-mib_server_opt() = {mibentry_override, mibentry_override()} | {trapentry_override, trapentry_override()} | {verbosity, verbosity()} | {cache, mibs_cache()} | {data_module, mib_server_data_module()}
定义 SNMP 代理 MIB 服务器的特定选项。
有关默认值,请参阅
mib_server_opt()
中的选项。mibentry_override() = bool() <optional>
- 如果此值为 false,则在加载 MIB 时,会在安装 MIB 之前检查每个 MIB 条目。检查的目的是防止同一个符号 MIB 条目名称用于不同的 OID。默认为
false
。trapentry_override() = bool() <optional>
- 如果此值为 false,则在加载 MIB 时,会在安装 MIB 之前检查每个 trap。检查的目的是防止同一个符号 trap 名称用于不同的 trap。默认为
false
。mib_server_data_module() = snmpa_mib_data_tttn | module() <optional>
- 定义 SNMP 代理 MIB 服务器的后端数据模块,如snmpa_mib_data
行为所定义。目前,代理只提供默认模块
snmpa_mib_data_tttn
。默认模块是
snmpa_mib_data_tttn
。mibs_cache() = bool() | mibs_cache_opts() <optional>
- 代理是否应使用 MIB 服务器查找缓存。默认值为
true
(在这种情况下,将应用mibs_cache_opts()
默认值)。mibs_cache_opts() = [mibs_cache_opt()] <optional>
-mibs_cache_opt() = {autogc, mibs_cache_autogc()} | {gclimit, mibs_cache_gclimit()} | {age, mibs_cache_age()}
定义 SNMP 代理 MIB 服务器缓存的特定选项。
有关默认值,请参阅
mibs_cache_opt()
中的选项。mibs_cache_autogc() = bool() <optional>
- 定义 MIB 服务器是否应自动执行缓存 GC,还是留给用户(请参阅 gc_mibs_cache/0,1,2,3)。默认为
true
。mibs_cache_age() = integer() > 0 <optional>
- 定义缓存中的条目在被 GC 之前允许存在的时间(假设执行 GC)。每次访问缓存中的条目时,都会“触摸”该条目。时间以毫秒为单位定义。
默认值为
10 分钟
。mibs_cache_gclimit() = infinity | integer() > 0 <optional>
- 执行 GC 时,这是将从缓存中删除的最大缓存条目数。可以设置限制的原因是,如果缓存很大,则 GC 可能会花费很长时间,在此期间代理会“忙碌”。但是,在负载很重的系统上,我们也可能会面临没有删除缓存中足够元素的风险,而是导致其随着时间的推移而增长。这就是默认值为
infinity
的原因,这将确保尽快删除所有候选者。默认为
infinity
。error_report_mod() = atom() <optional>
- 定义一个错误报告模块,实现snmpa_error_report
行为。工具包提供了两个模块:snmpa_error_logger
和snmpa_error_io
。默认值为
snmpa_error_logger
。symbolic_store() = [symbolic_store_opt()]
-symbolic_store_opt() = {verbosity, verbosity()}
定义 SNMP 代理符号存储的特定选项。
有关默认值,请参阅
symbolic_store_opt()
中的选项。target_cache() = [target_cache_opt()]
-target_cache_opt() = {verbosity, verbosity()}
定义 SNMP 代理目标缓存的特定选项。
有关默认值,请参阅
target_cache_opt()
中的选项。agent_config() = [agent_config_opt()] <mandatory>
-agent_config_opt() = {dir, agent_config_dir()} | {force_load, force_load()} | {verbosity, verbosity()}
定义 SNMP 代理的特定配置相关选项。
有关默认值,请参阅
agent_config_opt()
中的选项。agent_config_dir = dir() <mandatory>
- 定义存储 SNMP 代理配置文件的位置。force_load() = bool() <optional>
- 如果true
,则在启动期间重新读取配置文件,并忽略配置数据库的内容。因此,如果true
,则在代理重新启动时,对配置数据库的更改将丢失。默认为
false
。
管理器特定的配置选项和类型
server() = [server_opt()] <optional>
-server_opt() = {timeout, server_timeout()} | {verbosity, verbosity()} | {cbproxy, server_cbproxy()} | {netif_sup, server_nis()}
指定管理器服务器进程的选项。
默认值为
silence
。server_timeout() = integer() <optional>
- 异步请求清理时间。对于每个请求,都会在内部存储一些信息,以便能够将回复(当它到达时)传递到正确的目的地。如果回复到达,此信息将被删除。但是,如果没有回复(及时),则必须在超过最佳时间后删除信息。此清理将按server_timeout()
时间定义的定期时间间隔执行。该信息将具有一个最佳时间,该时间由调用请求函数时给定的Expire
时间定义(请参阅 async_get、async_get_next 和 async_set)。时间以毫秒为单位。
默认值为
30000
。server_cbproxy() = temporary (default) | permanent <optional>
- 此选项指定服务器将如何处理回调调用。temporary (default)
- 将为每个回调调用创建一个临时进程。permanent
- 使用此选项,服务器将创建一个永久(已命名)进程,该进程实际上会对所有回调调用进行序列化。
默认值为
temporary
。server_nis() = none (default) | {PingTO, PongTO} <optional>
- 此选项指定服务器是否应主动监视 net-if 进程。请注意,这仅在使用 net-if 进程实际支持该协议时才有效。有关更多信息,请参阅snmpm_network_interface
行为。none (default)
- 不主动监视 net-if 进程。{PingTO :: pos_integer(), PongTO :: pos_integer()}
-PingTO
时间指定在成功 ping(或启动)和将 ping 消息发送到 net-if 进程的时间之间(基本上是 ping 之间的时间)。PongTO
时间指定 net-if 进程使用 pong 消息响应 ping 消息的时间长度。当发送 ping 消息时,它开始计数。这两个时间都以毫秒为单位。
默认值为
none
。manager_config() = [manager_config_opt()] <mandatory>
-manager_config_opt() = {dir, manager_config_dir()} | {db_dir, manager_db_dir()} | {db_init_error, db_init_error()} | {repair, manager_repair()} | {auto_save, manager_auto_save()} | {verbosity, verbosity()}
定义 SNMP 管理器的特定配置相关选项。
有关默认值,请参阅
manager_config_opt()
中的选项。manager_config_dir = dir() <mandatory>
- 定义存储 SNMP 管理器配置文件的位置。manager_db_dir = dir() <mandatory>
- 定义 SNMP 管理器存储持久数据的位置。manager_repair() = false | true | force <optional>
- 定义持久数据库的修复选项(打开时是否以及如何修复表)。默认为
true
。manager_auto_save() = integer() | infinity <optional>
- 自动保存间隔。只要在此时间段内未访问表,表就会刷新到磁盘。默认为
5000
。manager_irb() = auto | user | {user, integer()} <optional>
- 此选项定义管理器将如何处理发送到接收到的 inform 请求的响应(确认)。auto
- 管理器将自主发送对 inform 请求消息的响应(确认)。{user, integer()}
- 当 handle_inform 函数完成时,管理器将发送对 inform 请求消息的响应(确认)。整数是管理器将认为存储的 inform 请求信息有效的毫秒时间。user
- 与{user, integer()}
相同,只是使用默认时间 15 秒 (15000)。
有关更多信息,请参阅
snmpm_network_interface
、handle_inform 和 管理器 net if 的定义。默认值为
auto
。manager_mibs() = [string()] <optional>
- 指定 MIB(包括路径)的列表,并定义哪些 MIB 最初加载到 SNMP 管理器中。默认为
[]
。manager_net_if() = [manager_net_if_opt()] <optional>
-manager_net_if_opt() = {module, manager_net_if_module()} | {verbosity, verbosity()} | {options, manager_net_if_options()}
定义 SNMP 管理器网络接口实体的特定选项。
有关默认值,请参阅
manager_net_if_opt()
中的选项。manager_net_if_options() = [manager_net_if_option()] <optional>
-manager_net_if_option() = {bind_to, bind_to()} | {sndbuf, sndbuf()} | {recbuf, recbuf()} | {no_reuse, no_reuse()} | {filter, manager_net_if_filter_options()} | {extra_sock_opts, extra_socket_options()}} | {inet_backend, inet_backend()}
这些选项实际上是特定于所用模块的。此处显示的选项适用于默认的
manager_net_if_module()
。有关默认值,请参阅
manager_net_if_option()
中的选项。manager_net_if_module() = atom() <optional>
- 该模块处理 SNMP 管理器的网络接口部分。它必须实现snmpm_network_interface
行为。默认值为
snmpm_net_if
。manager_net_if_filter_options() = [manager_net_if_filter_option()] <optional>
-manager_net_if_filter_option() = {module, manager_net_if_filter_module()}
这些选项实际上是特定于所用模块的。此处显示的选项适用于默认的
manager_net_if_filter_module()
。有关默认值,请参阅
manager_net_if_filter_option()
中的选项。manager_net_if_filter_module() = atom() <可选>
- 处理 SNMP 管理器的网络接口过滤部分的模块。必须实现snmpm_network_interface_filter
行为。默认值为
snmpm_net_if_filter
。def_user_module() = atom() <可选>
- 实现默认用户的模块。请参阅snmpm_user
行为。默认值为
snmpm_user_default
。def_user_data() = term() <可选>
- 默认用户的数据。在调用回调函数时传递给用户模块。默认值为
undefined
。
通用配置类型
restart_type() = permanent | transient | temporary
- 有关更多信息,请参阅 supervisor 文档。代理的默认值为
permanent
,管理器的默认值为transient
。db_init_error() = terminate | create | create_db_and_dir
- 定义如果代理或管理器无法打开现有数据库文件时应执行的操作。terminate
表示代理/管理器将终止,create
表示代理/管理器将删除错误的文件并创建新文件,而create_db_and_dir
表示代理/管理器将创建数据库文件以及数据库文件的任何缺失的父目录。默认值为
terminate
。priority() = atom() <可选>
- 定义所有 SNMP 进程的 Erlang 优先级。默认值为
normal
。versions() = [version()] <可选>
-version() = v1 | v2 | v3
应该接受/使用的 SNMP 版本。
默认值为
[v1,v2,v3]
。verbosity() = silence | info | log | debug | trace <可选>
- SNMP 进程的详细程度。这指定了打印多少调试信息。默认值为
silence
。bind_to() = bool() <可选>
- 如果为true
,net_if 将绑定到 IP 地址。如果为false
,net_if 将监听运行主机上的任何 IP 地址。默认为
false
。no_reuse() = bool() <可选>
- 如果为true
,net_if 不指定 IP 和端口地址应该是可重用的。如果为false
,该地址设置为可重用。默认为
false
。recbuf() = integer() <可选>
- 接收缓冲区大小。默认值由
gen_udp
定义。sndbuf() = integer() <可选>
- 发送缓冲区大小。默认值由
gen_udp
定义。extra_socket_options() = list() <可选>
- 任意套接字选项列表。此列表不由 snmp 检查(除了检查它是否是一个列表)。用户有责任确保这些是有效的选项,并且不与“普通”选项冲突。
默认为
[]
。inet_backend() = inet | socket <可选>
- 选择 inet-后端。此选项使可以使用不同的 inet-后端('inet' 或 'socket')的 net_if (gen_udp)。
默认值为
inet
。note_store() = [note_store_opt()] <可选>
-note_store_opt() = {timeout, note_store_timeout()} | {verbosity, verbosity()}
指定 SNMP 注释存储的启动详细程度。
有关默认值,请参阅
note_store_opt()
中的选项。note_store_timeout() = integer() <可选>
- 注释清理时间。当在注释存储中存储注释时,每个注释都会被赋予生命周期。每个timeout
注释存储进程都会执行 GC 以删除过期的注释。时间以毫秒为单位。默认值为
30000
。audit_trail_log() = [audit_trail_log_opt()] <可选>
-audit_trail_log_opt() = {type, atl_type()} | {dir, atl_dir()} | {size, atl_size()} | {repair, atl_repair()} | {seqno, atl_seqno()}
如果存在,此选项指定审计跟踪日志的选项。使用
disk_log
模块来维护一个环绕日志。如果存在,dir
和size
选项是强制性的。如果不存在,则不使用审计跟踪日志。
atl_type() = read | write | read_write <可选>
- 指定应使用哪种类型的审计跟踪日志。对于代理和管理器,类型的效果实际上是不同的。对于代理
- 如果指定了
write
,则仅记录设置请求。 - 如果指定了
read
,则仅记录获取请求。 - 如果
read_write
,则会记录所有请求。
对于管理器
- 如果指定了
write
,则仅记录已发送的消息。 - 如果指定了
read
,则仅记录已接收的消息。 - 如果
read_write
,则会记录传出和传入的消息。
默认值为
read_write
。- 如果指定了
atl_dir = dir() <强制>
- 指定应存储审计跟踪日志的位置。如果
audit_trail_log
指定应进行日志记录,则必须定义此参数。atl_size() = {integer(), integer()} <强制>
- 指定审计跟踪日志的大小。此参数将发送到disk_log
。如果
audit_trail_log
指定应进行日志记录,则必须定义此参数。atl_repair() = true | false | truncate | snmp_repair <可选>
- 指定在打开审计跟踪日志时是否以及如何修复它。除非此参数的值为snmp_repair
,否则它会发送到disk_log
。另一方面,如果该值为snmp_repair
,则 snmp 会尝试自行处理某些故障。即使它无法修复该文件,它也不会直接截断它,而是将其移到一旁以供以后脱机分析。默认为
true
。atl_seqno() = true | false <可选>
- 指定是否将审计跟踪日志条目进行(序列)编号。序列号的范围根据 RFC 5424,即 1 到 2147483647。默认为
false
。
另请参阅
application(3), disk_log(3)