如何用pysnmp在代理端实现SET和TRAP?

时间:2018-03-01 03:57:43

标签: snmp pysnmp snmp-trap

我已经使用基于this示例的pysnmp实现了SNMP代理。此示例演示SNMP GET和GETNEXT查询。但我找不到指针如何在此代码之上实现SNMP SET和TRAP。 Examples我发现SET和TRAP是完全不同的实现。如何在此代码之上实现SNMP SET和TRAP?

1 个答案:

答案 0 :(得分:1)

假设您要将SNMP CommandResponder(已经实现)与SNMP NotificationReceiver结合使用,请查看this example。您基本上可以在同一个Python模块中围绕单个I / O循环连接两个示例(例如transport dispatcher)。

但是,通常,NotificationReceiver驻留在NMS上,而CommandResponder是在托管软件/设备内运行的SNMP代理。

在现有代码中支持SNMP SET需要重构MIB对象的存储方式。在当前示例中,它们保存在不可写入的存储(元组)中,并且MIB对象不是设计用于更改其存储值(它们返回常量)。所以你需要改变这种方式。

否则支持SNMP SET很简单 - 只需添加如下条件:

...
elif reqPDU.isSameTypeWith(pMod.SetRequestPDU()):
    for oid, val in pMod.apiPDU.getVarBinds(reqPDU):
        if oid in mibInstrIdx:
            # put your MIB instrumentation update code here
            # smith like this, but not exactly:
            mibInstrIdx[oid] = mibInstrIdx[oid].clone(val)
            varBinds.append((oid, mibInstrIdx[oid](msgVer)))
        else:
            # No such instance
            varBinds.append((oid, val))
            pendingErrors.append(
                (pMod.apiPDU.setNoSuchInstanceError, errorIndex)
            )
            break

进入cbFun