传递PySNMP getCmd一个ObjectTypes数组

时间:2017-05-12 12:51:39

标签: python pysnmp

我试图将PySNMP用于监控系统,但我想传递一个动态的对象列表来查询每个连接,如下所示:

errorIndication, errorStatus, errorIndex, varBinds = next(
        getCmd(SnmpEngine(),
           CommunityData(self.device.getSNMPCommunity(), mpModel=0),
           UdpTransportTarget((self.device.getHost(), 
self.device.getSNMPPort()),self.device.getSNMPTimeout(),int(1)),
           ContextData(),
           ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0)),
           ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)),
           ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysUpTime', 0)),
           ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)),
           ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysContact', 0)),
        )
    )

相反,我希望能够做类似以下的事情:

for sensor in self.sensors:
        if(sensor.sensor_type == 'snmp'):
            if(sensor.snmp_oid):
                Sensors.append(ObjectType(ObjectIdentity(sensor.snmp_oid)))
            else:
                Sensors.append(
                    ObjectType(
                        ObjectIdentity(
                            sensor.snmp_mib,
                            sensor.snmp_object,
                            sensor.snmp_field
                     ).addAsn1MibSource('file:///usr/share/snmp/mibs')))

然后致电

errorIndication, errorStatus, errorIndex, varBinds = next(
        getCmd(SnmpEngine(),
            CommunityData(device_to_proc.snmp_community, mpModel=0),
            UdpTransportTarget((device_to_proc.host, int(device_to_proc.snmp_port)),int(device_to_proc.snmp_timeout),int(1)),
            ContextData(),
            Sensors
        )
    )

我缺少pysnmp的不同功能,还是有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

我猜你需要的只是一个星号*来解压缩你收集到SNMP GET函数中的对象序列varargs:

errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData(device_to_proc.snmp_community, mpModel=0),
           UdpTransportTarget((device_to_proc.host, int(device_to_proc.snmp_port)),int(device_to_proc.snmp_timeout),int(1)),
           ContextData(),
           *Sensors
    )
)

作为旁注,请记住,尽管您可以向SNMP代理发送的OID数量没有明确限制,但某些代理可能会阻塞和/或拒绝在单个SNMP查询中提供过多的对象。