SNMP - C - 从MIB

时间:2015-06-02 16:26:51

标签: c snmp net-snmp snmpd

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

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

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

我有一棵树想要实现

Sample OID Tree

我的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。我还在努力抓住一切。

1 个答案:

答案 0 :(得分:2)

这里有很多问题,说实话,需要一个超长的帖子才能回答这些问题。因此,我会在较高的层次上回答它们,然后为您提供一系列链接,以便阅读更长时间和更深入的文章。

首先,写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问题时,它会询问您,以上是“标量”。表格可能会出现在您的项目中,因为每个人似乎最终会得到表格!祝你好运!