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, 檔案内容如下:
其中hikHardwareThreshold為需要添加的檔案。
1.2 net-snmp工程Makefile的生成
在net-snmp源碼目錄(net-snmp-5.7.1/)下執行如下指令來生成Makefile檔案,分以下三種情況。
情況1: 擴充的MIB庫的實作檔案未用到第三方庫和調用其他檔案中的函數
[[email protected] 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庫的實作檔案使用第三方庫
[[email protected] 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目錄下手動生成相應的目标檔案,指令如下:
[[email protected] 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,如下圖:
2) 在mibgroup_list_o的值中添加mibgroup/hikvision/utils.o,如下圖:
1.3編譯和測試擴充後的Agent
執行完./configure後,會生成編譯net-snmp所需的Makefile檔案,生成Makefile後便可執行make指令來生成Agent的可執行檔案snmpd。
在源碼目錄(net-snmp-5.7.1/agent)下執行如下指令來啟動Agent:
[[email protected] 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工具的機器上發送如下請求:
[[email protected] 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語言編寫的,是以編譯過程中遇到了許多問題。