安装net-snmp见:【snmp】centos6.5安装和配置snmp5.7.1
net-snmp添加自定义MIB(标量):【snmp】net-snmp添加自定义MIB(标量)
net-snmp添加自定义MIB(表格) 见:【snmp】net-snmp添加自定义MIB(表格)
一、编写MIB文件
-- -- MyTest-MIB.my -- MIB generated by MG-SOFT Visual MIB Builder Version 6.0 Build 88 -- Wednesday, August 05, 2020 at 16:51:00 -- MyTest-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.2020 myModule MODULE-IDENTITY LAST-UPDATED "202008051610Z" -- August 05, 2020 at 16:10 GMT ORGANIZATION "Organization." CONTACT-INFO "Contact-info." DESCRIPTION "Description." ::= { enterprises 2020 } -- -- Node definitions -- -- 1.3.6.1.4.1.2020.1 myOid OBJECT IDENTIFIER ::= { myModule 1 } -- 1.3.6.1.4.1.2020.1.1 myScalar OBJECT-TYPE SYNTAX DisplayString MAX-ACCESS read-write STATUS current DESCRIPTION "Description." ::= { myOid 1 } -- 1.3.6.1.4.1.2020.1.2 myTable OBJECT-TYPE SYNTAX SEQUENCE OF MyEntry MAX-ACCESS read-create --修改类型为read-create STATUS current DESCRIPTION "Description." ::= { myOid 2 } -- 1.3.6.1.4.1.2020.1.2.1 myEntry OBJECT-TYPE SYNTAX MyEntry MAX-ACCESS read-create --修改类型为read-create STATUS current DESCRIPTION "Description." INDEX { myIndex } ::= { myTable 1 } MyEntry ::= SEQUENCE { myIndex Integer32, mycol1 OCTET STRING, mycol2 Integer32, chrs RowStatus --修改类型为RowStatus } -- 1.3.6.1.4.1.2020.1.2.1.1 myIndex OBJECT-TYPE SYNTAX Integer32 (1..10000) MAX-ACCESS read-only --根据实际业务修改类型 STATUS current DESCRIPTION "Description." ::= { myEntry 1 } -- 1.3.6.1.4.1.2020.1.2.1.2 mycol1 OBJECT-TYPE SYNTAX OCTET STRING MAX-ACCESS read-write STATUS current DESCRIPTION "Description." ::= { myEntry 2 } -- 1.3.6.1.4.1.2020.1.2.1.3 mycol2 OBJECT-TYPE SYNTAX Integer32 MAX-ACCESS read-write STATUS current DESCRIPTION "Description." ::= { myEntry 3 } -- 1.3.6.1.4.1.2020.1.2.1.4 myrs OBJECT-TYPE SYNTAX RowStatus --修改为RowStatus MAX-ACCESS read-create STATUS current DESCRIPTION "Description." ::= { myEntry 4 } END -- -- MyTest-MIB.my --
二、使用mib2c命令生成.c和.h文件
2.1使用mib2c.scalar.conf :生成标量对象框架代码
env MIBS="+/usr/local/snmp/share/snmp/mibs/MyTest-MIB.txt" /usr/local/snmp/bin/mib2c -c mib2c.scalar.conf MyTest-MIB::myOid
以上命令执行完后会生成myOid.h和myOid.c文件
2.2使用mib2c.iterate.conf 或 mib2c.mfd.conf :生成表对象框架代码
env MIBS="+/usr/local/snmp/share/snmp/mibs/MyTest-MIB.txt" /usr/local/snmp/bin/mib2c -c mib2c.iterate.conf MyTest-MIB::myModule
以上命令执行完后会生成myModule.h和myModule.c文件
三、修改后的C文件
修改后的myOid.c文件内容如下,有中文注释的地方就是修改的地方
/* * 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 "myOid.h" /** Initializes the myOid module */ void init_myOid(void) { const oid myScalar_oid[] = { 1, 3, 6, 1, 4, 1, 2020, 1, 1 }; DEBUGMSGTL(("myOid", "Initializing ")); netsnmp_register_scalar(netsnmp_create_handler_registration ("myScalar", handle_myScalar, myScalar_oid, OID_LENGTH(myScalar_oid), HANDLER_CAN_RWRITE)); } /**定义一个变量*/ static char buff[256]=""; int handle_myScalar(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests) { int ret; /* * We are never called for a GETNEXT if it's registered as a * "instance", as it's "magically" handled for us. */ /* * a instance handler also only hands us one request at a time, so * we don't need to loop over a list of requests; we'll only get one. */ switch (reqinfo->mode) { case MODE_GET: snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR, buff, //定义的变量名称buff strlen(buff) //buff的长度 ); break; /* * SET REQUEST * * multiple states in the transaction. See: * http://www.net-snmp.org/tutorial-5/toolkit/mib_module/set-actions.jpg */ case MODE_SET_RESERVE1: /* * or you could use netsnmp_check_vb_type_and_size instead */ ret = netsnmp_check_vb_type(requests->requestvb, ASN_OCTET_STR); if (ret != SNMP_ERR_NOERROR) { netsnmp_set_request_error(reqinfo, requests, ret); } break; case MODE_SET_RESERVE2: /* * XXX malloc "undo" storage buffer */ if ( 0/* XXX if malloc, or whatever, failed: */ ) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_RESOURCEUNAVAILABLE); } break; case MODE_SET_FREE: /* * XXX: free resources allocated in RESERVE1 and/or * RESERVE2. Something failed somewhere, and the states * below won't be called. */ break; case MODE_SET_ACTION: /* * XXX: perform the value change here */ if ( 0/* XXX: error? */ ) { netsnmp_set_request_error(reqinfo, requests, 0/* some error */ ); } break; case MODE_SET_COMMIT: /* * XXX: delete temporary storage */ memcpy(buff,requests->requestvb->buf,requests->requestvb->val_len); // 赋值 buff[requests->requestvb->val_len] ='