【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

以上命令執行完后會生成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

以上命令執行完后會生成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\n"));

    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] ='\0';   //字符串結束符
        if ( 0/* XXX: error? */ ) {
            /*
             * try _really_really_ hard to never get to this point 
             */
            netsnmp_set_request_error(reqinfo, requests,
                                      SNMP_ERR_COMMITFAILED);
        }
        break;

    case MODE_SET_UNDO:
        /*
         * XXX: UNDO and return to previous value for the object 
         */
        if ( 0/* XXX: error? */ ) {
            /*
             * try _really_really_ hard to never get to this point 
             */
            netsnmp_set_request_error(reqinfo, requests,
                                      SNMP_ERR_UNDOFAILED);
        }
        break;

    default:
        /*
         * we should never get here, so this is a really bad error 
         */
        snmp_log(LOG_ERR, "unknown mode (%d) in handle_myScalar\n",
                 reqinfo->mode);
        return SNMP_ERR_GENERR;
    }

    return SNMP_ERR_NOERROR;
}

 

修改后的myModule.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 "myModule.h"

/** Initializes the myModule module */
void
init_myModule(void)
{
    /*
     * here we initialize all the tables we're planning on supporting 
     */
    initialize_table_myTable();
}

//注釋掉這一行
//# Determine the first/last column names

/** Initialize the myTable table by defining its contents and how it's structured */
void
initialize_table_myTable(void)
{
    const oid       myTable_oid[] = { 1, 3, 6, 1, 4, 1, 2020, 1, 2 };
    const size_t    myTable_oid_len = OID_LENGTH(myTable_oid);
    netsnmp_handler_registration *reg;
    netsnmp_iterator_info *iinfo;
    netsnmp_table_registration_info *table_info;

    DEBUGMSGTL(("myModule:init", "initializing table myTable\n"));

    reg = netsnmp_create_handler_registration("myTable", myTable_handler,
                                              myTable_oid, myTable_oid_len,
                                              HANDLER_CAN_RWRITE);

    table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
    netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER,   /* index: myIndex */
                                     0);
    table_info->min_column = COLUMN_MYINDEX;
    table_info->max_column = COLUMN_MYRS;

    iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
    iinfo->get_first_data_point = myTable_get_first_data_point;
    iinfo->get_next_data_point = myTable_get_next_data_point;
    iinfo->table_reginfo = table_info;

    netsnmp_register_table_iterator(reg, iinfo);
    netsnmp_inject_handler_before(reg,
                                  netsnmp_get_cache_handler
                                  (MYTABLE_TIMEOUT, myTable_load,
                                   myTable_free, myTable_oid,
                                   myTable_oid_len), TABLE_ITERATOR_NAME);

    /*
     * Initialise the contents of the table here 
     */
}

#define NNN 1024 //定義這個宏,下面這個結構體用到
    /*
     * Typical data structure for a row entry 
     */
struct myTable_entry {
    /*
     * Index values 
     */
    long            myIndex;

    /*
     * Column values 
     */
    //long            myIndex; // 上面已經定義了
    char            mycol1[NNN];
    size_t          mycol1_len;
    char            old_mycol1[NNN];
    size_t          old_mycol1_len;
    long            mycol2;
    long            old_mycol2;
    long            myrs;

    /*
     * Illustrate using a simple linked list 
     */
    int             valid;
    struct myTable_entry *next;
};

struct myTable_entry *myTable_head;

/*
 * create a new row in the (unsorted) table 
 */
struct myTable_entry *
//補全這個函數的參數,其實就是表格中那三列的內容
//這個函數就是添加一行數據的函數,RowStatus列不傳也可以,程序內部會自動處理
myTable_createEntry(long myIndex,char *mycol1,size_t mycol1_len,long mycol2)
{
    struct myTable_entry *entry;

    entry = SNMP_MALLOC_TYPEDEF(struct myTable_entry);
    if (!entry)
        return NULL;

    
    entry->myIndex = myIndex;
    
    snprintf(entry->mycol1, sizeof(entry->mycol1), "%s", mycol1);     //將mycol1數據賦給結構體
    entry->mycol1_len = mycol1_len;                                 //將mycol1_len數據賦給結構體
    entry->mycol2 = mycol2;                                         //將mycol2數據賦給結構體
    
    entry->next = myTable_head;
    myTable_head = entry;
    return entry;
}

/*
 * remove a row from the table 
 */
void
myTable_removeEntry(struct myTable_entry *entry)
{
    struct myTable_entry *ptr, *prev;

    if (!entry)
        return;                 /* Nothing to remove */

    for (ptr = myTable_head, prev = NULL;
         ptr != NULL; prev = ptr, ptr = ptr->next) {
        if (ptr == entry)
            break;
    }
    if (!ptr)
        return;                 /* Can't find it */

    if (prev == NULL)
        myTable_head = ptr->next;
    else
        prev->next = ptr->next;

    SNMP_FREE(entry);           /* XXX - release any other internal resources */
}

#define STRMAX 1024 //定義宏

/*
 * Example cache handling - set up linked list from a suitable file 
 */
int
myTable_load(netsnmp_cache * cache, void *vmagic)
{
    FILE           *fp;
    struct myTable_entry *this;
    char            buf[STRMAX];

    /*
     * The basic load routine template assumes that the data to
     * be reported is held in a file - with one row of the file
     * for each row of the table.
     * If your data is available via a different API, you
     * should amend this initial block (and the control of the
     * 'while' loop) accordingly.
     * 'XXX' marks where the template is incomplete and
     * code will definitely need to be added. 
     */

    fp = fopen("/data/for/myTable", "r");
    if (!fp) {
        return -1;
    }
    while (fgets(buf, STRMAX, fp)) {
        this = SNMP_MALLOC_TYPEDEF(struct myTable_entry);
        /*
         * XXX - Unpick 'buf' to extract the individual field values
         * and then populate the 'this' data structure with them 
         */

        this->next = myTable_head;
        myTable_head = this;    /* Iterate helper is fine with unordered lists! */
    }
    fclose(fp);
    return 0;                   /* OK */
}

void
myTable_free(netsnmp_cache * cache, void *vmagic)
{
    struct myTable_entry *this, *that;

    for (this = myTable_head; this; this = that) {
        that = this->next;
        SNMP_FREE(this);        /* XXX - release any other internal resources */
    }
    myTable_head = NULL;
}

/*
 * Example iterator hook routines - using 'get_next' to do most of the work 
 */
netsnmp_variable_list *
myTable_get_first_data_point(void **my_loop_context,
                             void **my_data_context,
                             netsnmp_variable_list * put_index_data,
                             netsnmp_iterator_info *mydata)
{
    *my_loop_context = myTable_head;
    return myTable_get_next_data_point(my_loop_context, my_data_context,
                                       put_index_data, mydata);
}

netsnmp_variable_list *
myTable_get_next_data_point(void **my_loop_context,
                            void **my_data_context,
                            netsnmp_variable_list * put_index_data,
                            netsnmp_iterator_info *mydata)
{
    struct myTable_entry *entry =
        (struct myTable_entry *) *my_loop_context;
    netsnmp_variable_list *idx = put_index_data;

    if (entry) {
        snmp_set_var_typed_integer(idx, ASN_INTEGER, entry->myIndex);
        idx = idx->next_variable;
        *my_data_context = (void *) entry;
        *my_loop_context = (void *) entry->next;
        return put_index_data;
    } else {
        return NULL;
    }
}


/** handles requests for the myTable table */
int
myTable_handler(netsnmp_mib_handler *handler,
                netsnmp_handler_registration *reginfo,
                netsnmp_agent_request_info *reqinfo,
                netsnmp_request_info *requests)
{

    netsnmp_request_info *request;
    netsnmp_table_request_info *table_info;
    struct myTable_entry *table_entry;
    struct myTable_entry *table_row; //這個變量未定義
    int ret; //變量未定義

    DEBUGMSGTL(("myModule:handler", "Processing request (%d)\n",
                reqinfo->mode));

    switch (reqinfo->mode) {
        /*
         * Read-support (also covers GetNext requests)
         */
    case MODE_GET:
        for (request = requests; request; request = request->next) {
            table_entry = (struct myTable_entry *)
                netsnmp_extract_iterator_context(request);
            table_info = netsnmp_extract_table_info(request);

            switch (table_info->colnum) {
            case COLUMN_MYINDEX:
                if (!table_entry) {
                    netsnmp_set_request_error(reqinfo, request,
                                              SNMP_NOSUCHINSTANCE);
                    continue;
                }
                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
                                           table_entry->myIndex);
                break;
            case COLUMN_MYCOL1:
                if (!table_entry) {
                    netsnmp_set_request_error(reqinfo, request,
                                              SNMP_NOSUCHINSTANCE);
                    continue;
                }
                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR,
                                         table_entry->mycol1,
                                         table_entry->mycol1_len);
                break;
            case COLUMN_MYCOL2:
                if (!table_entry) {
                    netsnmp_set_request_error(reqinfo, request,
                                              SNMP_NOSUCHINSTANCE);
                    continue;
                }
                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
                                           table_entry->mycol2);
                break;
            case COLUMN_MYRS:
                if (!table_entry) {
                    netsnmp_set_request_error(reqinfo, request,
                                              SNMP_NOSUCHINSTANCE);
                    continue;
                }
                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
                                           table_entry->myrs);
                break;
            default:
                netsnmp_set_request_error(reqinfo, request,
                                          SNMP_NOSUCHOBJECT);
                break;
            }
        }
        break;

        /*
         * Write-support
         */
    case MODE_SET_RESERVE1:
        for (request = requests; request; request = request->next) {
            table_entry = (struct myTable_entry *)
                netsnmp_extract_iterator_context(request);
            table_info = netsnmp_extract_table_info(request);

            switch (table_info->colnum) {
            case COLUMN_MYCOL1:
                /*
                 * or possibly 'netsnmp_check_vb_type_and_size' 
                 */
                ret =
                    netsnmp_check_vb_type_and_max_size(request->requestvb,
                                                       ASN_OCTET_STR,
                                                       sizeof(table_entry->
                                                              mycol1));
                if (ret != SNMP_ERR_NOERROR) {
                    netsnmp_set_request_error(reqinfo, request, ret);
                    return SNMP_ERR_NOERROR;
                }
                break;
            case COLUMN_MYCOL2:
                /*
                 * or possibly 'netsnmp_check_vb_int_range' 
                 */
                ret = netsnmp_check_vb_int(request->requestvb);
                if (ret != SNMP_ERR_NOERROR) {
                    netsnmp_set_request_error(reqinfo, request, ret);
                    return SNMP_ERR_NOERROR;
                }
                break;
            case COLUMN_MYRS:
                ret = netsnmp_check_vb_rowstatus(request->requestvb,
                                                 (table_entry ? RS_ACTIVE :
                                                  RS_NONEXISTENT));
                if (ret != SNMP_ERR_NOERROR) {
                    netsnmp_set_request_error(reqinfo, request, ret);
                    return SNMP_ERR_NOERROR;
                }
                break;
            default:
                netsnmp_set_request_error(reqinfo, request,
                                          SNMP_ERR_NOTWRITABLE);
                return SNMP_ERR_NOERROR;
            }
        }
        break;

    case MODE_SET_RESERVE2:
        for (request = requests; request; request = request->next) {
            table_entry = (struct myTable_entry *)
                netsnmp_extract_iterator_context(request);
            table_info = netsnmp_extract_table_info(request);

            switch (table_info->colnum) {
            case COLUMN_MYRS:
                switch (*request->requestvb->val.integer) {
                case RS_CREATEANDGO:
                case RS_CREATEANDWAIT:
                    table_row =
                        myTable_createEntry(*table_info->indexes->val.integer,"",0,0);//補全,這里是創建一個新的行
                    if (table_row) {
                        netsnmp_insert_iterator_context(request,
                                                        table_row);
                    } else {
                        netsnmp_set_request_error(reqinfo, request,
                                                  SNMP_ERR_RESOURCEUNAVAILABLE);
                        return SNMP_ERR_NOERROR;
                    }
                }
            }
        }
        break;

    case MODE_SET_FREE:
        for (request = requests; request; request = request->next) {
            table_entry = (struct myTable_entry *)
                netsnmp_extract_iterator_context(request);
            table_info = netsnmp_extract_table_info(request);

            switch (table_info->colnum) {
            case COLUMN_MYRS:
                switch (*request->requestvb->val.integer) {
                case RS_CREATEANDGO:
                case RS_CREATEANDWAIT:
                    if (table_entry && !table_entry->valid) {
                        myTable_removeEntry(table_row); //多傳了table_data參數,刪除
                    }
                }
            }
        }
        break;

    case MODE_SET_ACTION:
        for (request = requests; request; request = request->next) {
            table_entry = (struct myTable_entry *)
                netsnmp_extract_iterator_context(request);
            table_info = netsnmp_extract_table_info(request);

            switch (table_info->colnum) {
            case COLUMN_MYCOL1:
                memcpy(table_entry->old_mycol1,
                       table_entry->mycol1, sizeof(table_entry->mycol1));
                table_entry->old_mycol1_len = table_entry->mycol1_len;
                memset(table_entry->mycol1, 0,
                       sizeof(table_entry->mycol1));
                memcpy(table_entry->mycol1,
                       request->requestvb->val.string,
                       request->requestvb->val_len);
                table_entry->mycol1_len = request->requestvb->val_len;
                break;
            case COLUMN_MYCOL2:
                table_entry->old_mycol2 = table_entry->mycol2;
                table_entry->mycol2 = *request->requestvb->val.integer;
                break;
            }
        }
        /*
         * Check the internal consistency of an active row 
         */
        for (request = requests; request; request = request->next) {
            table_entry = (struct myTable_entry *)
                netsnmp_extract_iterator_context(request);
            table_info = netsnmp_extract_table_info(request);

            switch (table_info->colnum) {
            case COLUMN_MYRS:
                switch (*request->requestvb->val.integer) {
                case RS_ACTIVE:
                case RS_CREATEANDGO:
                    if ( 0/* 出錯條件 */ ) {
                        netsnmp_set_request_error(reqinfo, request,
                                                  SNMP_ERR_INCONSISTENTVALUE);
                        return SNMP_ERR_NOERROR;
                    }
                }
            }
        }
        break;

    case MODE_SET_UNDO:
        for (request = requests; request; request = request->next) {
            table_entry = (struct myTable_entry *)
                netsnmp_extract_iterator_context(request);
            table_info = netsnmp_extract_table_info(request);

            switch (table_info->colnum) {
            case COLUMN_MYCOL1:
                memcpy(table_entry->mycol1,
                       table_entry->old_mycol1,
                       sizeof(table_entry->mycol1));
                memset(table_entry->old_mycol1, 0,
                       sizeof(table_entry->mycol1));
                table_entry->mycol1_len = table_entry->old_mycol1_len;
                break;
            case COLUMN_MYCOL2:
                table_entry->mycol2 = table_entry->old_mycol2;
                table_entry->old_mycol2 = 0;
                break;
            case COLUMN_MYRS:
                switch (*request->requestvb->val.integer) {
                case RS_CREATEANDGO:
                case RS_CREATEANDWAIT:
                    if (table_entry && !table_entry->valid) {
                        myTable_removeEntry(table_row);//多傳了table_data參數,刪除
                    }
                }
                break;
            }
        }
        break;

    case MODE_SET_COMMIT:
        for (request = requests; request; request = request->next) {
            table_entry = (struct myTable_entry *)
                netsnmp_extract_iterator_context(request);
            table_info = netsnmp_extract_table_info(request);

            switch (table_info->colnum) {
            case COLUMN_MYRS:
                switch (*request->requestvb->val.integer) {
                case RS_CREATEANDGO:
                    table_entry->valid = 1;
                    /*
                     * Fall-through 
                     */
                case RS_ACTIVE:
                    table_entry->myrs = RS_ACTIVE;
                    break;

                case RS_CREATEANDWAIT:
                    table_entry->valid = 1;
                    /*
                     * Fall-through 
                     */
                case RS_NOTINSERVICE:
                    table_entry->myrs = RS_NOTINSERVICE;
                    break;

                case RS_DESTROY:
                    myTable_removeEntry(table_entry);//修改table_row為table_entry,否則刪除行不成功,多傳了table_data參數,刪除
                }
            }
        }
        break;
    }
    return SNMP_ERR_NOERROR;
}

 

 

四、載入自定義MIB庫

1、在服務器/root/net-snmp-5.7.1/agent/mibgroup/目錄下新建一個目錄mytest-mib將生成的myOid.h、myOid.h和修改后的myModule.c 、myModule.c文件放到mytest-mib目錄下。

/root/net-snmp-5.7.1/agent/mibgroup目錄下新建文件mytest.h

mytest.h文件內容為:

config_require(mytest-mib/myOid); config_require(mytest-mib/myModule);

 

2、如果snmp服務在運行,停止snmp服務

 

3、在/root/net-snmp-5.7.1目錄下依次執行下面3個命令編譯安裝

./configure --prefix=/usr/local/snmp --with-mib-modules="mytest"

 make

 make install

 

 

五、測試

1、執行/usr/local/snmp/sbin/snmpd -c /usr/local/snmp/etc/snmpd.conf 命令啟動snmp服務

 

測試標量

1、設置myNode的值為"harara"

/usr/local/snmp/bin/snmpset -v 2c -c public localhost 1.3.6.1.4.1.2020.1.1.0 s harara

2、查看myNode的值

/usr/local/snmp/bin/snmpget -v 2c -c public localhost 1.3.6.1.4.1.2020.1.1.0

 

 測試表格

1、執行/usr/local/snmp/bin/snmpwalk -v 2c -c public localhost 1.3.6.1.4.1.2020.1.2查看表格內容,可以看到表里什么都沒有

 

2、添加第一行數據:/usr/local/snmp/bin/snmpset -v 2c -c public localhost 1.3.6.1.4.1.2020.1.2.1.4.1 i 4

   這個命令表示對表的第一行的第三列設置值為4,因為第三列為RowStatus類型,所以系統會創建這一行

(表中原本是沒有第一行的,只要對第一行的RowStatus列寫入4就可以創建這一行)

3、設置字段值, 例:設置第一行數據中的myCol1字段:/usr/local/snmp/bin/snmpset -v 2c -c public localhost 1.3.6.1.4.1.2020.1.2.1.2.1 s harara

4、刪除第1行,對第1行的第4列寫入6即可:/usr/local/snmp/bin/snmpset -v 2c -c public localhost 1.3.6.1.4.1.2020.1.2.1.4.1 i 6

 

 

 

參考地址

利用mib2c生成框架代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM