基于Net-SNMP的Agent的開發和使用
一.背景技術及術語解釋
Net-SNMP是一個免費的、開放源碼的SNMP實作,其中包含了一個Agent子產品,通過這個子產品可以擷取到伺服器的相關資訊;在源碼中實作了對伺服器部分資訊的擷取,我們同樣可以通過擴充mib庫檔案來實作擷取我們需要的伺服器的資訊和管理伺服器。
二.方案較長的描述
1. Agent擴充方法簡介
1.1添加自定義mib檔案
1. 在windows下安裝net-snmp。
2.将Mib Builder生成的HIKVISION-MIB.my檔案重命名為txt檔案,拷貝到net-snmp安裝目錄C:\usr\share\snmp\mibs目錄下。
3.編輯C:\usr\etc\snmp.conf,
加入一行:
mibs +HIKVISION-MIB
4.使用snmptranslate -IR -Tp hikvision,
檢查是否能正确生成MIB樹。
1.2根據mib檔案生成C代碼檔案
進入netsnmp源碼的agent/mibgroup/目錄,建立目錄hikvision,在目錄下執行:
>setMIBFILES=C:\usr\share\snmp\mibs\HIKVISION-MIB.txt
>mib2c -cmib2c.scalar.conf hikHardwareThreshold
生成檔案hikHardwareThreshold.h和hikHardwareThreshold.c
或者mib2c -c mib2c. iterate.conf hikServiceTable
生成檔案hikServiceTable.h和hikServiceTable.c
注:“mib2c -c mib2c.scalar.conf OID名”生成對應的代碼檔案,OID可以是一張表,也可以是一個葉子節點。MIB子產品一般都由變量和表組成。是以Net-snmp把SMI中的對象分為兩大類:scalar和table。Scalar就包含我們常用的整型,字元串,時間等等資料類型。table就是scalar的一種集合,有一個和多個列組成,類似于資料庫中的表。它必須具有索引項,用來按一定順序檢索表項。對于表,一般用模闆” mib2c -c mib2c. iterate.conf”來生成相應的C代碼檔案,否則無法正常通過Net-snmp中的SNMPWalk指令來擷取table的值。
1.3 Agent功能擴充
打開net-snmp工程,将上一步中生成的檔案加入到工程中。如圖所示:
1. 修改添加的檔案,在形如:
int handle_hikCpuWarnVal(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
netsnmp_request_info *requests)
的函數中加入GET或SET操作實作的代碼,該函數是同步相應的,當一個請求在響應時,其他的請求需要等待,可以設法将其改成異步方式以提高效率。
2. 在檔案 net-snmp源碼目錄\win32\ mib_module_includes.h 中添加
#include "mibgroup/hikvision/hikHardwareThreshold.h"
3. 在檔案 net-snmp源碼目錄\win32\ mib_module_inits.h 中添加
if (should_init("hikHardwareThreshold")) init_hikHardwareThreshold();
4. 重新編譯netsnmpmibs庫和snmpd,然後重新運作 net-snmp源碼目錄\win32\ 目錄下的install-net-snmp.bat檔案。
5. >snmpget–v 2c –c public 127.0.0.1 [新添加的OID] 測試是否添加成功,同樣用snmpwalk指令測試table是否添加成功。
1.4 Trap消息的自動發送
根據Net-SNMP源碼中的例子程式notification.c編寫自定義的Trap消息發送的代碼。添加了檔案源碼檔案hikNotification.h和hikNotification.cpp;在添加的檔案中有初始化函數:
void init_hiknotification(void);
需要通過1.3中的第二步和第三部來将新增的檔案加入到Net-SNMP的工程中,在初始化函數中通過函數:
snmp_alarm_register(10, /* seconds */
SA_REPEAT, /* repeat (every 10 seconds). */
send_hikTraps, /* our callback */
NULL); /* no callback data needed */
來定時的調用send_hikTraps函數,在send_hikTraps函數中需要檢測相應的伺服器資訊(比如CPU使用率和記憶體使用率)來判斷是否需要發送相應的Trap資訊。
代碼添加完成後重新編譯,重新安裝;然後需要指定Trap消息發送的目的位址,編輯檔案/usr/local/share/snmp/snmpd.conf,在檔案末尾添加:
# send v1 traps
trapsink ip:port public
# also send v2traps
trap2sink ip:port public
# send traps onauthentication failures
authtrapenable 1
注:ip:port替換成相應的目的IP位址和端口。
2. Agent使用方法簡介
程式編譯安裝後預設在C:\usr目錄下,目錄結構如下圖:
在bin目錄下有可執行程式snmpd.exe,可以通過snmpd.exe –register将其安裝成Windows服務,同樣可以通過snmpd.exe –unregister将其解除安裝。
三.經驗總結
通過擴充Net-SNMP中的Agent可以擷取和設定自定義的MIB庫中的伺服器相關資訊,友善對伺服器進行管理,同樣可以管理伺服器上的各個服務。
同樣Agent的開發中還存在不足的地方,由于Net-SNMP本身對snmp請求的響應是同步方式,這樣在擷取一項資訊的時候,其他的snmp請求需要等待,這樣會影響采集的效
率,需要作相應修改來提高采集的效率。