非常教程

Erlang 20参考手册

snmp

snmp_generic

模块

snmp_generic

模块摘要

在数据库中实现SNMP对象的通用函数

描述

该模块snmp_generic包含通用函数,用于使用SNMP内置数据库或Mnesia实现表(和变量)。如果没有为MIB中的管理对象提供检测功能,则使用这些默认功能。有时,可能需要自定义默认功能的行为。例如,在某些情况下,如果某行被删除或修改,或者某些硬件要在信息发生更改时被通知,则应发送陷阱。

总体结构如下图所示:

         +---------------+
         |   SNMP Agent  |
         +- - - - - - - -+
         |      MIB      |
         +---------------+
                 |
         Association file       (associates a MIB object with
                 |               snmp_generic:table_funct
                 |               snmp_generic:variable_func)
+--------------------------------------+
|           snmp_generic               |  Support for get-next,
|                                      |  RowStatus operations
+----------------------+---------------+
|    snmpa_local_db    |    Mnesia     |  Database
+--------------+-------+---------------+
|     dets     |  ets  | 
| (persistent) |       | 
+--------------+-------+     

每个函数都使用参数NameDb(它是一个元组{Name, Db})来确定函数应该使用哪个数据库。Name是如在MIB中定义的管理对象的符号名称,并且Db要么是volatilepersistent,或mnesia。如果是mnesia,则所有变量都存储在Mnesia表中snmp_variables,该表必须是具有两个属性(不是Mnesia SNMP表)的表。SNMP表存储在Mnesia表中,其名称与SNMP表相同。所有函数都假定Mnesia表存在正确的名称和属性。确保这一点是程序员的责任。具体来说,如果变量存储在Mnesia中,则表格snmp_variables必须由程序员创建。该表的记录定义在文件中定义snmp/include/snmp_types.hrl.

如果变量的关联文件中的检测函数在myVar编译MIB时没有名称,编译器会生成一个条目。

{myVar, {snmp_generic, variable_func, [{myVar, Db]}}.
    

对于一张表:

{myTable, {snmp_generic, table_func, [{myTable, Db]}}.
    

数据类型

在下面定义的函数中,使用了以下类型:

name_db() = {name(), db()} 
name() = atom()
db() = volatile | persistent | mnesia
row_index() = [int()]
columns() = [column()] | [{column(), value()}]
column() = int()
value() = term()
    

row_index()

表示指定表中行的索引的OID的最后部分(有关INDEX的更多信息,请参阅RFC1212,4.1.6)。

columns()

get操作情况下的列编号列表,以及操作情况下的列编号和值列表set

输出

get_status_col(Name, Cols)get_status_col(NameDb, Cols) -> {ok, StatusVal} | false

类型

从中获取状态列的值Cols

该函数可用于检测仪表功能is_set_okundoset检查表的状态列是否被修改。

get_index_types(Name)

类型

获取 Name索引类型

该功能可用于检测功能来检索表格信息的索引类型部分。

get_table_info(Name, Item) -> table_info_result()

类型

获取特定的表信息项,或者如果Item具有该值all,则返回包含所有项及其给定表的响应值的两个元组列表(属性列表)。

此函数可用于检测函数以检索表信息的给定部分。

table_func(Op1, NameDb)table_func(Op2, RowIndex, Cols, NameDb) -> Ret

类型

这是表的默认检测函数。

  • 如果该表不存在,则新函数会创建该表,但仅当该数据库是SNMP内部数据库时才会创建该表。
  • delete函数不会从数据库中删除该表,因为卸载MIB并不一定意味着该表应该被销毁。
  • is_set_ok函数检查是否存在要修改或删除的行,并且要创建的行不存在。
  • undo功能什么都不做。
  • set函数检查它是否有足够的信息使该行从其状态notReady变为notInService(当行已被设置为createAndWait)时。如果一行设置为createAndWait,则没有值的列设置为noinit。如果使用Mnesia,则设置的功能在事务中处理。

如果有可能的经理创建或删除表中的行,必须有一个RowStatusis_set_oksetundo能正常工作。

该函数根据仪表功能的规格返回。

table_get_elements(NameDb, RowIndex, Cols) -> Values

类型

返回包含所有列的值的列表Cols。如果列未定义,则其值为noinit

table_next(NameDb, RestOid) -> RowIndex | endOfTable

类型

查找表中下一行的索引。RestOid不必指定现有的行。

table_row_exists(NameDb, RowIndex) -> bool()

类型

检查表中是否存在行。

table_set_elements(NameDb, RowIndex, Cols) -> bool()

类型

将元素设置Cols到由指定的行中RowIndex。不对新值执行检查。

如果使用Mnesia数据库,则此函数调用mnesia:write以存储值。这意味着此函数必须从事务(mnesia:transaction/1mnesia:dirty/1)中调用。

variable_func(Op1, NameDb)variable_func(Op2, Val, NameDb) -> Ret

类型

这是变量的默认检测函数。

new函数使用MIB中定义的默认值或零值(取决于类型)在数据库中创建一个新变量。

delete函数不会从数据库中删除该变量。

该函数根据仪表功能的规格返回。

variable_get(NameDb) -> {value, Value} | undefined

类型

获取变量的值。

variable_set(NameDb, NewVal) -> true | false

类型

为变量设置一个新值。如果该变量不存在,则创建该变量。没有检查新值的类型。

如果NameDb参数被错误地指定,则返回false,否则返回true。

以下示例显示了存储在Mnesia中的表的实现,但在set-request操作中执行了一些检查。

myTable_func(new, NameDb) ->   % pass unchanged
  snmp_generic:table_func(new, NameDb).

myTable_func(delete, NameDb) ->   % pass unchanged
  snmp_generic:table_func(delete, NameDb).

%% change row
myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
  case snmp_generic:table_func(is_set_ok, RowIndex,
                               Cols, NameDb) of
    {noError, 0} -> 
      myApplication:is_set_ok(RowIndex, Cols);
    Err ->
      Err
  end;

myTable_func(set, RowIndex, Cols, NameDb) ->
  case snmp_generic:table_func(set, RowIndex, Cols,
                               NameDb),
    {noError, 0} ->
      % Now the row is updated, tell the application
      myApplication:update(RowIndex, Cols);
    Err ->
      Err
  end;

myTable_func(Op, RowIndex, Cols, NameDb) ->   % pass unchanged
  snmp_generic:table_func(Op, RowIndex, Cols, NameDb).
    

.funcs文件看起来像:

{myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
    

snmp相关

1.1. SNMP简介 | 1. SNMP Introduction
2.2.代理功能描述 | 2. Agent Functional Description
3.3.管理功能描述 | 3. Manager Functional Description
4.4. MIB编译器 | 4. The MIB Compiler
5.5.运行应用程序 | 5. Running the application
6.6.代理配置文件的定义 | 6. Definition of Agent Configuration Files
7.7. Manager配置文件的定义 | 7. Definition of Manager Configuration Files
8.8.代理实现示例 | 8. Agent Implementation Example
9.9.管理实施例 | 9. Manager Implementation Example
10.10.检测函数 | 10. Instrumentation Functions
11.检测函数的定义 | 11. Definition of Instrumentation Functions
12.Net if的定义 | 12. Definition of Agent Net if
13.管理Netif 的定义 | 13. Definition of Manager Net if
14.14.审计跟踪日志 | 14. Audit Trail Log
15.15.高级代理主题 | 15. Advanced Agent Topics
16.16. SNMP Appendix A
17.17. SNMP Appendix B
18.snmp
19.snmpa
20.snmpa_conf
21.snmpa_discovery_handler
22.snmpa_error
23.snmpa_error_io
24.snmpa_error_logger
25.snmpa_error_report
26.snmpa_local_db
27.snmpa_mib_data
28.snmpa_mib_storage
29.snmpa_mpd
30.snmpa_network_interface
31.snmpa_network_interface_filter
32.snmpa_notification_delivery_info_receiver
33.snmpa_notification_filter
34.snmpa_supervisor
35.snmpc
36.snmpm
37.snmpm_conf
38.snmpm_mpd
39.snmpm_network_interface
40.snmpm_network_interface_filter
41.snmpm_user
42.snmp_community_mib
43.snmp_framework_mib
44.snmp_index
45.snmp_notification_mib
46.snmp_pdus
47.snmp_standard_mib
48.snmp_target_mib
49.snmp_user_based_sm_mib
50.snmp_view_based_acm_mib
Erlang 20

Erlang 是一种通用的面向并发的编程语言,可应付大规模开发活动的程序设计语言和运行环境。

主页 https://www.erlang.org/
源码 https://github.com/erlang/otp
版本 20
发布版本 20.1