如何使用 pysnmp 删除没有 "RowStatus" 字段的 SNMP Table 条目?

How to use pysnmp to delete a SNMP Table entry without "RowStatus" field?

我想知道那些没有 "RowStatus" 字段的 SNMP Table。 我如何删除具有给定索引的条目?

Table 条目由

添加
self.snmp_context.getMibInstrum().writeVars()

但是我没有找到任何可用于删除条目的方法? @Ilya Etingof 可以给出一些提示吗?

Br, -焦大鹏

如果您阅读 SNMP RFC,您会发现只有在 table 定义了 EntryStatus 列(如果它是 SMIv1 table)或使用定义的 RowStatus 列(如果它是 SMIv2 table)。

带有 EntryStatus 列的 SMIv1 表

EntryStatus 列用于管理 SMIv1 tables 中概念行的创建和删除。这表示 table 条目的状态。状态列可以有以下内容。

  • valid(1) - 表示该行存在并且可以使用。
  • createRequest(2) - 由希望创建行的经理提供。
  • underCreation(3) - 表示正在创建该行。
  • invalid(4) - 由希望使 相应条目。

如果经理希望添加一行,则应将 entryStatus 列设置为 createRequest(2)。创建后,代理立即将此对象设置为 underCreation(3)。该条目在配置之前保持 underCreation(3) 状态。然后它的值设置为valid(1)。如果状态保持 underCreation(3) 的时间异常长,则代理将状态设置为 invalid(4).

具有 RowStatus 列的 SMIv2 表

在 SMIv2 tables 中,RowStatus 列用于管理概念行的创建和删除。此列有六个定义值,如下所示。

  • active(1) - 表示具有所有列的概念行是 可供受管设备使用。
  • notInService(2) - 表示代理中存在概念行,但受管设备无法使用。
  • notReady(3) - 表示代理中存在概念行,行中的一个或多个必需列未实例化。
  • createAndGo(4) - 由希望创建概念行的新实例并使其可供使用的经理提供。
  • createAndWait(5) - 由希望创建概念行的新实例但不使其可供使用的经理提供。
  • destroy(6) - 由希望删除与现有概念行关联的所有实例的经理提供。

有一些 SNMP 代理确实实现了 adding/deleting 行的非标准机制。所以在这种情况下,它是特定于实现的。但总的来说,如果没有 EntryStatus/RowStatus.

就无法做到这一点

使用 pysnmp,对 SNMP 代理的所有更改都是通过 .writeVars() 调用完成的。它的设计方式是为代理端和管理器启动的操作重用代码。所以修改的细节由传递给调用的 OID-value 对决定。

正如@andrew-komiagin 所说,删除 SNMP table 行的方法是将 SNMP SET(或 .writeVarsRowStatus 列值设置为 destroy(6)。如果你的 table 不支持 RowStatus 我想最不干扰的方法是将它添加到 ASN.1 或 Python MIB.