向 PySNMP getCmd 传递一个 ObjectTypes 数组
Pass PySNMP getCmd an array of ObjectTypes
我正在尝试将 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 的其他功能,或者是否有更好的方法来完成此操作?
我猜你需要的只是一个星号 *
来将你收集到的对象序列解压到 SNMP GET 函数可变参数中:
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 数量没有明确限制,但某些代理可能会窒息 and/or 拒绝为一个内的太多对象提供服务单个 SNMP 查询。
我正在尝试将 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 的其他功能,或者是否有更好的方法来完成此操作?
我猜你需要的只是一个星号 *
来将你收集到的对象序列解压到 SNMP GET 函数可变参数中:
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 数量没有明确限制,但某些代理可能会窒息 and/or 拒绝为一个内的太多对象提供服务单个 SNMP 查询。