檢視原始碼 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 中定義的受管理物件的符號名稱,而 Db
是 volatile
、persistent
或 mnesia
。如果是 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}]}}.
摘要
函式
取得 Name
的索引類型
從 Cols
中取得狀態欄位的值。
取得特定的表格資訊項目,或者,如果 Item
的值為 'all',則會改為傳回一個包含表格所有項目及其各自值的二元組清單(屬性清單)。
這是表格的預設儀器函式。
這是表格的預設儀器函式。
傳回一個清單,其中包含 Cols
中所有欄位的值。如果未定義欄位,則其值為 noinit
。
尋找表格中下一列的索引。RestOid
不必指定現有的列。
檢查表格中是否存在列。
將 Cols
中的元素設定到 RowIndex
指定的列。不對新值執行檢查。
這是變數的預設儀器函式。
這是具有操作的變數的預設儀器函式;is_set_ok | set | undo
。
取得變數的值。
為變數設定新值。如果變數不存在,則會建立該變數。不檢查新值的類型。
類型
-type column() :: pos_integer().
在 get 操作的情況下是欄位編號的清單,在 set 操作的情況下是欄位編號和值的清單。
-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
。
對於擴增表格,它會如下所示
index_types
- 值類型:{augments, {atom(), asn1_type()}}nbr_of_cols
- 值類型:pos_integer()not_accessible
- 值類型:[pos_integer()]first_accessible
- 值類型:pos_integer()
函式
-spec get_index_types(Name) -> IndexTypes when Name :: snmpa:name() | snmpa:name_db(), IndexTypes :: [snmp:asn1_type()].
取得 Name
的索引類型
此函式可用於儀器函式中,以檢索表格資訊的索引類型部分。
-spec get_status_col(Name, Cols) -> false | {value, StatusCol} when Name :: snmpa:name() | snmpa:name_db(), Cols :: columns(), StatusCol :: term().
從 Cols
中取得狀態欄位的值。
此函式可用於儀器函式中的 is_set_ok
、undo
或 set
,以檢查是否修改了表格的狀態欄位。
-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',則會改為傳回一個包含表格所有項目及其各自值的二元組清單(屬性清單)。
此函式可用於儀器函式中,以檢索表格資訊的指定部分。
-spec table_func(Op, NameDb) -> Return when Op :: new | delete, NameDb :: snmpa:name_db(), Return :: term().
這是表格的預設儀器函式。
- 如果表格不存在,則
new
操作會建立表格,但僅當資料庫是 SNMP 內部資料庫時才如此。 delete
操作不會從資料庫中刪除表格,因為卸載 MIB 並不一定表示應該銷毀表格。
如果管理員可以建立或刪除表格中的列,則必須有 RowStatus
欄位,以便 is_set_ok
、set
和 undo
正常運作。
此函式會根據儀器函式的規格傳回。
-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_ok
、set
和 undo
正常運作。
此函式會根據儀器函式的規格傳回。
-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
。
尋找表格中下一列的索引。RestOid
不必指定現有的列。
檢查表格中是否存在列。
將 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().
取得變數的值。
-spec variable_set(Name, Value) -> boolean() when Name :: snmpa:name() | snmpa:name_db(), Value :: term().
為變數設定新值。如果變數不存在,則會建立該變數。不檢查新值的類型。
如果 NameDb
引數指定不正確,則傳回 false
,否則傳回 true
。