檢視原始碼 snmp_generic (snmp v5.18)

在資料庫中實作 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 中定義的受管理物件的符號名稱,而 Dbvolatilepersistentmnesia。如果是 mnesia,則所有變數都儲存在 Mnesia 表格 snmp_variables 中,該表格必須是具有兩個屬性的表格(不是 Mnesia SNMP 表格)。SNMP 表格儲存在與 SNMP 表格名稱相同的 Mnesia 表格中。所有函式都假設存在具有正確名稱和屬性的 Mnesia 表格。確保這一點是程式設計人員的責任。特別是,如果變數儲存在 Mnesia 中,則程式設計人員必須建立表格 snmp_variables。此表格的記錄定義在檔案 snmp/include/snmp_types.hrl 中定義。

如果在編譯 MIB 時,變數 myVar 的關聯檔案中的儀器函式沒有名稱,則編譯器會產生一個條目。

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

對於表格

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

範例

以下範例顯示了儲存在 Mnesia 中的表格的實作,但在設定請求操作時會執行一些檢查。

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

摘要

類型

在 get 操作的情況下是欄位編號的清單,在 set 操作的情況下是欄位編號和值的清單。

對於普通表格,類型如下

函式

取得 Name 的索引類型

Cols 中取得狀態欄位的值。

取得特定的表格資訊項目,或者,如果 Item 的值為 'all',則會改為傳回一個包含表格所有項目及其各自值的二元組清單(屬性清單)。

這是表格的預設儀器函式。

這是表格的預設儀器函式。

傳回一個清單,其中包含 Cols 中所有欄位的值。如果未定義欄位,則其值為 noinit

尋找表格中下一列的索引。RestOid 不必指定現有的列。

檢查表格中是否存在列。

Cols 中的元素設定到 RowIndex 指定的列。不對新值執行檢查。

這是變數的預設儀器函式。

這是具有操作的變數的預設儀器函式;is_set_ok | set | undo

取得變數的值。

為變數設定新值。如果變數不存在,則會建立該變數。不檢查新值的類型。

類型

-type column() :: pos_integer().
-type columns() :: [column()] | [{column(), Value :: term()}].

在 get 操作的情況下是欄位編號的清單,在 set 操作的情況下是欄位編號和值的清單。

連結到此類型

table_info_item()

檢視原始碼 (未匯出)
-type table_info_item() ::
          nbr_of_cols | defvals | status_col | not_accessible | index_types | first_accessible |
          first_own_index.

對於普通表格,類型如下

  • nbr_of_cols - 欄位的數量。

    值類型:pos_integer()

  • defvals - 預設值的清單,依欄位排序。

    值類型:[{Col :: pos_integer(), DefVal :: term()}]

  • status_col - 狀態欄位的欄位編號。

    值類型:pos_integer()

  • not_accessible - 依序排列的 'not-accessible' 欄位清單(> first_accessible)。

    值類型:[pos_integer()]

  • index_types - 索引欄位的 asn1_type() 清單,依欄位編號排序,或 “augment” 元組(請參閱下方)。

    值類型:[asn1_type()]

  • first_accessible - 第一個可存取的欄位。

    值類型:pos_integer()

  • first_own_index - 第一個自有索引的欄位編號。如果此表格沒有此類索引,則將為 0

    值類型:non_neg_integer()

對於擴增表格,它會如下所示

函式

-spec get_index_types(Name) -> IndexTypes
                         when Name :: snmpa:name() | snmpa:name_db(), IndexTypes :: [snmp:asn1_type()].

取得 Name 的索引類型

此函式可用於儀器函式中,以檢索表格資訊的索引類型部分。

連結到此函式

get_status_col(Name, Cols)

檢視原始碼
-spec get_status_col(Name, Cols) -> false | {value, StatusCol}
                        when
                            Name :: snmpa:name() | snmpa:name_db(),
                            Cols :: columns(),
                            StatusCol :: term().

Cols 中取得狀態欄位的值。

此函式可用於儀器函式中的 is_set_okundoset,以檢查是否修改了表格的狀態欄位。

連結到此函式

get_table_info/2

檢視原始碼 (自 OTP R15B01 起)
-spec get_table_info(Name, Item :: nbr_of_cols) -> Result
                        when Name :: snmpa:name() | snmpa:name_db(), Result :: pos_integer();
                    (Name, Item :: defvals) -> Result
                        when
                            Name :: snmpa:name() | snmpa:name_db(),
                            Result :: [{Col, DefVal}],
                            Col :: pos_integer(),
                            DefVal :: term();
                    (Name, Item :: status_col) -> Result
                        when Name :: snmpa:name() | snmpa:name_db(), Result :: pos_integer();
                    (Name, Item :: not_accessible) -> Result
                        when Name :: snmpa:name() | snmpa:name_db(), Result :: [pos_integer()];
                    (Name, Item :: index_types) -> Result
                        when Name :: snmpa:name() | snmpa:name_db(), Result :: [snmp:asn1_type()];
                    (Name, Item :: first_accessible) -> Result
                        when Name :: snmpa:name() | snmpa:name_db(), Result :: pos_integer();
                    (Name, Item :: first_own_index) -> Result
                        when Name :: snmpa:name() | snmpa:name_db(), Result :: non_neg_integer();
                    (Name, Item :: all) -> Result
                        when
                            Name :: snmpa:name() | snmpa:name_db(),
                            Result :: [{table_info_item(), term()}].

取得特定的表格資訊項目,或者,如果 Item 的值為 'all',則會改為傳回一個包含表格所有項目及其各自值的二元組清單(屬性清單)。

此函式可用於儀器函式中,以檢索表格資訊的指定部分。

連結到此函式

table_func(Op, NameDb)

檢視原始碼
-spec table_func(Op, NameDb) -> Return
                    when Op :: new | delete, NameDb :: snmpa:name_db(), Return :: term().

這是表格的預設儀器函式。

  • 如果表格不存在,則 new 操作會建立表格,但僅當資料庫是 SNMP 內部資料庫時才如此。
  • delete 操作不會從資料庫中刪除表格,因為卸載 MIB 並不一定表示應該銷毀表格。

如果管理員可以建立或刪除表格中的列,則必須有 RowStatus 欄位,以便 is_set_oksetundo 正常運作。

此函式會根據儀器函式的規格傳回。

連結到此函式

table_func(Op, RowIndex, Cols, NameDb)

檢視原始碼
-spec table_func(Op, RowIndex, Cols, NameDb) -> Return
                    when
                        Op :: get | next | is_set_ok | set | undo,
                        RowIndex :: snmp:row_index(),
                        Cols :: columns(),
                        NameDb :: snmpa:name_db(),
                        Return :: term().

這是表格的預設儀器函式。

  • is_set_ok 操作會檢查要修改或刪除的列是否存在,以及要建立的列是否不存在。
  • undo 操作不執行任何操作。
  • set 操作會檢查是否有足夠的資訊將列的狀態從 notReady 變更為 notInService(當列已設定為 createAndWait 時)。如果將列設定為 createAndWait,則沒有值的欄位會設定為 noinit。如果使用 Mnesia,則設定功能會在交易中處理。

如果管理員可以建立或刪除表格中的列,則必須有 RowStatus 欄位,以便 is_set_oksetundo 正常運作。

此函式會根據儀器函式的規格傳回。

連結到此函式

table_get_elements(NameDb, RowIndex, Cols)

檢視原始碼
-spec table_get_elements(NameDb, RowIndex, Cols) -> Values
                            when
                                NameDb :: snmpa:name_db(),
                                RowIndex :: snmp:row_index(),
                                Cols :: columns(),
                                Values :: [noinit | Value],
                                Value :: term().

傳回一個清單,其中包含 Cols 中所有欄位的值。如果未定義欄位,則其值為 noinit

連結到此函式

table_next(NameDb, RestOid)

檢視原始碼

尋找表格中下一列的索引。RestOid 不必指定現有的列。

連結到此函式

table_row_exists(NameDb, RowIndex)

檢視原始碼

檢查表格中是否存在列。

連結到此函式

table_set_elements(NameDb, RowIndex, Cols)

檢視原始碼

Cols 中的元素設定到 RowIndex 指定的列。不對新值執行檢查。

如果使用 Mnesia 資料庫,此函式會呼叫 mnesia:write 來儲存值。這表示必須從交易中呼叫此函式 (mnesia:transaction/1)。

-spec variable_func(Op :: new, Name) -> Result
                       when Name :: snmpa:name() | snmpa:name_db(), Result :: ok | boolean();
                   (Op :: delete, Name) -> Result
                       when Name :: snmpa:name() | snmpa:name_db(), Result :: ok;
                   (Op :: get, Name) -> Result
                       when
                           Name :: snmpa:name() | snmpa:name_db(),
                           Result :: {value, Value} | genErr,
                           Value :: term().

這是變數的預設儀器函式。

  • new 操作會在資料庫中建立一個新的變數,其預設值如 MIB 中定義,或零值(取決於類型)。
  • delete 函式不會從資料庫中刪除變數。

此函式會根據儀器函式的規格傳回。

-spec variable_func(Op :: is_set_ok, Value, Name) -> Result
                       when Value :: term(), Name :: snmpa:name() | snmpa:name_db(), Result :: noError;
                   (Op :: set, Value, Name) -> Result
                       when
                           Value :: term(),
                           Name :: snmpa:name() | snmpa:name_db(),
                           Result :: noError | commitFailed;
                   (Op :: undo, Value, Name) -> Result
                       when Value :: term(), Name :: snmpa:name() | snmpa:name_db(), Result :: noError.

這是具有操作的變數的預設儀器函式;is_set_ok | set | undo

  • is_set_ok 操作不執行任何操作。
  • 如果成功,set 操作會傳回 noError,否則傳回 commitFailed
  • undo 操作不執行任何操作。

此函式會根據儀器函式的規格傳回。

-spec variable_get(Name) -> {value, Value} | undefined
                      when Name :: snmpa:name() | snmpa:name_db(), Value :: term().

取得變數的值。

連結到此函式

variable_set(Name, Value)

檢視原始碼
-spec variable_set(Name, Value) -> boolean()
                      when Name :: snmpa:name() | snmpa:name_db(), Value :: term().

為變數設定新值。如果變數不存在,則會建立該變數。不檢查新值的類型。

如果 NameDb 引數指定不正確,則傳回 false,否則傳回 true