zoukankan      html  css  js  c++  java
  • NetSNMP开源代码学习——mib扩展

    扩展MIB库
    关于MIB库的扩展网络文章非常多,这里我主要参考了http://blog.csdn.net/qq_27204267/article/details/51595708,这篇文章介绍的比较简单,流程清晰,内容全面,没有太多的理论讲解。
    闲言少叙,参考前人经验直接在我的环境里来个“傻瓜”操作并记录步骤,防止忘记。哎,年纪大了健忘啊^^^^^^同时为了后续的移植操作和深入分析做基础。
    1. 编译MIB库文件

    一. 编译MIB库文件

    -- Test-MIB.my
        Test-MIB DEFINITIONS ::= BEGIN
     
            IMPORTS
                OBJECT-GROUP, MODULE-COMPLIANCE, NOTIFICATION-GROUP    
                    FROM SNMPv2-CONF    
                enterprises, Integer32, Unsigned32, OBJECT-TYPE, MODULE-IDENTITY, 
                NOTIFICATION-TYPE    
                    FROM SNMPv2-SMI    
                DisplayString    
                    FROM SNMPv2-TC;
        
    -- October 09, 2002 at 14:50 GMT
            -- 1.3.6.1.4.1.16535
            Test MODULE-IDENTITY 
                LAST-UPDATED "200210091450Z"        -- October 09, 2002 at 14:50 GMT
                ORGANIZATION 
                    ""  
                CONTACT-INFO 
                    ""  
                DESCRIPTION 
                    "Video's Server MIB."
                ::= { enterprises 16535 }
        
    --  Node definitions
    -- This part will include all details about the Test.
            -- 1.3.6.1.4.1.16535.1
            Time OBJECT IDENTIFIER ::= { Test 1 } 
    
        
            -- 1.3.6.1.4.1.16535.1.1
            GetTime OBJECT-TYPE
                SYNTAX DisplayString (SIZE (0..100))
                MAX-ACCESS read-only
                STATUS current
                DESCRIPTION
                    "Example : 2013/4/11"
                ::= { Time 1 }
        END
    
    -- Test-MIB.my

    二. 生成源代码并修改实现的函数

    /*
     * Note: this file originally auto-generated by mib2c using
     *        $
     */
    
    #include <net-snmp/net-snmp-config.h>
    #include <net-snmp/net-snmp-includes.h>
    #include <net-snmp/agent/net-snmp-agent-includes.h>
    #include "Test.h"
    #include <time.h>
    
    /** Initializes the Test module */
    void
    init_Test(void)
    {
        const oid       GetTime_oid[] = { 1, 3, 6, 1, 4, 1, 16535, 1, 1 };
    
        DEBUGMSGTL(("Test", "Initializing
    "));
    
        netsnmp_register_scalar(netsnmp_create_handler_registration
                                ("GetTime", handle_GetTime, GetTime_oid,
                                 OID_LENGTH(GetTime_oid), HANDLER_CAN_RONLY));
    }
    
    int
    handle_GetTime(netsnmp_mib_handler *handler,
                   netsnmp_handler_registration *reginfo,
                   netsnmp_agent_request_info *reqinfo,
                   netsnmp_request_info *requests)
    {
        /*  
         * We are never called for a GETNEXT if it's registered as a
         * "instance", as it's "magically" handled for us.  
         */
         /*
         * a instance handler also only hands us one request at a time, so
         * we don't need to loop over a list of requests; we'll only get one. 
         */
    
        time_t t;
        switch (reqinfo->mode) {
        case MODE_GET:
            time(&t);
            char szTime[100];
            snprintf(szTime,100,"%s",ctime(&t));
            snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                                     /*
                                      * XXX: a pointer to the scalar's data 
                                      */ szTime,
                                     /*
                                      * XXX: the length of the data in bytes 
                                      */ strlen(szTime));
            break;
    
    
        default:
            /*
             * we should never get here, so this is a really bad error 
             */
            snmp_log(LOG_ERR, "unknown mode (%d) in handle_GetTime
    ",
                     reqinfo->mode);
            return SNMP_ERR_GENERR;
        }
    
        return SNMP_ERR_NOERROR;
    }

    三. 静态库编译安装

    ./configure --prefix=/usr/local/net-snmp --with-default-snmp-version=2c --with-sys-contact="xxx@163.com" --with-sys-location="China" --with-logfile="/var/log/snmpd.log" --with-persistent-directory=/var/net-snmp/ --enable-applications --enable-ipv6 --with-out-transports="TCP TCPv6 Unix" --with-transports="Callback UDP UDPIPv6"  --disable-nls --enable-shared --enable-static --disable-embedded-perl --with-mib-modules=Test

    将.c 和.h文件移动到源码目录下,我的是/opt/net-snmp-5.7.3/agent/mibgroup。
    运行configure命令,并且添加--with-mib-modules=Test,进行MIB库文件的配置。
    运行make && make install编译安装
    测试:
    执行命令:snmpget -v2c -c public localhost Test-MIB:GetTime.0测试

    四. 生成共享库编译
    具体编译命令为:  

    gcc -I `net-snmp-config --cflags` -fPIC -shared -g -O0 -o Test.so Test.c  `net-snmp-config --libs`

    修改snmpd.conf,添加一行:
    dlmod Test /usr/local/net-snmp/share/snmp/mibs/Test.so
    测试:
    重新configure(不要--with-mib-modules=Test),make,make install,安装snmpd程序
    执行命令:snmpget -v2c -c public localhost Test-MIB:GetTime.0测试

  • 相关阅读:
    pip不是内部或外部命令也不是可运行的程序或批处理文件的问题
    动态规划 leetcode 343,279,91 & 639. Decode Ways,62,63,198
    动态规划 70.climbing Stairs ,120,64
    (双指针+链表) leetcode 19. Remove Nth Node from End of List,61. Rotate List,143. Reorder List,234. Palindrome Linked List
    建立链表的虚拟头结点 203 Remove Linked List Element,82,147,148,237
    链表 206 Reverse Linked List, 92,86, 328, 2, 445
    (数组,哈希表) 219.Contains Duplicate(2),217 Contain Duplicate, 220(3)
    重装系统
    java常用IO
    端口
  • 原文地址:https://www.cnblogs.com/myblesh/p/6492227.html
Copyright © 2011-2022 走看看