天天看點

基于Net-SNMP的Agent的開發和使用基于Net-SNMP的Agent的開發和使用

基于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工程,将上一步中生成的檔案加入到工程中。如圖所示:

基于Net-SNMP的Agent的開發和使用基于Net-SNMP的Agent的開發和使用

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目錄下,目錄結構如下圖:

基于Net-SNMP的Agent的開發和使用基于Net-SNMP的Agent的開發和使用

在bin目錄下有可執行程式snmpd.exe,可以通過snmpd.exe –register将其安裝成Windows服務,同樣可以通過snmpd.exe –unregister将其解除安裝。

三.經驗總結

        通過擴充Net-SNMP中的Agent可以擷取和設定自定義的MIB庫中的伺服器相關資訊,友善對伺服器進行管理,同樣可以管理伺服器上的各個服務。

同樣Agent的開發中還存在不足的地方,由于Net-SNMP本身對snmp請求的響應是同步方式,這樣在擷取一項資訊的時候,其他的snmp請求需要等待,這樣會影響采集的效

率,需要作相應修改來提高采集的效率。

繼續閱讀