我正在使用pysnmp中的sendVarbinds来发送带有自定义MIB的陷阱 e.g。
def sendTrap(self, trapName, trapObjects):
mibViewController = view.MibViewController(self.snmpEngine.getMibBuilder())
ntfOrg = ntforg.NotificationOriginator()
ntfOrg.snmpContext = self.snmpContext
ntfOrg.sendVarBinds(
self.snmpEngine,
'my-notification', # notification targets
None, '', # contextEngineId, contextName
rfc1902.NotificationType(
trapName,
objects=trapObjects # <-- how to construct this?
).resolveWithMib(mibViewController)
)
NotificationType需要varbinds的字典,具有对象键值对。 我想从json对象填充对象字典键和值。现在我正在为每个陷阱执行此操作。
def function1():
trapName = rfc1902.ObjectIdentity('MY-MIB', 'ServerPart')
trapObjects = {
('MY-MIB', 'ServerIP'): event.get_ServerIP(),
('MY-MIB', 'ServerPartName'): event.get_ServerPartName(),
('MY-MIB', 'ServerState'): event.get_ServerState()
}
def function2():
trapName = rfc1902.ObjectIdentity('MY-MIB', 'ServerMemory')
trapObjects = {
('MY-MIB', 'ServerIP'): event.get_ServerIP(),
('MY-MIB', 'ServerMemoryAv'): event.get_ServerMemoryAv()
}
但我希望有一个函数来创建陷阱而不检查varbinds并使用JSON对象填充它们?假设我在字典项目()上运行循环。
我的流程是这样的。
客户端---事件JSON对象----&gt;陷阱守护进程----陷阱-----&gt;管理器
这是来自客户端
的JSON对象的示例my_event('ServerPart', '10.22.1.1', '44', '1', host, port)
my_event('ServerMemory', '10.22.1.1', '100MB', host, port)
有没有可以遵循的例子?
答案 0 :(得分:0)
每种通知类型都需要自己的一组托管对象(trapOpjects
)才能包含在通知中。我想事件名称的映射 - &gt; 通知类型是1对1,您可以从字段名称重新构造事件字段getter。
然后剩下的是将事件及其参数映射到通知类型和托管对象:
eventParamsToManagedObjectsMap = {
'ServerPart': { # <- notification type
'ServerIP': 'get_ServerIP', # <- trap objects
# e.g. to populate ServerIP,
# call get_serverIP()
# ...
}
...
}
最后,要构建这样的地图,您可以尝试以下几点:
notificationType = 'ServerMemory' # on input you should have all
# event or notification types
trapObjectIdentity = rfc1902.ObjectIdentity('MY-MIB', notificationType)
trapObjectIdentiry.resolveWithMib(mibViewController)
trapObjectNames = trapObjectIdentity.getMibNode().getObjects()
eventParamsToManagedObjectsMap = defaultdict(dict)
for mibName, mibObjectName in trapObjectNames:
eventParamsToManagedObjectsMap[notificationType][mibObjectName] = 'get_' + mibObjectName
获得此地图后,您应该能够在单个函数中统一构建事件中的通知。
答案 1 :(得分:0)
我想你可以尝试这样的事情(未经测试):
def get_notification(trapName, **kwargs):
return rfc1902.NotificationType(
trapName,
objects={('MY-MIB', k): v for k, v in kwargs.items()}
}
假设json_data
已经是Python dict(如果它是一个字符串调用json.loads(json_data)
以便解析它),你可以像这样调用它:
ntfOrg.sendVarBinds(
self.snmpEngine,
'my-notification', # notification targets
None, '', # contextEngineId, contextName
get_notification(**json_data).resolveWithMib(mibViewController)
)