-------------------------------------------------禁止转载-------------------------------------------------
snmp table的讲解可以看此博文:http://blog.chinaunix.net/uid-9384864-id-8746.html
snmp 表格支持增删改查操作,比标量节点多了增删操作,那么为了实现增删操作,可以向表格增加一个RowStatus行状态类型的列,通过设置状态值对表格进行控制。
RowStatus状态值
-active(1):表明状态行是可用的
-notInService(2):表明行存在但不可用
-notReady (3):表明存在,但因为缺少必要的信息而不能用
-createAndGo (4):由管理者设置,表明希望创建一个行并设置该行的状态列对象为active
-createAndWait(5):由管理者设置,表明希望创建一个行,但不可用,从上面的代码看到,是被设置为了notInService
-destroy(6):删除行
使用MIB builder创建一个表格MIB
注意要将一个节点添加为index列并且这个节点的名称不能为index,会报错;一般会设置最后一列为RowStatus列,表的各个节点均设置为read-create类型否则会报错,但实际使用时除了RowStatus对应的节点需要设置read-create,其他节点可以随便设置,后面我们会修改生成的MIB文件:
下面是生成的TEST-TABLE-MIB.my文件内容:
--
-- TEST-TABLE-MIB.my
-- MIB generated by MG-SOFT Visual MIB Builder Version 6.0 Build 88
-- Wednesday, April 15, 2020 at 15:51:29
--
TEST-TABLE-MIB DEFINITIONS ::= BEGIN
IMPORTS
OBJECT-GROUP
FROM SNMPv2-CONF
enterprises, Integer32, Unsigned32, OBJECT-TYPE, MODULE-IDENTITY
FROM SNMPv2-SMI;
-- 1.3.6.1.4.1.1
a MODULE-IDENTITY
LAST-UPDATED "202004151540Z" -- April 15, 2020 at 15:40 GMT
ORGANIZATION
"Organization."
CONTACT-INFO
"Contact-info."
DESCRIPTION
"Description."
::= {
enterprises 1 }
--
-- Node definitions
--
-- 1.3.6.1.4.1.1.1
b OBJECT IDENTIFIER ::= {
a 1 }
-- 1.3.6.1.4.1.1.1.5
testTable OBJECT-TYPE
SYNTAX SEQUENCE OF TestEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Description."
::= {
b 5 }
-- 1.3.6.1.4.1.1.1.5.1
testEntry OBJECT-TYPE
SYNTAX TestEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Description."
INDEX {
idx }
::= {
testTable 1 }
TestEntry ::=
SEQUENCE {
idx
Unsigned32,
content
OCTET STRING,
rs
Integer32
}
-- 1.3.6.1.4.1.1.1.5.1.1
idx OBJECT-TYPE
SYNTAX Unsigned32 (1..100)
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"Description."
::= {
testEntry 1 }
-- 1.3.6.1.4.1.1.1.5.1.2
content OBJECT-TYPE
SYNTAX OCTET STRING
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"Description."
::= {
testEntry 2 }
-- 1.3.6.1.4.1.1.1.5.1.3
rs OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"Description."
::= {
testEntry 3 }
-- 1.3.6.1.4.1.1.1.6
node7 OBJECT-GROUP
OBJECTS {
content, rs, idx }
STATUS current
DESCRIPTION
"Description."
::= {
b 6 }
END
--
-- TEST-TABLE-MIB.my
--
修改后的MIB文件,有中文注释是修改的地方:
--
-- TEST-TABLE-MIB.my
-- MIB generated by MG-SOFT Visual MIB Builder Version 6.0 Build 88
-- Wednesday, April 15, 2020 at 15:51:29
--
TEST-TABLE-MIB DEFINITIONS ::= BEGIN
IMPORTS
OBJECT-GROUP
FROM SNMPv2-CONF
enterprises, Integer32, Unsigned32, OBJECT-TYPE, MODULE-IDENTITY
FROM SNMPv2-SMI
DisplayString, RowStatus --增加这一行
FROM SNMPv2-TC; --增加这一行
-- 1.3.6.1.4.1.1
a MODULE-IDENTITY
LAST-UPDATED "202004151540Z" -- April 15, 2020 at 15:40 GMT
ORGANIZATION
"Organization."
CONTACT-INFO
"Contact-info."
DESCRIPTION
"Description."
::= {
enterprises 1 }
--
-- Node definitions
--
-- 1.3.6.1.4.1.1.1
b OBJECT IDENTIFIER ::= {
a 1 }
-- 1.3.6.1.4.1.1.1.5
testTable OBJECT-TYPE
SYNTAX SEQUENCE OF TestEntry
MAX-ACCESS read-create --修改类型为read-create
STATUS current
DESCRIPTION
"Description."
::= {
b 5 }
-- 1.3.6.1.4.1.1.1.5.1
testEntry OBJECT-TYPE
SYNTAX TestEntry
MAX-ACCESS read-create --修改类型为read-create
STATUS current
DESCRIPTION
"Description."
INDEX {
idx }
::= {
testTable 1 }
TestEntry ::=
SEQUENCE {
idx
Unsigned32,
content
OCTET STRING,
rs
RowStatus --修改类型为RowStatus
}
-- 1.3.6.1.4.1.1.1.5.1.1
idx OBJECT-TYPE
SYNTAX Unsigned32 (1..100)
MAX-ACCESS read-only --根据实际业务修改类型
STATUS current
DESCRIPTION
"Description."
::= {
testEntry 1 }
-- 1.3.6.1.4.1.1.1.5.1.2
content OBJECT-TYPE
SYNTAX OCTET STRING
MAX-ACCESS read-write --根据实际业务修改类型
STATUS current
DESCRIPTION
"Description."
::= {
testEntry 2 }
-- 1.3.6.1.4.1.1.1.5.1.3
rs OBJECT-TYPE
SYNTAX RowStatus --修改为RowStatus
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"Description."
::= {
testEntry 3 }
-- OBJECT-GROUP可以不要
-- 1.3.6.1.4.1.1.1.6
--node7 OBJECT-GROUP
-- OBJECTS {
content, rs, idx }
-- STATUS current
-- DESCRIPTION
-- "Description."
-- ::= {
b 6 }
END
--
-- TEST-TABLE-MIB.my
--
放到/usr/local/snmp/share/snmp/mibs/目录下,使用“sudo /usr/local/snmp/bin/snmptranslate -Tp -IR XXX-MIB::节点”,查看文件格式是否正确,可以看到rs节点(也就是RowStatus列)所支持的状态值:
使用mib2c工具生成代码
使用命令:env MIBS="+/usr/local/snmp/share/snmp/mibs/XXX-MIB.my" /usr/local/snmp/bin/mib2c -c mib2c.iterate.conf XXX-MIB::节点
注意比生成标量节点代码的命令多了-c mib2c.iterate.conf参数
根据各自情况选择对应选项,这里选择1
生成的原代码:
/*
* Note: this file originally auto-generated by mib2c using
* $
*/
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "testTable.h"
/** Initializes the testTable module */
void
init_testTable(void)
{
/* here we initialize all the tables we're planning on supporting */
initialize_table_testTable();
}
# Determine the first/last column names
/** Initialize the testTable table by defining its contents and how it's structured */
void
initialize_table_testTable(void)
{
const oid testTable_oid[] = {
1,3,6,1,4,1,1,1,5};
const size_t testTable_oid_len = OID_LENGTH(testTable_oid);
netsnmp_handler_registration *reg;
netsnmp_iterator_info *iinfo;
netsnmp_table_registration_info *table_info;
DEBUGMSGTL(("testTable:init", "initializing table testTable\n"));
reg = netsnmp_create_handler_registration(
"testTable", testTable_handler,
testTable_oid, testTable_oid_len,
HANDLER_CAN_RWRITE
);
table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
netsnmp_table_helper_add_indexes(table_info,
ASN_UNSIGNED, /* index: idx */
0);
table_info->min_column = COLUMN_IDX;
table_info->max_column = COLUMN_RS;
iinfo = SNMP_MALLOC_TYPEDEF( netsnmp_iterator_info );
iinfo->get_first_data_point = testTable_get_first_data_point;
iinfo->get_next_data_point = testTable_get_next_data_point;
iinfo->table_reginfo = table_info;
netsnmp_register_table_iterator( reg, iinfo );
netsnmp_inject_handler_before( reg,
netsnmp_get_cache_handler(TESTTABLE_TIMEOUT,
testTable_load, testTable_free,
testTable_oid, testTable_oid_len)