net-snmp學習-自定義mib庫

擴展 agent
到這裏你已經應該正確的寫出了一個私有的MIB文件,你需要把它放置到系統的MIB文件庫中。我的系統的MIB庫路徑是/usr/share/snmp/mibs/。
然後開始學習使用MIB2C這個強大的工具,它的作用是把你寫好的一個MIB文件,轉化成一個或多個在net-snmp下可以使用的.c/.h文件。
一個簡單的例子:當你寫成了一個叫做ucdDemoPublic的私有MIB文件。
mib2c -c mib2c.scalar.conf  ucdDemoPublic就可以生成ucdDemoPublic.c和ucdDemoPublic.h
MIB2C有很多版本,也有很多參數可供選擇,可以在netsnmp的官網上查到:http://net-snmp.sourceforge.net/docs/man/mib2c.html
重要的參數是 –c 後面的那個.conf值:
mib2c.mfd.conf
mib2c.scalar.conf
mib2c.int_watch.conf
mib2c.iterate.conf
mib2c.create-dataset.conf
mib2c.array-user.conf
mib2c.column_defines.conf
mib2c.column_enums.conf
一個重要的問題:
在使用mib2c時,需要配置一個mib2c的配置文件:snmp.conf
我的配置文件路徑是:/var/net-snmp/snmp.conf
在配置文件中要加入類似下面的語句,表示我要把XXX-MIB.txt這個mib文件轉化成c文件。
mibfile /usr/share/snmp/mibs/XXX-MIB.txt
簡單變量的代碼生成
用mib2c.scalar.conf生成簡單MIB變量的XXX.c和XXX.h,如上例。生成MIB之後需要自己根據具體參數的含義,修改get或set時的動作。在XXX.c中包含兩個重要的函數:init_XXX()和handle_XXX(),需要在init_XXX中修改oid,在handle_XXX中的case MODE_GET和case MODE_SET_ACTION中設置GTE和SET的函數。
Table變量的代碼生成
用mib2c.mfd.conf生成table類型的MIB文件,生成的文件比較多,包括:XXX.c/.h;XXX_data_access.c/.h; XXX_data_get.c/.h; XXX_data_set.c/.h; XXX_enums.h; XXX_interface.c/.h; XXX_oids.h;
Snmpget的修改:需要修改的是XXX_data_access.c中的XXX__container_load函數,修改XXXTable中的變量值。
Snmpset的修改:需要修改的是:
 XXX_data_set.c:XXXTable_commit中設置rowreq_ctx->column_set_flags的值,表示已經修改了XXXTable中的某一項。
XXX_data_set.c:中所有的XXX_set.c中指定自己想要的值。
代碼集成     
生成了正確的.c/.h文件之後,需要把代碼繼承到snmpd中,有兩種比較靠譜的方法:
1、  把所擴展的agent MIB,靜態的集成到snmpd中。方法:把所生成的.c/.h文件拷貝到/net-snmp/agent/mibgroup下面,然後重新 ./configure --with-mib-modules="XXX"; make; make install, 好了你的私有MIB已經被靜態集成到snmpd裏面了,最後用命令行snmpget;snmpset試驗一下。
2、  是動態加載的方式,自己寫一個makefile,把所有生成的.c/.h編譯成爲一個.so,把這個.so放到一個特定的路徑下面,並在snmpd.conf文件中指明.so的位置。
1)編譯的時候除指定-fPIC -shared -O0參數之外,還需要指定= -I. `net-snmp-config --cflags`,在最後鏈接成.so的時候還需要指定`net-snmp-config --libs`參數
2)在需要在snmpd.conf文件中指定.so的位置:如
dlmod exampleTable /usr/lib/exampleTable.so
3)在運行./snmpd的時候需要指定所需的.so如:
./snmpd –f –L –Dexample,DLmod,
這樣也可以實現對agent的動態擴展。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章