嵌入式linux下搭建snmp服务,编写自定义mib库,支持ipv6

做这个需要交叉编译net-snmp

在官网http://www.net-snmp.org下载源码包,我用的是5.7.3

配置交叉编译器,我的交叉编译器是在/usr/local/arm-2014.05/bin

export PATH=$PATH:/usr/local/arm-2014.05/bin

解压源码包之后,cd net-snmp-5.7.3,执行

./configure --build=i686-linux --host=arm-linux  CC=arm-linux-gcc  --with-endianness=little   --prefix=/opt/net-snmp --with-ar=arm-linux-ar  --disable-embedded-perl --without-perl-modules -enable-mini-agent -disable-mibs  --with-mib-modules=dlmod --enable-ipv6 --enable-shared

之后make install后,会安装在/opt/net-snmp下

在configure中,当我们选择了--enable-mini-agent这个选项之后,将会不自动加载大多数modules,其中包括dlmod  mudules,这个模块是用于加载动态库模块。为了使用这个模块,我们需要在选择  --enable-mini-agen之后。再选择--with-mib-modules=dlmod这个选项,同时还要将在agent/mibgroup/ucd-snmp下的dlmod的C文件跟H文件移到agent/mibgroup下,之后就可以使用自己编译的mib库了。

下面是编写一个mib库的基本步骤

编写mib库

先准备一个mib文件,我这里是RFC1628_UPS_MIB.MIB

env MIBS="+./RFC1628_UPS_MIB.MIB" mib2c upsMIB

之后会生成upsMIB.c和upsMIB.h,里面包含所有的点数据接口,可以通过文件或者共享内存的方式获取数据并填充到这些接口上,之后将此编译成so

将生成的.so文件的路径添加到snmpd.conf配置文件中,打开snmpd.conf添加内容如下(样例):

dlmod xxx (你so文件所在地址)/xxx.so

这样以后启动snmpd时就自动加载这个模块了。

编译出.so文件后就可以把该文件链接到snmpd中了,命令如下(该命令用于服务检测,启动以后该终端就一直检测snmp包的信息):

snmpd -f -d -L -Dxxx,dlmod -Dxxx -c /usr/local/share/snmp/snmpd.conf

trap 添加

env MIBS="+/opt/net-snmp/RFC1628_UPS_MIB.MIB" mib2c -c mib2c.notify.conf upsMIB

以下为例程

extern const oid snmptrap_oid[] = {1,3,6,1,6,3,1,1,4,1,0};

const size_t snmptrap_oid_len = OID_LENGTH(snmptrap_oid);

void init_TestTraps(void)

{

    DEBUGMSGTL(("TestTraps","Initializing\n"));

    snmp_alarm_register(1,SA_REPEAT,read_cpudata_repeat, NULL);

}

int

send_cpuRatioHigh_trap( void )

{

    netsnmp_variable_list  *var_list = NULL;

    const oid cpuRatioHigh_oid[] = { 1,3,6,1,4,1,1000,1,1 };

    const oid TestTrapDescription_oid[] = { 1,3,6,1,4,1,1000,1,2,1, 0 };

    static char TestTrapDescription[50];

    strcpy(TestTrapDescription,"CPU使用率过高");

    /*

     * Set the snmpTrapOid.0 value

     */

    snmp_varlist_add_variable(&var_list,

        snmptrap_oid, snmptrap_oid_len,

        ASN_OBJECT_ID,

        cpuRatioHigh_oid, sizeof(cpuRatioHigh_oid));

    

    /*

     * Add any objects from the trap definition

     */

    snmp_varlist_add_variable(&var_list,

        TestTrapDescription_oid, OID_LENGTH(TestTrapDescription_oid),

        ASN_OCTET_STR,

        /* Set an appropriate value for TestTrapDescription */

        NULL, 0);

    /*

     * Add any extra (optional) objects here

     */

    /*

     * Send the trap to the list of configured destinations

     *  and clean up

     */

    send_v2trap( var_list );

    snmp_free_varbind( var_list );

    return SNMP_ERR_NOERROR;

}

void judge_send_cputrap(int cpu)

{

    static unsigned int cputrap_clientreg = 0;

    if(cpu > 80)

    {

        if(cputrap_clientreg == 0){

            send_cpuRatioHigh_trap();

            cputrap_clientreg = snmp_alarm_register(5,SA_REPEAT,send_cpuRatioHigh_trap,NULL);

        }

    }

    else

    {

        if(cputrap_clientreg != 0)

        {

            snmp_alarm_unregister(cputrap_clientreg);

            cputrap_clientreg = 0;

        }

    }

}

void read_cpudata_repeat(unsigned int clientreg, void *clientarg)

{

    int cpu = 90;

    judge_send_cputrap(cpu);

}

猜你喜欢

转载自blog.csdn.net/kof98765/article/details/120887309
今日推荐