我认为你应该能够实现所有与pysnmp。从技术上讲,这不是SNMP代理,而是SNMP命令响应者。
你或许可以采取this script为原型,并实现你的(单)cbFun
它(像在原型)接收其类型(GET
或SET
你的情况SNMP命令)的PDU和树枝。然后,您可以实现从GetRequestPDU
分支中的.yaml文件中读取的值以及.yaml文件写入,以及在SetRequestPDU
分支中的其他地方发送SNMP SET命令。
我们在这里讲的pysnmp API是低级别的。有了它,你不能要求pysnmp在回调函数之间路由消息 - 它总是对所有消息类型调用相同的回调函数。
但是,您也可以将您的工具基于与SNMPv3模型一起引入的更高级别的SNMP API。有了它,您可以根据它们支持的PDU类型注册自己的SNMP应用程序(有效的回调)。但是鉴于你只需要SNMPv2c支持,我不确定更高级别的API最终是否会得到回报。
请记住,SNMP通常是时间敏感的。如果在其他地方运行本地命令或SSH需要花费几秒钟的时间,标准SNMP管理器可能会开始重试并可能最终超时。如果你看看Net-SNMP的snmpd
是如何工作的 - 它会运行外部命令并将结果缓存几秒钟。这可以让SNMP管理器最终得到一个稍微过时的响应。
或者,您可以考虑为SNMP simulator编写一个自定义变体插件,该插件很大程度上可以完成您所描述的任务。
我看到这个例子,我觉得它最适合我。通过处理程序你的意思是cbFun?我应该为获取和设置定义两个cbFun还是只定义一个(有一些if内部)?我如何注册/链接到transportDispatcher? – emcek
@emcek更新了答案 –