2012-09-18 46 views
2

我想用net-snmp显示各种MIBS列表,并显示与SNMP树结构相关的其他信息。如何在C/C++中使用net-snmp MIB API列出SMIv1 MIBS?

现在事实证明,我的客户的SMIv1 MIBS没有显示在列表中,但是通过net-snmp正确加载。

示例net-snmp代码遍历内存中的MIB结构,并假定我们在树和树中的MIB和MODULE-IDENTITY注之间存在SMIv2双射。所以当我们找到一个MODULE-IDENTITY节点时,我们找到了一个MIB。

有没有人知道列出SMIv1 MIBS的正确方法是什么net-snmp(?或任何解决方法)

// Read mibs and obtain memory structures 
    struct tree * head = read_all_mibs(); 
    // Walk down the SNMP tree 
    for (struct tree * tp = head; tp; tp = tp->next_peer) 
    { 
    // Module-indentity 
    if (tp->type == TYPE_MODID) 
    { 
     // XXX We found a SMIv2 MIB, but SMIv1 MIBs have no MODULE-IDENTITY node 
    } 
    } 

注:我发现了一个转换器smidump(一个命令行工具,或者在http://www.ibr.cs.tu-bs.de/projects/libsmi/tools/作为Web服务),但它并没有增加一个模块IDENTITY节点的MIB 。

编辑:请注意,任何将旧版SNMP MIB转换为更新版本(SMIv2样式)的工具都可以解决此问题。在特定方向上的任何帮助?

一个建议可能是,在没有MODULE-标识符,找到MIB(有时MIB会在许多不同的和无关的地方添加节点所以这是行不通的)的对象标识符。使用节点,我可以显示与该MIB相关的大部分树。

回答

0

我的同事和我发现解决该问题的唯一解决方案是将“顶级”MIB(s)转换为更类似SNMPv2的结构。即1)导入类型MODULE-IDENTITY,2)用MODULE-IDENTITY声明替换顶级节点。

... 
    IMPORTS 
     MODULE-IDENTITY 
     FROM 
     SNMPv2-SMI 
    ... 

    -- Removed top-level node 
    -- compaq    OBJECT IDENTIFIER ::= { enterprises 232 } 

    -- Add a fake module-identity node 
    compaq MODULE-IDENTITY 
    LAST-UPDATED "200111120000Z" 
    ORGANIZATION "COMPAQ" 
    CONTACT-INFO 
      "[email protected]" 
    DESCRIPTION 
      "why does compaq still provide these mibs in 2013?" 
    REVISION  "9407210000Z" 
    DESCRIPTION 
      "Normal fixed MIB module." 
    ::= { enterprises 232 } 

有了这个功能,在net-snmp库将为我们展示一个模块的身份节点为我们的MIB,就像所有其他的SNMPv2的MIB ..

0

它使用UDP数据报。您可以获取net-snmp或snif UDP流量的来源(看起来更简单)。

+0

感谢您的评论,但这是题外话,太。我实际上是在C/C++中使用net-snmp API加载MIB​​。 –

0

net-snmp是在设备上运行snmp的代理(即服务器)。你用什么客户端(即mib浏览器或命令行工具,如snmp-get/walk等)来查询它?你的客户端是否也加载了与服务器相同的MIB?

我认为你使用SNMPv1。您是否正在使用正确的访问团体,即您正在从客户端(MIB浏览器或命令行snmp客户端)输入正确的密码来验证SNMP代理/服务器?

我建议使用基于GUI的客户端(称为SNMP管理器)来查找问题。如MGSOftMIBBrowser

试用版是免费的。你会看到诸如失败密码(snmpv1的团体名称)等尝试的结果。

在其他几个可能的问题可能是:

SMIv1的是旧格式。所以你需要确保你使用的net-snmp版本支持它。

如果您使用的是SNMPv2,则可能是您正在使用正确的社区进行身份验证。但是,您的社区没有您希望看到的mib的阅读权限。 SNMPv2引入了视图的概念,在该概念中,您可以允许某个特定社区(用户)可以看到oid树的某个子集。

如果它是非标准mib(即,不是核心snmp mib的一部分),你应该发现它是完整的OID(类似于1.3.4.1.2 ...),并且首先检查GUI(MIB浏览器)是否存在,或者调试获取特定oid的请求。

也明白一个非标准mib需要在代理和客户端都加载。否则,客户端将不会知道mib的详细信息,以便能够代表它查询请求。

+0

感谢您的评论(但这是题外话):更新的标题更加明确。我将尝试MIB浏览器(不是查找问题,而是查看它们是如何处理事实上的 - 从人机工程学角度来讲 - MIB是SMIv1格式的)。 –

+0

即使你正在用语法进行编程,你是否已经在程序中加载了mib?你的代码不会走mib,除非它先前已经加载,即你的程序首先需要oid信息以便能够加载不属于核心mib的mib – fayyazkl

+0

或者你可以使用环境设置或使用read_all_mibs()加载MIB​​。 –

相关问题