0

尝试加载 CISCO-RTTMON-MIB 时,我在 PySNMP 构建器中不断收到此错误。下面的代码适用于我迄今为止尝试过的所有其他 mib,但这个代码卡住了。这也是我第一次尝试走一整张桌子(rttMonStats),所以我可能只是做错了。这是我所做的:

我在这里下载了第 2 版列下的所有文件:http ://tools.cisco.com/Support/SNMP/do/BrowseMIB.do?local=en&mibName=CISCO-RTTMON-MIB

标记为“非 Cisco MIB”的那些,我在网上其他地方通过搜索“下载 MIB_NAME”找到。我通过 build-pysnmp-mib 运行其中的每一个,例如:

build-pysnmp-mib MIB_NAME.my > MIB_NAME.py.

然后我将所有 *.py 文件复制到 /opt/appname/mibs/

这是 snmpcommands.py 中相关的定义:

def walk(community, ipaddress, mib, oid, index):
    cmdGen = cmdgen.CommandGenerator()
    mibBuilder = cmdGen.snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder
    mibSources = mibBuilder.getMibSources() + (
            builder.DirMibSource('/opt/appname/mibs'),
            )
    mibBuilder.setMibSources(*mibSources)
    mibBuilder.loadModules()
    errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.nextCmd(
            cmdgen.CommunityData(community, mpModel=0),
            cmdgen.UdpTransportTarget((ipaddress, 161)),
            cmdgen.MibVariable(mib, oid, index),
            lookupValues=True, lookupNames=True
    )

    if errorIndication:
            print(errorIndication)
    else:
            if errorStatus:
                    print('%s at %s' % (
                            errorStatus.prettyPrint(),
                            errorIndex and varBinds[int(errorIndex)-1] or '?'
                            )
                    )
            else:
                    result = {}
                    for tableRow in varBindTable:
                            for oid, val in tableRow:
                                    result[oid.prettyPrint()] = val.prettyPrint()

                    return json.dumps(result)

我这样称呼它:

>>>import snmpcommands
>>>snmpcommands.walk('community', 'ip.add.ress', 'CISCO-RTTMON-MIB', 'rttMonStats', '0.0.0.0')

但是,我明白了:

>>> snmpcommands.walk('community', 'ip.add.ress', 'CISCO-RTTMON-MIB', 'rttMonStats', '0.0.0.0')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "snmpcommands.py", line 57, in walk
    mibBuilder.loadModules()
  File "/usr/lib/python2.6/site-packages/pysnmp-4.2.4-py2.6.egg/pysnmp/smi/builder.py", line 251, in loadModules
    'MIB module \"%s\" load error: %s' % (modPath, sys.exc_info()[1])
pysnmp.smi.error.SmiError: MIB module "/opt/appname/mibs/CISCO-RTTMON-MIB.py" load     error:     ConstraintsIntersection(ConstraintsIntersection(ConstraintsIntersection(ConstraintsIntersection(), ValueSizeConstraint(0, 65535)), ValueSizeConstraint(0, 255)), ValueSizeConstraint(1, 64)) failed at: "ValueSizeConstraint(1, 64) failed at: """ at SnmpAdminString

我对 PySNMP 很陌生,所以我猜问题是它期待 SnmpAdminString 中的一个值,它从 SNMP-FRAMEWORK-MIB 中提取并且它是空的。我只是不知道如何解决它。

4

1 回答 1

1

看起来您在 CISCO-RTTMON-MIB.py 中有一个空字符串作为 SnmpAdminString("") 初始化程序。这似乎违反了最终导致异常的 SnmpAdminString 约束。所以我会为空的 SnmpAdminString 初始化器使用 grep CISCO-RTTMON-MIB.py 并用兼容的值(1-64 个八位字节)替换它们,或者只是删除空的初始化器(例如,让它看起来像 SnmpAdminString())。

于 2013-08-22T10:51:42.943 回答