pysnmp - 从 NET-SNMP-EXTEND-MIB 扩展脚本获取输出?
pysnmp - get output from NET-SNMP-EXTEND-MIB extend script?
如何使用 pysnmp 4.3 通过 MIB 正确调用 SNMP 扩展脚本?
我在远程服务器的 snmpd.conf 文件中有这个条目:
extend check_fd_wap /app/users/nagios_checks/check_fd_wap.sh
它又可以被调用:
snmpwalk -t 60 -v2c -c greendale remoteserver 'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap"'
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap" = STRING: { "sys_inuse" : 32640, "proc_data" : { "ssl-mmsib" : { "proc_used" : 22, "proc_limit" : 200000 } , (...) }
在 pysnmp 中,我尝试使用示例代码调用 MIB NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap"
:
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData(community, mpModel=1),
UdpTransportTarget((hostname, port)),
ContextData(),
ObjectType(ObjectIdentity('NET-SNMP-EXTEND-MIB','nsExtendOutput1Line','check_fd_wap')))
)
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
但是,此操作失败并显示 'DisplayString' failed to cast value OctetString
错误消息:
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 u'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap' having type 'DisplayString' failed to cast value OctetString('{ "sys_inuse" (...)"" at DisplayString
但是,使用转换后的 OID 调用它可以正常工作 ('.1.3.6.1.4.1.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112'
)。
SNMPv2-SMI::enterprises.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112 = { "sys_inuse" : 31110, "proc_data" : { "ssl-mmsib" : { "proc_used" : 19, "proc_limit" : 200000 } } }
这个错误的原因是什么?
此外,如果我使用完整的 MIB NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap
作为一个参数调用 getCmd,我会收到错误消息:
pysnmp.smi.error.NoSuchObjectError: NoSuchObjectError({'str': 'Can\'t resolve node name ::(\'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line\', \'"check_fd_wap"\') at <pysnmp.smi.view.MibViewController instance at 0x2989638>'})
是否可以在一个字符串中调用带有完整 MIB 的 SNMP get?
此次失败:
'DisplayString' failed to cast value OctetString
当 pysnmp 收到 SNMP 代理对请求的 OID 的响应时发生
1.3.6.1.4.1.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112
(对应于 NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap MIB 对象)然后尝试转换响应值( { "sys_inuse" : 32640, "proc...) 进入人性化的 DisplayString 表示。此时 pysnmp 失败,但确切原因未包含在你的报告出于某种原因。
我猜测您的 SNMP 代理发送的响应字符串可能不小心超过了 255 个字符的长度(constraint of DisplayString type)。
形式上正确的解决方案是使 SNMP 代理响应适合 255 个 ASCII 字符的 MIB 对象以满足 DisplayString 类型限制。
或者,您可以通过将 lookupMib=False 关键字参数传递给 getCmd() 函数来禁用 pysnmp 中响应值的 MIB 查找。
如何使用 pysnmp 4.3 通过 MIB 正确调用 SNMP 扩展脚本?
我在远程服务器的 snmpd.conf 文件中有这个条目:
extend check_fd_wap /app/users/nagios_checks/check_fd_wap.sh
它又可以被调用:
snmpwalk -t 60 -v2c -c greendale remoteserver 'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap"'
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap" = STRING: { "sys_inuse" : 32640, "proc_data" : { "ssl-mmsib" : { "proc_used" : 22, "proc_limit" : 200000 } , (...) }
在 pysnmp 中,我尝试使用示例代码调用 MIB NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap"
:
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData(community, mpModel=1),
UdpTransportTarget((hostname, port)),
ContextData(),
ObjectType(ObjectIdentity('NET-SNMP-EXTEND-MIB','nsExtendOutput1Line','check_fd_wap')))
)
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
但是,此操作失败并显示 'DisplayString' failed to cast value OctetString
错误消息:
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 u'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap' having type 'DisplayString' failed to cast value OctetString('{ "sys_inuse" (...)"" at DisplayString
但是,使用转换后的 OID 调用它可以正常工作 ('.1.3.6.1.4.1.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112'
)。
SNMPv2-SMI::enterprises.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112 = { "sys_inuse" : 31110, "proc_data" : { "ssl-mmsib" : { "proc_used" : 19, "proc_limit" : 200000 } } }
这个错误的原因是什么?
此外,如果我使用完整的 MIB NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap
作为一个参数调用 getCmd,我会收到错误消息:
pysnmp.smi.error.NoSuchObjectError: NoSuchObjectError({'str': 'Can\'t resolve node name ::(\'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line\', \'"check_fd_wap"\') at <pysnmp.smi.view.MibViewController instance at 0x2989638>'})
是否可以在一个字符串中调用带有完整 MIB 的 SNMP get?
此次失败:
'DisplayString' failed to cast value OctetString
当 pysnmp 收到 SNMP 代理对请求的 OID 的响应时发生
1.3.6.1.4.1.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112
(对应于 NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap MIB 对象)然后尝试转换响应值( { "sys_inuse" : 32640, "proc...) 进入人性化的 DisplayString 表示。此时 pysnmp 失败,但确切原因未包含在你的报告出于某种原因。
我猜测您的 SNMP 代理发送的响应字符串可能不小心超过了 255 个字符的长度(constraint of DisplayString type)。
形式上正确的解决方案是使 SNMP 代理响应适合 255 个 ASCII 字符的 MIB 对象以满足 DisplayString 类型限制。
或者,您可以通过将 lookupMib=False 关键字参数传递给 getCmd() 函数来禁用 pysnmp 中响应值的 MIB 查找。