通過ucd-snmp完成SNMP Agent的源碼
對于snmp少不了ucd-snmp的使用。所以我們一再介紹了相關的源碼的內容。那么接下來我們主要介紹了一下相關協議的開源開發內容,并且討論采用開放源碼的ucd-snmp 4.2.1軟件包開發自己的SNMP Agent,不涉及SNMP協議包的組包、解析等問題。本文從以下部分進行介紹:
一:ucd-snmp 4.2.1簡介及SNMP Agent開發步驟
二:MIB庫模塊設計及代碼轉換
三:SNMP Agent功能擴展方式
四:uCLinux系統上SNMP Agent的實現
五:創建SNMP Agent配置文件snmpd.conf
一:ucd-snmp 4.2.1簡介及SNMP Agent開發步驟
ucd-snmp 4.2.1開源軟件包支持SNMPv1 (RFCs 1155-1157)、SNMPv2c(RFCs 1901-1908)、SNMPv3 (RFCs 2271-2275)三種SNMP協議版本,其由以下內容組成:
可擴展的SNMP Agent程序(snmpd);
SNMP Agent和管理程序開發庫;
用于檢索或設置SNMP Agent端變量的工具程序(snmpget, snmpset, snmptable, snmpwalk等);
用于生成或處理SNMP陷阱的工具程序(snmptrapd和snmptrap);
基于Tk/perl的MIB瀏覽器(tkmib)
SNMP Agent的開發一般采用以下步驟:
MIB庫模塊設計。
MIB庫模塊轉換為C語言代碼。
轉換后的C語言代碼添加到ucd-snmp源碼包,實現SNMP Agent的功能擴展。#p#
二:MIB庫模塊設計及代碼轉換
在SNMPAgent開發中,首先要定義出MIB庫模塊,這樣,SNMP管理端軟件才能通過該MIB庫模塊實現對相應設備的管理。MIB庫模塊定義的語法,可以參照SNMP 協議中的SMI描述部分,本文使用MG-SOFT公司的“Visual MIBBuilder"可視化設計軟件完成MIB庫模塊的定義。MIB庫模塊定義后,需要在代理程序中增加與所定義的MIB庫模塊相對應的源代碼,這里就要使用MIB2C工具程序把MIB庫模塊文件轉換成C源代碼。
MIB2C是ucd-snmp 4.2.1軟件包中的工具程序,該工具程序需要SNMPperl擴展模塊支持。按以下步驟進行轉換,首先將設計好的MIB庫模塊定義文件拷貝到ucd-snmp源代碼的mibs目錄(如/usr/local/share/snmp/mibs),然后運行MIB2C命令(假定MIB庫模塊為modulename)。
/usr/local/bin/mib2c modulename
此時,MIB2C會在當前目錄下生成兩個C源文件:modulename.h 和modulename.c,這兩個文件是根據所設計的MIB庫模塊轉換而成的,也是需要加入到ucd-snmp軟件包實現SNMP Agent功能擴展的源代碼。
#p#三:SNMP Agent功能擴展方式
SNMP Agent功能擴展即snmpd功能擴展,假定ucd-snmp源代碼存放在/usr/local/src/目錄下,下面是實現snmpd功能擴展的兩種方式:
靜態鏈接方式
先將生成的兩個文件, modulename.h和modulename.c,拷貝到ucd-snmp源代碼的/usr/local/src/ucd-snmp-4.2.1/agent/mibgroup目錄,然后,在ucd-snmp 4.2.1目錄下(/usr/local/src/ucd-snmp-4.2.1)執行以下命令生成snmpd。
# ./configure -with-mib-modules="modulename" # make # make install
共享鏈接庫方式
首先, 在任一目錄(如/usr/local/temp)編譯生成共享鏈接庫。將兩個源文件, modulename.h和modulename.c拷貝到此目錄下,執行如下命令生成共享鏈接庫:
gcc -g -I/usr/local/include -c -o modulename.o modulename.c gcc -g -fPIC -shared -o modulename.so modulename.o
然后,通過以下任意一種方式動態加載共享鏈接庫。
如果代理程序(snmpd)已運行,執行如下命令:
#snmpset localhost rwnode UCD-DLMOD-MIB::dlmodStatus.1 i create #snmpset localhost rwnode UCD-DLMOD-MIB::dlmodName.1 s " modulename" #snmpset localhost rwnode UCD-DLMOD-MIB::dlmodPath.1 s "/usr/local/temp/ modulename.so" #snmpset localhost rwnode UCD-DLMOD-MIB::dlmodStatus.1 i load
這樣即可加載剛才生成的共享連接庫,裝載后,可以用工具程序檢索或設置相應的變量。如果代理程序(snmpd)未運行,在snmpd.conf配置文件中增加一行:
dlmod modulename /usr/local/temp/modulename.so
然后重新啟動snmpd代理程序, 程序會自動裝載共享庫。
#p#四:uCLinux系統上SNMP Agent的實現
考慮到嵌入式設備應用程序自動啟動的特點,一般采用靜態鏈接方式開發SNMP Agent。由于uCLinux交叉編譯環境的特殊性,在uCLinux系統上實現SNMP Agent需要按以下步驟。
增加新文件及修改Makefile文件:復制modulename.c和modulename.h到agent/mibgroup/目錄下。 修改agent/Makefile文件: 增加"mibgroup/modulename.lo"到LMIBOBJS符號下。 增加"mibgroup/modulename.o"到MIBOBJS符號下。 修改agent/mibgroup/Makefile文件: 增加"modulename.o"到OBJS符號下。 增加"modulename.lo"到LOBJS符號下。 增加"modulename.c"到SRCS符號下。 修改agent/mibgroup/mib_module_includes.h文件: 增加 #include "mibgroup/modulename.h"一行。 修改agent/mibgroup/mib_module_inits.h文件: 增加“if (should_init("modulename")) init_ modulename ();"一行。
#p#重新配置內核
要生成SNMP Agent程序snmpd,需要重新配置應用程序。切換到uClinux-dist目錄,開始重新配置應用程序:
cd ../uClinux-dist make menuconfig
進行如下選擇:
Kernel/Library/Defaults Selection: (Linux-2.4.x) Kernel Version [X] Customize Vendor/User Settings (NEW)
按Esc后保存。隨后自動進入 uClinux v3.1.0 Configurationm,選中“Network Application---->"并進入下一級選項菜單,在這里可以配置arp、ifconfig、ping、route和snmpd等應用程序,選中ucd-snmpsnmpd一項。
[X] ucd-snmp snmpd
保存后退出,然后在終端提示符下執行命令“make user_only"生成SNMP Agent程序snmpd。#p#
五:創建SNMP Agent配置文件snmpd.conf
snmpd啟動時需要讀取snmpd.conf配置文件,通過該配置文件,可以控制SNMP管理端對變量的讀寫屬性,下面是該配置文件的一個示例:
syslocation Shanghai syscontact localhost sysservices 72 com2sec public default public com2sec private default private group public v1 public group private v1 private group public v2c public group private v2c private group public usm public group private usm private view all included .1 80 view system included .1.3.6.1.2.1.1 fe access public "" any noauth exact all none all access private "" any noauth exact none all all trapsink 200.162.162.27