PySNMP 如何处理具有读取创建权限的表?

How does PySNMP handle tables with read-create permissions?

我是 SNMP 的新手,发现很难理解 PySNMP 中的一些机制。我需要实现一个具有读取创建权限的 table 来监视和控制我网络上的网桥。我认为,如果我能更清楚地了解其中一段示例代码,以了解当经理尝试创建新行时框架中发生的情况,将会很有帮助。

我一直在检查 implementing a conceptual table 的示例代码并执行示例 snmpset/walk 命令:

    $ snmpset -v2c -c public 127.0.0.1 1.3.6.6.1.5.2.97.98.99 s “my value”
    $ snmpset -v2c -c public 127.0.0.1 1.3.6.6.1.5.4.97.98.99 i 4
    $ snmpwalk -v2c -c public 127.0.0.1 1.3.6

据我所知,set 命令起作用是因为 MIB 承诺 exampleTableColumn2 描述 OctetString 标量。这个数据created/stored 是怎么被代理的?是用后缀“.97.98.99”创建的通用标量对象,还是此信息以某种方式与 exampleTableColumn2 的实例相关联?如果我随后 运行 在我们刚刚创建的对象上执行 snmpget 或 snmpset 命令,在框架看来我将与什么进行交互?

在现实世界的实现中,代理实际上会查询设备以在某些内部 table 中创建一个新条目,并且您需要具有修改后的 readGet/writeCommit 方法的自定义标量对象,但示例代码尚未建立标量 类 来实现 get/set 方法。通过了解在 PySNMP 中应如何处理具有读取-创建权限的列,我认为我可以实现更强大的代理应用程序。真诚地感谢任何 help/clarity。

How is this data created/stored by the agent? Is a generic scalar object created with the suffix ".97.98.99," or is this information somehow associated with the instance of exampleTableColumn2?

这是一个 OctetString 类型的通用标量值,与 MibTableColumn 类型的 tree of objects(MIB 树)中的叶节点关联。在 MIB 树中,您会发现一些节点类型,每个节点类型都表现出不同的行为(请参阅文档字符串),但在其他方面它们非常相似。每个节点都由一个 OID 标识。

If I were to subsequently run an snmpget or snmpset command on the object we just created, what would I be interacting with in the eyes of the framework?

负责您正在查询的 OID 的 MIB 树对象将收到 read* (for SNMP GET) or read*Next(对于 SNMP GETNEXT/GETBULK)它应该用值响应的事件。

In a real-world implementation, the agent would really be querying the device to create a new entry in some internal table, and you would need custom scalar objects with modified readGet/writeCommit methods

有几种方法可以解决这个问题,到目前为止我一直在研究的方法是重写其中一些 read*/read*Next/write* 方法以读取或写入值 from/to 其最终来源(您的内部 table)。

为了简化您的代码并使您的代码与您正在实施的 MIB 保持同步,pysmi 库可以通过 Jinja2 templates 将 MIB 转换为带有存根的 Python 代码。只要 SNMP 请求触发读或写事件,您就可以从这些存根访问您的内部 table。您可以将自定义代码放入这些存根中 and/or 放入生成这些存根的 Jinja2 模板中。

除了实施您自己的 SNMP 代理,您还可以考虑 general purpose tool, which is driven by the same technology