Linux下基于net-snmp的Agent扩展开发

时间:2021-12-14 11:35:54

Linux下基于net-snmp的Agent扩展开发

一.背景技术及术语解释

        Net-SNMP是一个免费的、开放源码的SNMP实现,其中包含了一个Agent模块,通过这个模块可以获取到服务器的相关信息;在源码中实现了对服务器部分信息的获取,我们同样可以通过扩展mib库文件来实现获取我们需要的服务器的信息和管理服务器,并可以在其中添加一个通信模块来获取服务器上一些服务的信息。

二.方案详细描述

1.Linux下Agent扩展方法简介

1.1添加自定义mib库的实现文件

       1. 在net-snmp的源码目录(net-snmp-5.7.1/agent/mibgroup)下添加一个文件夹hikvision;

       2. 将通过新增mib库生成的C代码文件拷贝到hikvision文件夹;

       3.在net-snmp-5.7.1/agent/mibgroup目录下新建一个文件hikvision.h, 文件内容如下:

      Linux下基于net-snmp的Agent扩展开发

         其中hikHardwareThreshold为需要添加的文件。

1.2 net-snmp工程Makefile的生成

        在net-snmp源码目录(net-snmp-5.7.1/)下执行如下命令来生成Makefile文件,分以下三种情况。


情况1: 扩展的MIB库的实现文件未用到第三方库和调用其他文件中的函数

 [root@CentOS  agent]# ./configure--enable-static --enable-shared=no

--disable-applications --disable-manuals--disable-scripts

--enable-mib-config-checking --with-cc=gcc--with-linkcc=g++

 

情况2: 扩展的MIB库的实现文件使用第三方库

[root@CentOS  agent]# ./configure --enable-static --enable-shared=no

--disable-applications --disable-manuals--disable-scripts

--enable-mib-config-checking --with-cc=gcc--with-linkcc=g++

--with-mibs="HIKVISION-MIB"--with-mib-modules="hikvision" CFLAGS="-fPIC -Wall -g"LDFLAGS=-L/root/NMS/lib PERLLDOPTS_FOR_APPS="-pthread -lhpr2-ltinyxml"

 

--with-cc=gcc 编译的时候用gcc

--with-linkcc=g++ 链接的时候用g++

--with-mibs="HIKVISION-MIB"扩展的mib库的名称

--with-mib-modules="hikvision"扩展mib库生成的代码在net-snmp源码目录

(net-snmp-5.7.1/agent/mibgroup)中文件夹的名称

LDFLAGS=-L/root/NMS/lib用到的第三方库所在路径

PERLLDOPTS_FOR_APPS="-pthread-lhpr2 -ltinyxml" 依赖的第三方库的名称

 

当实现扩展MIB库是使用C++编写的时候,需要先将*.cpp文件改为*.c后再执行./configure,否则生成Makefile文件时会找不到扩展的cpp的文件,导致扩展的内容无法编译到Agent中;

./configure执行后,将*.c文件改回*.cpp文件,这时候执行make命令hikvision下的各个cpp文件是无法生成正确的目标文件的,需要在hikvision目录下手动生成相应的目标文件,命令如下:

[root@CentOS agent]# /bin/sh ../../libtool  --mode=compile g++ -I../../include -I.-I../../agent -I../../agent/mibgroup -I../../snmplib   -fno-strict-aliasing -g -O2 -Ulinux -Dlinux=linux  -c -o hikvision/hikHardwareThreshold.lo

hikvision/hikHardwareThreshold.cpp

生成各自的目标文件hikHardwareThreshold.o和hikHardwareThreshold.lo,这些文件会在执行make命令时链接到Agent的可自行程序。

 

情况3:扩展的MIB库的实现文件调用了其他cpp文件中的函数

        被调用的cpp文件的目标文件同样需要在hikvision下手动生成,方法如情况2中所述。

执行./configure的参数同情况2,在执行了./configure后需要手动修改源码目录(net-snmp-5.7.1/agent)下的Makefile文件。例如utils.cpp中的函数被调用了,在Makefile中需要作两处修改:

1)     在mibgroup_list_lo的值中添加mibgroup/hikvision/utils.lo,如下图:

 Linux下基于net-snmp的Agent扩展开发

2)     在mibgroup_list_o的值中添加mibgroup/hikvision/utils.o,如下图:

 Linux下基于net-snmp的Agent扩展开发

1.3编译和测试扩展后的Agent

           执行完./configure后,会生成编译net-snmp所需的Makefile文件,生成Makefile后便可执行make命令来生成Agent的可执行文件snmpd。

 

           在源码目录(net-snmp-5.7.1/agent)下执行如下命令来启动Agent:

           [root@CentOS net-snmp-5.7.1]#./snmpd  -Lo  -f  -C  -c

           /etc/snmp/snmpd.conf  -M /usr/local/share/snmp/mibs

 

           Agent启动后,向Agent发送get请求来获取扩展的OID的值,在有安装snmpget工具的机器上发送如下请求:

           [root@CentOS agent]# snmpget-v 2c -c public 10.64.49.16 1.3.6.1.4.1.1.8092.1.1.0

           若返回信息形如:HIKVISION-MIB::hikCPUNum.0 = INTEGER: 1,则Agent扩展成功。

三.经验总结

         通过扩展Net-SNMP中的Agent可以获取和设置自定义的MIB库中的服务器相关信息,方便对服务器进行管理,同样通过新增的通信模块也可以管理服务器上的各个服务。

此次在Linux对Agent进行功能扩展,在编译Agent时还有很多地方还需要手动修改,还不能直接通过./configure和make编译成功,虽然达到了扩展Agent的目的,但过程还稍显复杂,还需进一步研究net-snmp来简化扩展的过程。

此次扩展之所以复杂是由于扩展Agent使用了C++和一些C++的库,而net-snmp是用C语言编写的,所以编译过程中遇到了许多问题。