如何修改pysnmp sendNotification中sysUpTimeInstance的默认0值
我有一批会发送SNMP Trap告警的设备,现在需要模拟这些设备做测试,要求测试工具输出的Trap和真实设备完全一致,且各项值可手动控制。我用pysnmp的sendNotification写了Python脚本,整体运行正常,但DISMAN-EVENT-MIB::sysUpTimeInstance总是被sendNotification自动设为0发送出去。我试过在addVarBinds里加这个对象的自定义值,但只会新增一个同名对象,原来那个值为0的sysUpTimeInstance还是会存在。请问怎么修改这个自动生成的sysUpTimeInstance的值?
使用的版本信息:
- pysnmp 4.4.12
- pysnmp-pyasn1 1.1.3
- pysnmp-pysmi 1.1.10
- pysnmplib 5.0.21
脚本代码:
from pysnmp.hlapi import * iterator7 = sendNotification( SnmpEngine(), CommunityData('public', mpModel=1), UdpTransportTarget(('localhost', 162)), ContextData(), 'trap', NotificationType(ObjectIdentity('NET-SNMP-EXAMPLES-MIB', 'netSnmpExampleNotification')).addVarBinds(ObjectType(ObjectIdentity('NET-SNMP-EXAMPLES-MIB','netSnmpExampleHeartbeatRate'), 1)) ) errorIndication, errorStatus, errorIndex, varBinds = next(iterator7) if errorIndication: print(errorIndication)
运行脚本后,通过snmptrapd接收到的内容:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::snmpTrapOID.0 = OID: NET-SNMP-EXAMPLES-MIB::netSnmpExampleNotification NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatRate = INTEGER: 1
要修改自动生成的sysUpTimeInstance值,需要通过pysnmp的MIB变量覆盖机制,在NotificationType初始化时直接指定自定义的sysUpTimeInstance值,而非用addVarBinds追加。具体操作如下:
- 在
NotificationType的构造参数中传入包含sysUpTimeInstance的变量绑定列表,将自定义值放在最前面(符合SNMP Trap的标准格式要求)。 - 自定义值的单位为百分之一秒,比如设置为360000代表设备已运行1小时。
修改后的脚本示例:
from pysnmp.hlapi import * # 自定义sysUpTime值,单位:百分之一秒 custom_sys_up_time = 360000 iterator7 = sendNotification( SnmpEngine(), CommunityData('public', mpModel=1), UdpTransportTarget(('localhost', 162)), ContextData(), 'trap', NotificationType( ObjectIdentity('NET-SNMP-EXAMPLES-MIB', 'netSnmpExampleNotification'), varBinds=[ # 显式指定sysUpTimeInstance的自定义值,覆盖默认的0 ObjectType(ObjectIdentity('DISMAN-EVENT-MIB', 'sysUpTimeInstance'), custom_sys_up_time), ObjectType(ObjectIdentity('NET-SNMP-EXAMPLES-MIB','netSnmpExampleHeartbeatRate'), 1) ] ) ) errorIndication, errorStatus, errorIndex, varBinds = next(iterator7) if errorIndication: print(errorIndication)
原理说明
pysnmp的sendNotification默认会自动添加值为0的sysUpTimeInstance和snmpTrapOID.0到变量绑定列表。但如果在NotificationType的varBinds参数中显式指定了sysUpTimeInstance,pysnmp就会使用你提供的自定义值,不再生成默认的0值条目。
修改后,snmptrapd接收到的sysUpTimeInstance就会是你设置的目标值,不会再出现重复的0值对象。
内容的提问来源于stack exchange,提问作者Steen

