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
要么是volatile
,persistent
,或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_ok
,undo
或set
检查表的状态列是否被修改。
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,则设置的功能在事务中处理。
如果有可能的经理创建或删除表中的行,必须有一个RowStatus
列is_set_ok
,set
并undo
能正常工作。
该函数根据仪表功能的规格返回。
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/1
或mnesia: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}]}}.