Erlang 20

snmp_generic

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}]}}.