2016-08-03 25 views
0

我一直在试图实现加载我的设备MIBS并遍历所有OIDS的代码。在这种情况下,当我尝试加载snmp 1.3.6.1.2.1.11的OID时,smi在尝试加载特定OID时引发异常。以前的OID成功地工作:“.1.3.6.1.2.1.11.29.0' 但是这一次生成错误消息” .1.3.6.1.2.1.11.30.0'特定查询上的pysnmp错误

唯一的例外是:

File "/opt/anaconda/lib/python2.7/site-packages/pysnmp/smi/rfc1902.py", line 859, in resolveWithMib raise SmiError('MIB object %r having type %r failed to cast value %r: %s' % (self.args[0].prettyPrint(), self.__args[0].getMibNode().getSyntax().__class.name, self.__args[1], sys.exc_info()[1])) ;SmiError: MIB object 'SNMPv2-MIB::snmpEnableAuthenTraps.0' having type 'Integer32' failed to cast value Integer32(808466736): ConstraintsIntersection(ConstraintsIntersection(ConstraintsIntersection(), ValueRangeConstraint(-2147483648, 2147483647)), SingleValueConstraint(1, 2)) failed at: "SingleValueConstraint(1, 2) failed at: "808466736"" at Integer32

以下是演示错误的示例代码。您将需要修改DEVICE_IP。假设您正在运行SNMP v1并针对社区公众。它运行pysnmp版本4.3.2

from pysnmp.entity.rfc3413.oneliner import cmdgen 
from pysnmp.smi.rfc1902 import ObjectIdentity 

DEVICE_IP = 'localhost' 


def get_oid(oid): 
    """ 
    Requires a valid oid as input and retrieves the given OID 
    """ 
    snmp_target = (DEVICE_IP, 161) 
    cmdGen = cmdgen.CommandGenerator() 
    result = None 

    errorIndication, errorStatus, errorIndex, varBindTable =   cmdGen.nextCmd(
     cmdgen.CommunityData('public', mpModel=0), 
     cmdgen.UdpTransportTarget(snmp_target), 
     ObjectIdentity(oid, last=True), 
     lexicographicMode=False 
     ) 

    if errorIndication: 
     print(errorIndication) 
    else: 
     for varBindTableRow in varBindTable: 
      for name, val in varBindTableRow: 
       try: 
        result = str(val) 
       except: 
        raise 
    return result 

# Does not Throw Error 
print get_oid('.1.3.6.1.2.1.11.29.0') 

# Throws Error 
print get_oid('.1.3.6.1.2.1.11.30.0') 

回答

0

SNMP代理回应1.3.6.1.2.1.11.30.0 = 808466736个而OID 1.3.6.1.2.1.11.30.0标识MIB对象snmpEnableAuthenTraps只有两个值类型的INTEGER的许可:1和2

下面是从的SNMPv2-MIB正式定义:

snmpEnableAuthenTraps OBJECT-TYPE 
    SYNTAX  INTEGER { enabled(1), disabled(2) } 
    ... 

所以这次pysnmp似乎做正确的事 - 它保护你从没有意义的价值。此问题的根本原因是SNMP代理发送MIB对象的格式不正确的值。