使用pysnmp创建自定义varbinds字典

时间:2018-04-11 05:12:18

标签: python snmp pysnmp

我正在使用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)

有没有可以遵循的例子?

2 个答案:

答案 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)
 )