【snmp】net-snmp添加自定义MIB(标量和表格)

安装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

【snmp】net-snmp添加自定义MIB(标量和表格)

以上命令执行完后会生成myOid.hmyOid.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

【snmp】net-snmp添加自定义MIB(标量和表格)

以上命令执行完后会生成myModule.hmyModule.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] ='