首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误- (noSuchName)在这个MIB - netSnmp中没有这样的变量名?

错误- (noSuchName)在这个MIB - netSnmp中没有这样的变量名?
EN

Stack Overflow用户
提问于 2018-04-23 00:14:51
回答 1查看 2.8K关注 0票数 2

我做了一个私人的MIB -锉-MIB。

这是mib

代码语言:javascript
复制
RASP-MIB DEFINITIONS ::= BEGIN

IMPORTS
    OBJECT-TYPE, MODULE-IDENTITY,enterprises      FROM SNMPv2-SMI
    TEXTUAL-CONVENTION              FROM SNMPv2-TC;

rasp MODULE-IDENTITY
     LAST-UPDATED "201804210000Z"            -- 21 April 2018, midnight
     ORGANIZATION "net-snmp"
     CONTACT-INFO "postal:   ABC HELLO
                             CHECK 512310

                   email:    net-snmp-coders@lists.sourceforge.net"
     DESCRIPTION  "A simple mib for Raspberry PI information gathering."

::={enterprises 9100}

RowStatus ::= TEXTUAL-CONVENTION
    STATUS       current
    DESCRIPTION
        "The RowStatus textual convention is used to manage the
        creation and deletion of conceptual rows, and is used as the
        value of the SYNTAX clause for the status column of a
        conceptual row."
    SYNTAX   INTEGER {
         -- the following two values are states:
         -- these values may be read or written
         active(1),          -- state:  read/write
         notInService(2),    -- state:  read/write
         notReady(3),        -- state:  read only
         createAndGo(4),     -- action: write only
         createAndWait(5),   -- action: write only
         destroy(6)      -- action: write only
    }


    raspScalar OBJECT IDENTIFIER ::= {rasp 1}
    raspTable OBJECT IDENTIFIER ::= {rasp 2}

    freeSpaceAvailable OBJECT-TYPE
        SYNTAX      Integer32
        MAX-ACCESS  read-write
        STATUS      current
        DESCRIPTION "The free space available in the system in MB"
    DEFVAL { 2 }
    ::= { raspScalar 1 }

    scalar2 OBJECT-TYPE
        SYNTAX      Integer32
        MAX-ACCESS  read-write
        STATUS      current
        DESCRIPTION "scalar2"
        DEFVAL { 4 }
    ::= { raspScalar 2 }

    raspTableOne OBJECT-TYPE
        SYNTAX      SEQUENCE OF raspTable1Entry
        MAX-ACCESS  not-accessible
        STATUS      current
        DESCRIPTION "Table 1"
    ::= { raspTable 1 }

    raspTable1Entry OBJECT-TYPE
        SYNTAX      raspTable1Entry
        MAX-ACCESS  not-accessible
        STATUS      current
        DESCRIPTION "Entry"
        INDEX { tIndex }
    ::= { raspTableOne 1 }

    raspTable1Entry ::= SEQUENCE {
        tIndex      Integer32,
        tName       DisplayString,
        tMarks      Integer32,
        tRowStatus  INTEGER
    }

    tIndex OBJECT-TYPE
        SYNTAX      Integer32 (1..100)
        MAX-ACCESS  read-only
        STATUS      current
        DESCRIPTION "Index for Table 1"
    ::= { raspTable1Entry 1 }

    tName OBJECT-TYPE
        SYNTAX      DisplayString
        MAX-ACCESS  read-create
        STATUS      current
        DESCRIPTION "Name for Table 1"
    ::= { raspTable1Entry 2 }

    tMarks OBJECT-TYPE
        SYNTAX      Integer32(1..100)
        MAX-ACCESS  read-create
        STATUS      current
        DESCRIPTION "Marks for Table 1"
    ::= { raspTable1Entry 3 } 


    tRowStatus OBJECT-TYPE
        SYNTAX     RowStatus
        MAX-ACCESS read-create
        STATUS     current
        DESCRIPTION "The status"
    ::= { raspTable1Entry 4 }      

END

接下来,这个mib有一个标量对象- freeSpaceAvailable。我正试着用这个。

1)首先,我用snmptranslate翻译这个

$snmptranslate -m +RASP -On freeSpaceAvailable

代码语言:javascript
复制
.1.3.6.1.4.1.9100.1.1

2)接下来,我生成了mib2c代码-

代码语言:javascript
复制
 env MIBS="+RASP-MIB" mibc2c freeSpaceAvailable

3)接下来,我修改了这个文件以返回一个硬编码的值

4)编译为subAgent

代码语言:javascript
复制
$net-snmp-config --compile-subagent mysubagent freeSpaceAvailable.c

5)启动snmp守护进程

代码语言:javascript
复制
sudo service snmpd start

6)测试它是否工作。

代码语言:javascript
复制
 snmpwalk localhost -c public -v1

( 7)运行我的代理

$./mysubagent &

代码语言:javascript
复制
$pidof mysubagent
27709

,我不知道为什么我会遇到这个问题?

代码语言:javascript
复制
$snmpget -v 1 -c public localhost .1.3.6.1.4.1.9100.1.1
Error in packet
Reason: (noSuchName) There is no such variable name in this MIB.
Failed object: iso.3.6.1.4.1.9100.1.1

这是屏幕截图-

这里是freeSpaceAvailable.c代码

代码语言:javascript
复制
/*
 * 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 "freeSpaceAvailable.h"

static unsigned long myVarUlong = 0;


/** Initializes the freeSpaceAvailable module */
void
init_freeSpaceAvailable(void)
{
    const oid       freeSpaceAvailable_oid[] =
        { 1, 3, 6, 1, 4, 1, 9100, 1, 1 };

    DEBUGMSGTL(("freeSpaceAvailable", "Initializing\n"));

    netsnmp_register_scalar(netsnmp_create_handler_registration
                            ("freeSpaceAvailable",
                             handle_freeSpaceAvailable,
                             freeSpaceAvailable_oid,
                             OID_LENGTH(freeSpaceAvailable_oid),
                             HANDLER_CAN_RWRITE));
}

int
handle_freeSpaceAvailable(netsnmp_mib_handler *handler,
                          netsnmp_handler_registration *reginfo,
                          netsnmp_agent_request_info *reqinfo,
                          netsnmp_request_info *requests)
{
    int             ret = -1;
    /*
     * 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_INTEGER, &myVarUlong,sizeof(myVarUlong) );
        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_INTEGER);
        if (ret != SNMP_ERR_NOERROR) {
            netsnmp_set_request_error(reqinfo, requests, ret);
        }
        break;

    case MODE_SET_RESERVE2:
        /*
         * XXX malloc "undo" storage buffer 
         */
        //if ( /* 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 
         */
        myVarUlong = (unsigned long)*requests->requestvb->val.integer;
        if ( myVarUlong == 0 ) {
            netsnmp_set_request_error(reqinfo, requests, ret
                                      );
        }
        break;

    case MODE_SET_COMMIT:
        /*
         * XXX: delete temporary storage 
         */
        //if ( /* 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
        if ( /* XXX: error? */ ) {
            /*
             * try _really_really_ hard to never get to this point 
             */
            netsnmp_set_request_error(reqinfo, requests,
                                      SNMP_ERR_UNDOFAILED);
        }
        #endif
        break;

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

    return SNMP_ERR_NOERROR;
}

看来主SNMP守护进程根本没有得到通知。中添加了调试信息。

/etc/默认/snmpd

SNMPDOPTS='-LS 0-4d -Lf /dev/空-u snmp -g snmp -I -smux,mteTrigger,mteTriggerConf -p /var/run/snmpd.pid‘

在赛斯日志里-

代码语言:javascript
复制
sudo tail -f /var/log/syslog
Apr 23 16:00:17 pc snmpd[11340]: /etc/snmp/snmpd.conf: line 143: Warning: Unknown token: defaultMonitors.
Apr 23 16:00:17 pc snmpd[11340]: /etc/snmp/snmpd.conf: line 145: Warning: Unknown token: linkUpDownNotifications.
Apr 23 16:00:17 pc snmpd[11340]: /var/lib/snmp/snmpd.conf: line 32: Warning: Unknown token: _mteTTable.
Apr 23 16:00:17 pc snmpd[11340]: /var/lib/snmp/snmpd.conf: line 33: Warning: Unknown token: _mteTTable.
Apr 23 16:00:17 pc snmpd[11340]: /var/lib/snmp/snmpd.conf: line 34: Warning: Unknown token: _mteTTable.
Apr 23 16:00:17 pc snmpd[11340]: /var/lib/snmp/snmpd.conf: line 35: Warning: Unknown token: _mteTTable.
Apr 23 16:00:17 pc snmpd[11340]: /var/lib/snmp/snmpd.conf: line 36: Warning: Unknown token: _mteTTable.
Apr 23 16:00:17 pc snmpd[11340]: /var/lib/snmp/snmpd.conf: line 37: Warning: Unknown token: _mteTTable.
Apr 23 16:00:17 pc snmpd[11340]: /var/lib/snmp/snmpd.conf: line 38: Warning: Unknown token: _mteTTable.

即使我杀了或生下了我的代理人,也没什么区别。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-23 01:27:53

节点定义中有一个小错误。应该是::= { raspScalar 1 }

代码语言:javascript
复制
freeSpaceAvailable OBJECT-TYPE
    SYNTAX      Integer32
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION "The free space available in the system in MB"
DEFVAL { 2 }
::= { raspScalar 1 }

我使用tkmib (linux)来解决这个问题。在本教程之后,我得到了很好的回应

C代码片段:

代码语言:javascript
复制
int fSpace;

// inside init_freeSpaceAvailable
    fSpace = (int) random();

// inside switch statement
        case MODE_GET:
            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
                                    (u_char *)&fSpace,
                                    sizeof(fSpace));
            break;

在/etc/snmp/snmpd.conf上添加

master agentx

启动snmpd作为

sudo snmpd -f -Lo -C --rwcommunity=public --master=agentx --agentXSocket=tcp:localhost:1705

启动代理

./mysubagent -f -Lo -x tcp:localhost:1705

测试为

snmpget -v 1 -c public localhost RASP-MIB::freeSpaceAvailable.0

RASP-MIB::freeSpaceAvailable.0 = INTEGER: 924855091

或由OID

snmpget -v 1 -c public -m "+RASP-MIB" localhost 1.3.6.1.4.1.9100.1.1.0 RASP-MIB::freeSpaceAvailable.0 = INTEGER: 924855091

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49971904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档