【问题标题】:Translate OID value pairs from MIB textual convention using pysnmp使用 pysnmp 从 MIB 文本约定转换 OID 值对
【发布时间】:2014-11-24 04:20:41
【问题描述】:

我正在尝试编写一段代码,它接受一个 JSON 对象,其中 OID 作为键,OID 值作为值。一个例子是:

{".1.3.6.1.4.1.562.29.6.2.3": "Link Down",
 ...
}

收到此 JSON 对象后,我想使用 PySNMP 转换 OID 和 OID 值,但我不知道如何根据相应 MIB 文件中定义的文本约定转换 OID 值。

一个示例 MIB 文件将定义:

TruthValue ::= TEXTUAL-CONVENTION
     STATUS       current
     DESCRIPTION
             "Represents a boolean value."
     SYNTAX       INTEGER { true(1), false(2) }

给定一个 OID 和一个遵循上述文本约定的 OID 值,我想翻译:

{"OID": 1,...} 转为{"OID": true,...}

PySNMP 可以做到这一点吗?

【问题讨论】:

    标签: python snmp mib pysnmp


    【解决方案1】:

    这可以通过 pysnmp 实现:

    from pysnmp.smi import builder
    
    mibBuilder = builder.MibBuilder()
    TruthValue, = mibBuilder.importSymbols('SNMPv2-TC', 'TruthValue')
    print(TruthValue(1).prettyPrint()) # prints 'true'
    

    但是,通常您必须以某种方式将 OID 映射到值类型(其中一些可能会解析为 TEXTUAL-CONVENTIONS)。这可以通过硬编码 OID-> 应用程序中特定 OID 的类型映射以特殊方式完成,但更通用的解决方案是使用 pysnmp MIB 服务:

    from pysnmp.smi import view, builder
    
    mibViewController = view.MibViewController(builder.MibBuilder())
    varName = mibvar.MibVariable('1.3.6.1.6.3.10.2.1.1.0').loadMibs('SNMP-FRAMEWORK-MIB').resolveWithMib(mibViewController)
    print(varName.getMibNode().getSyntax().clone('12341234'))
    

    以上示例将获取 1.3.6.1.6.3.10.2.1.1.0 的值类型并将 12341234 值转换为关联类型。

    更新:

    考虑使用自 pysnmp 4.3 起可用的 higher-level interface 到 MIB 服务

    【讨论】:

    • 感谢您的回复。我尝试使用遵循文本约定的 MIB 文件和 OID 来实现您更通用的解决方案,并且我包含了 from pysnmp.entity.rfc3413.oneliner import mibvar 以访问 mibvar。打印语句是否应该输出翻译后的 OID 值?对我来说print(varName.getMibNode().getSyntax().clone('2')) 的输出是未翻译的整数2
    • 是的,如果出现以下情况,您应该获得翻译值:1) 您正在使用的 OID 具有关联类型,即 TEXTUAL-CONVENTION,并且 2) 您已加载 MIB,其中定义了您正在使用的 OID和 3)您尝试翻译的值(例如 2)在其 TEXTUAL-CONVENTION 中定义了符号表示。
    • 我发现使用 prettyPrint() 像这样:print(varName.getMibNode().getSyntax().clone('12341234').prettyPrint())printed 来自我的测试 MIB 的翻译,但我似乎对其他 MIB 和 resolveWithMIB 函数有问题。我收到pysnmp.smi.error.SmiError: Short OID for index NnExtAlarmEventType()。最好在另一个问题中问这个问题吗?
    • 请记住,如果 OID 充当表索引,则它必须可转换为索引值。但这是一个完全不同的问题。代码和 MIB 示例也会有所帮助。
    • 感谢您的帮助!我在这里发布了另一个问题:stackoverflow.com/questions/27224002/…
    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多