2017-09-26 261 views
0

我需要那种SNMP v2c的代理(在python),其中:SNMP代理

  • snmpset命令从命令
  • 读值反应并将它写入YAML文件
  • 运行自定义行动(喜欢在不同的线程并以某种方式回复成功snmpset命令):
    • 运行另一个snmpset到不同的机器,或
    • SSH用户@主机和运行一些命令,或
    • 运行一些本地工具

和:

  • SNMPGET命令
  • 校验值的反应在yaml文件中请求oid
  • 返回此值

我知道pysnmp,但文档只是混淆了我。我可以形象我需要某种类型的命令responder(我需要snmp v2c)和一些对象来存储配置/值形式yaml文件。但我完全失去了。

回答

1

我认为你应该能够实现所有与pysnmp。从技术上讲,这不是SNMP代理,而是SNMP命令响应者。

你或许可以采取this script为原型,并实现你的(单)cbFun它(像在原型)接收其类型(GETSET你的情况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编写一个自定义变体插件,该插件很大程度上可以完成您所描述的任务。

+0

我看到这个例子,我觉得它最适合我。通过处理程序你的意思是cbFun?我应该为获取和设置定义两个cbFun还是只定义一个(有一些if内部)?我如何注册/链接到transportDispatcher? – emcek

+0

@emcek更新了答案 –