首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

snmp_generic

模块

snmp_generic

模块摘要

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

描述

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

总体结构如下图所示:

代码语言:javascript
复制
         +---------------+
         |   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时没有名称,编译器会生成一个条目。

代码语言:javascript
复制
{myVar, {snmp_generic, variable_func, [{myVar, Db]}}.
    

对于一张表:

代码语言:javascript
复制
{myTable, {snmp_generic, table_func, [{myTable, Db]}}.
    

数据类型

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

代码语言:javascript
复制
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操作中执行了一些检查。

代码语言:javascript
复制
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文件看起来像:

代码语言:javascript
复制
{myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
    

扫码关注腾讯云开发者

领取腾讯云代金券