linux net-snmp(之mib2c工具生成表格代码)

这篇博客介绍了如何利用net-snmp的mib2c工具生成SNMP表格代码,并详细说明了如何通过RowStatus进行增删改查操作。通过创建MIB文件,修改MIB内容,使用mib2c命令生成代码,然后编译安装,最后通过snmpset和snmpwalk命令进行测试。
摘要由CSDN通过智能技术生成

-------------------------------------------------禁止转载-------------------------------------------------
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)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值