【问题标题】:SNMP - C - Implement subtree from MIBSNMP - C - 从 MIB 实现子树
【发布时间】:2015-06-02 16:26:50
【问题描述】:

我一直在使用此处找到的示例开发自己的 SNMP 代理: http://www.net-snmp.org/dev/agent/example_8c_source.html

我希望更好地组织我的树形结构以使其更有意义,这反过来又使使用客户端命令更容易。

我正在使用传统的旧 C API 来实现这一点,并且是示例链接中使用的。

我有一棵树我想实现

我的 MIB:

    MIB-NAME-HERE DEFINITIONS ::= BEGIN

    IMPORTS
        MODULE-IDENTITY, OBJECT-TYPE, Integer32, enterprises,
        NOTIFICATION-TYPE                       FROM SNMPv2-SMI
        OBJECT-GROUP, NOTIFICATION-GROUP        FROM SNMPv2-CONF
    ;

    myProduct MODULE-IDENTITY
        LAST-UPDATED "201505200000Z"
        ORGANIZATION "www.example.com"
        CONTACT-INFO
             "email: support@example.com"
        DESCRIPTION
            "MIB Example."
        REVISION     "201505200000Z"
        DESCRIPTION
            "version 1.0"
        ::= { enterprises 54321 }

    --
    -- top level structure
    --
       IPConfig OBJECT IDENTIFIER ::= { myProduct 1 }
       Services OBJECT IDENTIFIER ::= { myProduct 3 }

    IPConfigValuesGroup OBJECT-GROUP
        OBJECTS { ObjectA,
                  ObjectB,
                  ObjectC
                }

        STATUS current
        DESCRIPTION
               "Group of all blahblah variables."

        ::= { myProduct 4 } <----**How would this affect a client request?**

    --
    -- Values
    --

    ObjectA OBJECT-TYPE
        SYNTAX      OCTET STRING (SIZE(1..4096))
        MAX-ACCESS  read-write
        STATUS      current
        DESCRIPTION
            "Test Example"
        ::= { IPConfig 1 }

    ObjectB OBJECT-TYPE
        SYNTAX      OCTET STRING (SIZE(1..4096))
        MAX-ACCESS  read-write
        STATUS      current
        DESCRIPTION
            "Test Example"
        ::= { IPConfig 2 } 

--MORE STUFF...
    .... END 

我希望能够将相关对象组合在一起,以便用户可以做一个

snmpset -v 2c -c communityNameHere -m MIB-NAME-HERE.txt 10.20.30.40 1.3.6.1.4.1.54321.x.1.3 s "I am a string"

访问IPConfig组下的ObjectC。

问题:如何在我的“子代理”中实现子树?

This is an excerpt from the link shown above.
    /*
     * This array defines the OID of the top of the mib tree that we're
     *  registering underneath.
     * Note that this needs to be the correct size for the OID being 
     *  registered, so that the length of the OID can be calculated.
     *  The format given here is the simplest way to achieve this.
     */
oid             example_variables_oid[] = { 1, 3, 6, 1, 4, 1, 54321, x};

我是否必须声明另一个数组以包括服务 OID?

oid             example_variables_oid[] = { 1, 3, 6, 1, 4, 1, 54321, x, 3};

或者对于每个子树,他们是否需要一个 example.c*-type* 文件?

问题:这个 MIB 能实现我想要的吗?需要做哪些不同的事情?我已经阅读了 OBJECT-GROUPS、SEQUENCE、O'Reily 的书以及 RFC。我仍在努力掌握一切。

【问题讨论】:

    标签: c snmp net-snmp snmpd


    【解决方案1】:

    这里有很多问题,老实说,要回答所有问题需要很长的帖子。所以,我会在高层次上回答它们,然后为您提供一堆链接,以便您阅读更长、更深入的文章。

    首先,编写 mibs 并不完全是直截了当的。关于这个主题的参考最多的书可能是Understand SNMP MIBs,而且非常好(我有一本)。你所有的 mib 写作问题都在那里得到了很好的回答,但是关于你上面的内容有几个要点:

    1) 几乎所有 MIB 对象都应以小写字母开头(除了您尚未使用的表序列)。

    2) 上面的 oid 中没有“x”。例如,您在直接派生到 1.3.6.1.4.1.54321.1.3 的定义中创建了一个树结构。

    3) 暂时放弃对象组子句。一开始它只会让你感到困惑,并且不需要。它只是真正为列出您必须实现的对象编写标准定义以符合 mib(使用一致性声明)。对你现在来说,这根本不需要。干掉整个事情。

    至于编写代码来支持您尝试定义的对象,您需要在您正在编写的代理或子代理中的 C 代码中执行此操作。 Net-SNMP 项目站点上已经有很多关于此的文档,所以你真的应该去那里看看。可以帮助您入门的链接是:

    一般如何为基于 net-smnp 的代理编写 mib 代码:

    http://www.net-snmp.org/wiki/index.php/TUT:Writing_a_MIB_Module
    

    如何使用 mib2c 翻译器生成一些模板代码开始:

    http://www.net-snmp.org/wiki/index.php/TUT:mib2c_General_Overview
    

    更一般地说,Net-SNMP 的所有编码教程都可以在这里找到:

    http://www.net-snmp.org/wiki/index.php/Tutorials#Coding_Tutorials
    

    最后一条评论:您在上面定义的对象称为“标量”。 IE,树中只有一个实例。因此,当您阅读教程或它问您的 mib2c 问题时,以上是“标量”。表格可能会出现在您的项目中,因为每个人似乎最终都会使用表格!祝你好运!

    【讨论】:

    • 解释项目 1) 和 2) - 这些仅用于示例目的。 '54321' 将是我们的组织,'x' 将是一些数字(可能是 1)来区分一种产品(如果我们决定将两种产品合并到 1 个 MIB 中——这在实践中是否推荐?)。我有旧 API 的现有实现
    • cont - 我有一个使用旧 API 代码的现有实现,我能够获取/设置对象并让它们执行适当的“操作”。在 OID 以下的级别创建对象没有问题,但我希望它更有条理。现在我获取/设置的命令指定了 enterprise.54321.(1,2,3,.n)。我想将 enterprise.54321.1.(subgroup-OID).(1,2,3...n) 与不同的子组一起使用,以更好地组织对象。
    • 然后只需添加这样的新行:“mySubProduct OBJECT IDENTIFIER ::= { myProduct 1 }”并将“IPConfig OBJECT IDENTIFIER ::= { myProduct 1 }”更改为“IPConfig OBJECT IDENTIFIER :: = { mySubProduct 1 }"
    • 我需要的解决方案不仅是这样做,而且我需要正确设置我的 variables2 结构。 net-snmp 提供的 example.c 有 cmets,这让我与其他教程页面中的措辞混淆了。我(相信)现在已经把事情搞定了。谢谢韦斯。
    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多