【问题标题】:pysnmp 4.2.5 sending trap with object fails in sendPdupysnmp 4.2.5 在 sendPdu 中发送带有对象的陷阱失败
【发布时间】:2016-01-27 13:22:28
【问题描述】:

所以我试图让陷阱在我们的项目中工作。我们正在使用自定义 mib,并且它已经可以运行,并且发送没有额外数据的陷阱也可以使用以下代码正常工作,并且从 MIB 中的陷阱中删除了 OBJECT 属性:

def sendEventTrap(self, event):
    if(doPrintTraps):
        print "Sending trap"
    ntfOrg = ntforg.NotificationOriginator(self._snmpContext)
    errorIndication = ntfOrg.sendNotification(
        self._snmpEngine,
        'trap',
        ('PROJECT-MIB', 'eventTrap'),
        ())

现在我正在尝试像这样添加一个简单的 Integer32 附加对象

def sendEventTrap(self, event):
    if(doPrintTraps):
        print "Sending trap"
    ntfOrg = ntforg.NotificationOriginator(self._snmpContext)
    errorIndication = ntfOrg.sendNotification(
        self._snmpEngine,
        'trap',
        ('PROJECT-MIB', 'eventTrap'),
        [((1, 3, 6, 1, 4, 1, 999999, 3, 1, 0) , v2c.Integer32(1337))])

但是,即使根据以下日志,它确实找到了正确的 OID 并将其与正确关联的 Integer32 类型匹配:http://pastebin.com/hJ9LAiAg

这是 MIB 的相关部分:

eventNotifications OBJECT IDENTIFIER ::= { xxx 4 }

eventTrap NOTIFICATION-TYPE
    OBJECTS     { direction }
    STATUS current
    DESCRIPTION ""
::= {eventNotifications 1}

请注意,出于隐私原因,某些函数名称已更改。 我在这里不知所措,非常感谢您提供关于哪里出了问题的意见。

【问题讨论】:

  • 我想如果您使用的是 pysnmp 4.3,解决此问题会容易得多。除了更简洁的设计,它还修复了许多错误。除此之外,确保每个线程都有本地的 snmpEngine 对象——所有状态都保存在 snmpEngine 对象中,并且没有执行内部锁定。
  • 遗憾的是 4.2.5 版是 debian stable 提供的,因为它是分发包,我更愿意坚持使用。它是否与源代码兼容,至少对于本机 API 而言?感谢 snmpEngine 线程提示,我必须检查一下。
  • pysnmp 4.3 与 pysnmp 4.2.5 的 API 兼容(适用于所有 4.2.5 接口)。说到您的代码 sn-p,看起来您看到的异常发生在异常处理程序中,同时处理 sendPdu() 引发的异常。因此,很难说出原始异常的原因是什么。如果您启用更多的 pysnmp 调试机会,则原始异常会显示在那里...
  • 好吧,我发现如果我不添加 OBJECTS { direction } 指令,我可以附加 varBinds 来工作。这似乎是因为该参数确实仅适用于 additional varBinds。但是,如果指定了 OBJECTS,我希望自动发送正确的对象,这不起作用。但无论如何,这对我来说已经足够了。所以感谢您的意见,打开日志记录真的很有帮助。
  • @IlyaEtingof 我终于再次对此进行了调查,因为尽管它可以在 MIB 中没有陷阱的 VarBind 的情况下工作,但如果有的话,它会更好地记录下来。我再次尝试使用 PySNMP 4.3.2,现在在 PySNMP pastebin.com/cchsQwtK 中出现以下异常

标签: python snmp mib pysnmp


【解决方案1】:

我终于得到了这个工作。实际上有两个问题。

  1. 此功能似乎在 4.2.5 中被破坏,我当前的代码仍然因关键错误而失败。在 4.3.2 上运行良好。
  2. 上面的代码缺少 instanceIndex=(0,) 作为参数,并且在发送已管理的对象时,不必手动将其作为 varBind 包含。

以下内容适用于问题 MIB 中的声明:

ntfOrg = ntforg.NotificationOriginator(self._snmpContext)
errorIndication = ntfOrg.sendNotification(
    self._snmpEngine,
    'trap',
    ('PROJECT-MIB', 'eventTrap'),
    instanceIndex=(0,))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多