当前位置: 首页 > 知识库问答 >
问题:

使用Pysnmp从代理端动态更新SNMP表

米子轩
2023-03-14

我一直在寻找一种在SNMP代理运行期间使用pysnmp动态更新SNMP表的方法。但到目前为止没有运气。。。

该表已经在MIB文件中定义(见下文),但似乎我需要覆盖其“readGet()”方法,以便从当前系统状态返回正确的数据。

根据http://pysnmp.sourceforge.net/examples/v3arch/asyncore/agent/cmdrsp/agent-side-mib-implementations.html#implementing-conceptual-table指示

我能够在SNMP代理启动之前和SNMP代理启动之后构建具有预定义值的静态表:

# Register an imaginary never-ending job to keep I/O dispatcher running forever
self.snmpEngine.transportDispatcher.jobStarted(1)
# Run I/O dispatcher which would receive queries and send responses
try:
    self.snmpEngine.transportDispatcher.runDispatcher()
except:
    self.snmpEngine.transportDispatcher.closeDispatcher()
    raise

它能够返回我的期望值。

但对于我的系统,它将动态生成许多报警信息,这些信息需要更新到SNMP的MIB表中,该表允许其他SNMP管理器发送“get/getNext”以从我的系统获取报警信息。

所以我想知道

>

  • 有办法在pysnmp中做到这一点吗?
  • 还是我必须始终静态更新我的警报表?然后在每次更新操作后重新启动SNMP代理?
  • 或者我必须在SNMP代理启动期间使用所有可能的2147483647实例初始化我的警报表?并使用“name[-1]”从每个查询中获取索引/行号? <块引用>

    如果是这样,getNext查询怎么样?它会忽略那些空表行吗?或者它总是返回下一个,即使它是一个虚拟的?

    @Ilya Etinof pysnmp专家。如果你有时间,你能帮我吗?

    Br,-大鹏娇

    1.

    该报警表的MIB文件定义(删除了一些敏感信息)

    alarmTable = MibTable((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3))
    alarmEntry = MibTableRow((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1)).setIndexNames((0, "MY-MIB", "alarmIndex"))
    alarmIndex = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 1), Integer32().subtype(subtypeSpec=ValueRangeConstraint(1, 2147483647))).setMaxAccess("readonly")
    alarmId = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 2), Integer32().subtype(subtypeSpec=ValueRangeConstraint(1, 2147483647))).setMaxAccess("readonly")
    alarmName = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 3), DisplayString().subtype(subtypeSpec=ValueSizeConstraint(0, 255))).setMaxAccess("readonly")
    alarmSeverity = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 4), AlarmSeverity()).setMaxAccess("readonly")
    alarmTime = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 5), DateAndTime()).setMaxAccess("readonly")
    alarmType = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 6), AlarmType()).setMaxAccess("readonly")
    alarmSource = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 7), DisplayString().subtype(subtypeSpec=ValueSizeConstraint(0, 255))).setMaxAccess( "readonly")
    alarmCategory = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 8), DisplayString().subtype(subtypeSpec=ValueSizeConstraint(0, 255))).setMaxAccess("readonly")
    alarmProbableCause = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 9), ProbableCause()).setMaxAccess("readonly")
    alarmComparable = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 10), DisplayString().subtype(subtypeSpec=ValueSizeConstraint(0, 255))).setMaxAccess("readonly")
    alarmAdditionalText = MibTableColumn((1, 3, 6, *, *, *, *, *, *, *, *, *, , 3, 1, 11), DisplayString().subtype(subtypeSpec=ValueSizeConstraint(0, 255))).setMaxAccess("readonly")
    
  • 共有1个答案

    韩耘豪
    2023-03-14

    可以使用pysnmp维护动态SNMP表。解决此问题的方法有很多:

    >

  • 通过在此示例脚本中调用mibInstrumentation.writeVars定期更新表(通过表回调或专用线程)。背面包括在运行更新时提供新数据和查询的延迟。但不需要太多编码。

    扩展MibTableCol列类并实现其readGet/readGetNext方法以在被调用时查看您的数据并返回OID/值对。这里的复杂性是要处理GETNEXT查询,您需要保持某种一致的OID排序并搜索下一个大于给定的。

    抛弃整个pysnmp的SMI架构体系,并在您必须从中读取数据的任何数据源之上实现您自己的MIB控制器。您需要实现readGet(简单)和可能的readGetNext(更复杂,因为需要稳定的OID排序)方法。这样,您就可以不必学习相当通用和复杂的pysnmp SMI实现的细节,而是专注于您的最低要求。

    回答您的其他问题:

    • 仅仅为了更新服务的日期而重启服务不是一个好主意

  •  类似资料:
    • 我正在尝试编写一个SNMP代理,可以用来监视python进程。为此,我编写了一个使用pysnmp实现SNMP代理的类。 该代理的核心部分工作正常(即,我可以使用snmpwalk询问代理,并且返回的数据是正确的)。为了更新代理MIB值,我在自己的线程中运行了dispatcher()。我的问题是,当使用snmpwalk与代理交谈时,我会超时(snmpwalk正确地遍历MIB,但随后超时)。 有人知道我

    • 我使用snmp4j库成功创建了SNMP代理,这是引用代码。 我的问题是如何让这个代理始终运行以监听来自经理的所有传入OID。??

    • 我需要从单个客户端/管理器进程向多个snmp代理发送get请求/接收响应。我已经基于以下URL实现了客户端/代理:http://www.jitendrazaa.com/blog/java/snmp/create-snmp-client-in-java-using-snmp4j/http://www.jitendrazaa.com/blog/java/snmp/creating-snmp-agent

    • 我已使用snmp4j api在SNMP代理上创建,但SNMP表注册存在问题 一旦我注册了表和表中的行。然后,如果我在表中设置值,所有行都会设置相同的值。我已经从JSON创建了snmp表 如果我设置了值,请在下表中 .1.3.6.1.4.1.1.201.6.2。它为下表中注册的所有行设置值。是否有人知道如何使用snmmpj代理正确注册和设置值。

    • 我是SNMP新手,谢谢你的支持......我有一个子代理的现有Perl脚本,在尝试运行它时出现了以下问题:代理似乎连接到“默认”snmpd deamon,该deamon被配置为主代理(“master agentx”行存在于snmpd.conf中)。此时,脚本将一些值分配给我的MIB中的对象。但是,当我然后在master-agent上执行snmpwalk或snmpget时,我得到(对于v1查询)“结

    • 本文向大家介绍浅谈Java代理(jdk静态代理、动态代理和cglib动态代理),包括了浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)的使用技巧和注意事项,需要的朋友参考一下 一、代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强。加入一些非业务性代码,比如事务、日志、报警发邮件等操作。 二、jdk静态代理 1、业务接口 2、业务实现类 3、代理类