特定查询的pysnmp错误

时间:2016-08-03 17:52:24

标签: python snmp pysnmp

我一直在尝试实现加载我的设备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'

例外是:

  

文件“/opt/anaconda/lib/python2.7/site-packages/pysnmp/smi/rfc1902.py”,第859行,在resolveWithMib中       提升SmiError('MIB对象%r,类型%r无法转换值%r:%s'%(self。 args [0] .prettyPrint(),self .__ args [0] .getMibNode()。getSyntax ().__ class name ,self .__ args [1],sys.exc_info()[1]))   ; SmiError:类型为'Integer32'的MIB对象'SNMPv2-MIB :: snmpEnableAuthenTraps.0'无法转换值Integer32(808466736):ConstraintsIntersection(ConstraintsIntersection(ConstraintsIntersection(),ValueRangeConstraint(-2147483648,2147483647)),SingleValueConstraint(1, 2))失败:“SingleValueConstraint(1,2)失败于:”808466736“”在Integer32

以下是演示错误的示例代码。您需要修改DEVICE_IP。假设您正在运行SNMP v1并且正在运行社区'public。它正在运行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')

1 个答案:

答案 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对象发送格式错误的值。