如何从已编译的 pysnmp mib 文件中获取 NotificationType() 对象?
how to get NotificationType() objects from compiled pysnmp mib files?
我有很多自定义的mib文件编译成pysnmp要求的格式存放在一个目录下。我正在尝试加载它们并仅拾取那些类型为 NotificationType() 的。默认情况下,它将包括所有内容
我怎样才能做到这一点?
这就是我所说的(例如 snmpAgentNotResponding 事件):
from pysnmp.smi import builder, view
mibBuilder = builder.MibBuilder().loadModules('entuity-mib')
mibView = view.MibViewController(mibBuilder)
>>> a = mibView.mibBuilder.mibSymbols
>>> a.keys()
['ENTUITY-MIB', 'ASN1-REFINEMENT', 'RFC1155-SMI', 'ASN1', 'RFC-1212', 'SNMPv2-SMI', 'RFC-1215', 'ASN1-ENUMERATION', 'RFC1213-MIB']
>>> a['ENTUITY-MIB']['snmpAgentNotResponding']
NotificationType((1, 3, 6, 1, 4, 1, 2626, 1, 1, 1, 0, 655363))
我知道这不是一个好主意(根据 class 名称进行比较),但这是我迄今为止实现的目标。
>>> b = a['ENTUITY-MIB']['snmpAgentNotResponding']
>>> b.__class__.__name__
'NotificationType'
这是我遍历 mib 文件的代码(来自 pysnmp 论坛)。
oid, label, suffix = mibView.getFirstNodeName()
while True:
try:
modName, nodeDesc, suffix = mibView.getNodeLocation(oid)
print '%s::%s == %s' % (modName, nodeDesc, oid)
oid, label, suffix = mibView.getNextNodeName(oid)
except Exception, e:
print e
break
如何更好地只选择NotificationTypes?不同的 mib 文件对 NotificationTypes 使用不同的 RFC 导入。这是我感到困惑的地方。
我可以想到两个办法:
- Duck-typing:检查 .getObjects 方法。它应该只在 NOTIFICATION-TYPE objects
中定义
坚持与 NotificationType class 进行比较。但是,如果您以某种方式设法加载多个 NotificationType classes 实例,那可能会中断。
nt, = mibBuilder.importSymbols('SNMPv2-SMI', 'NotificationType')
...
if isinstance(nt, a['ENTUITY-MIB']['snmpAgentNotResponding']):
print('is notification type')
如果您可以就 MIB 构造识别技术分享更好的想法 - 我愿意接受建议。
你的最终目标是什么?可以用 ObjectType/NotificationType classes 来完成吗?
我有很多自定义的mib文件编译成pysnmp要求的格式存放在一个目录下。我正在尝试加载它们并仅拾取那些类型为 NotificationType() 的。默认情况下,它将包括所有内容
我怎样才能做到这一点? 这就是我所说的(例如 snmpAgentNotResponding 事件):
from pysnmp.smi import builder, view
mibBuilder = builder.MibBuilder().loadModules('entuity-mib')
mibView = view.MibViewController(mibBuilder)
>>> a = mibView.mibBuilder.mibSymbols
>>> a.keys()
['ENTUITY-MIB', 'ASN1-REFINEMENT', 'RFC1155-SMI', 'ASN1', 'RFC-1212', 'SNMPv2-SMI', 'RFC-1215', 'ASN1-ENUMERATION', 'RFC1213-MIB']
>>> a['ENTUITY-MIB']['snmpAgentNotResponding']
NotificationType((1, 3, 6, 1, 4, 1, 2626, 1, 1, 1, 0, 655363))
我知道这不是一个好主意(根据 class 名称进行比较),但这是我迄今为止实现的目标。
>>> b = a['ENTUITY-MIB']['snmpAgentNotResponding']
>>> b.__class__.__name__
'NotificationType'
这是我遍历 mib 文件的代码(来自 pysnmp 论坛)。
oid, label, suffix = mibView.getFirstNodeName()
while True:
try:
modName, nodeDesc, suffix = mibView.getNodeLocation(oid)
print '%s::%s == %s' % (modName, nodeDesc, oid)
oid, label, suffix = mibView.getNextNodeName(oid)
except Exception, e:
print e
break
如何更好地只选择NotificationTypes?不同的 mib 文件对 NotificationTypes 使用不同的 RFC 导入。这是我感到困惑的地方。
我可以想到两个办法:
- Duck-typing:检查 .getObjects 方法。它应该只在 NOTIFICATION-TYPE objects 中定义
坚持与 NotificationType class 进行比较。但是,如果您以某种方式设法加载多个 NotificationType classes 实例,那可能会中断。
nt, = mibBuilder.importSymbols('SNMPv2-SMI', 'NotificationType') ... if isinstance(nt, a['ENTUITY-MIB']['snmpAgentNotResponding']): print('is notification type')
如果您可以就 MIB 构造识别技术分享更好的想法 - 我愿意接受建议。
你的最终目标是什么?可以用 ObjectType/NotificationType classes 来完成吗?