ucd-snmp工具中snmpd擴展的三種形式
SNMP協(xié)議對網(wǎng)絡(luò)管理的好處,讓很多人都開始使用它。那么現(xiàn)在我們就來講解一下ucd-snmp工具中進行snmpd擴展的相關(guān)源碼解析。本文涉及了三種snmpd擴展方法。那么我們會分別進行講解。首先還是讓我們來對snmpd這個命令進行一下簡單的介紹。那么,對于常常接觸這個命令的人來說,都知道snmpd命令是響應(yīng) SNMP請求的守護進程。那么它的標(biāo)準(zhǔn)語法格式是:
snmpd [OPTIONS] [LISTENING ADDRESSES]
語法格式是snmpd后面加上選項或者監(jiān)聽地址。
snmpd擴展方法一: 靜態(tài)鏈接形式
先將生成的兩個文件, ustScalarSet.h和ustScalarSet.c, 拷貝到下載的ucd-snmp源代碼目錄下agent/mibgroup子目錄中. 例如在我的機器上, ucd-snmp 4.2.1的源代碼在/usr/local/src/ucd-snmp-4.2.1中, 相應(yīng)的拷貝的目標(biāo)目錄為, /usr/local/src/ucd-snmp-4.2.1/agent/mibgroup.
在ucd-snmp 4.2.1的主目錄中(我的機器為/usr/local/src/ucd-snmp-4.2.1), 按如下序列執(zhí)行命令
# ./configure -with-mib-modules="ustScalarSet" # make # make install
這樣, 新的代理程序生成并安裝. 運行SNMP代理程序
# /usr/local/sbin/snmpd
在用相應(yīng)的工具程序檢索新加入的MIB變量. 可以用如下任何命令:
% /usr/local/bin/snmpget localhost public UCD-SNMP-TUTORIAL-MIB::ustSSSimpleString.0 % /usr/local/bin/snmpwalk localhost public UCD-SNMP-TUTORIAL-MIB::ustScalarSet
#p#snmpd擴展方法二: 共享鏈接庫形式
首先, 在任一目錄下編譯生成共享鏈接庫. 假定目錄為/usr/local/temp. 將兩個源文件, ustScalarSet.h和ustScalarSet.c拷貝到此目錄下. 按如下命令序列生成共享鏈接庫:
gcc -g -I/usr/local/include -c -o ustScalarSet.o ustScalarSet.c gcc -g -fPIC -shared -o ustScalarSet.so ustScalarSet.o
有兩種方法在代理程序中動態(tài)加載共享鏈接庫.
第一種,適合于代理程序已運行的情況, 按如下命令序列執(zhí)行:
# snmpset localhost hyj UCD-DLMOD-MIB::dlmodStatus.1 i create # snmpset localhost hyj UCD-DLMOD-MIB::dlmodName.1 s "ustScalarSet" # snmpset localhost hyj UCD-DLMOD-MIB::dlmodPath.1 s "/usr/local/temp/ustScalarSet.so" # snmpset localhost hyj UCD-DLMOD-MIB::dlmodStatus.1 i load
即可裝載.這時可以用工具程序檢索或設(shè)置相應(yīng)的變量. 這里需要注意的是工具snmpset的用法. 代理snmpd的確省配置, 不支持任何用戶設(shè)置變量. 我們可以通過配置文件snmpd.conf中的訪問控制部分進行配置. 我在我的snmpd.conf文件中加入了如下兩行:
rwcommunity hyj rocommunity public
設(shè)置了一個讀寫community, hyj和一個只讀community, public. 配置文件確省位于/usr/local/share/snmp目錄下.
第二種, 直接在snmpd.conf中加入一行:
dlmod ustScalarSet /usr/local/temp/ustScalarSet.so
重新啟動snmpd代理, 代理自動裝載共享庫.
關(guān)于代理程序以及工具程序相應(yīng)的配置情況, 參見snmp.conf, snmpd.conf, 和snmpconf的man手冊.#p#
snmpd擴展方法三: AgentX子代理協(xié)議
首先, 編寫一個子代理主函數(shù)文件, ustMain.c. 如下:
1) #include; 2) #include ; 3) #include ; 4) int main () { 5) int agentx_subagent=1; 6) snmp_enable_stderrlog(); 7) if (agentx_subagent) { 8) ds_set_boolean(DS_APPLICATION_ID, DS_AGENT_ROLE, 1); 9) } 10) init_agent("ustMain"); 11) init_ustScalarSet(); 12) init_snmp("ustMain"); 13) if (!agentx_subagent) 14) init_master_agent(161, NULL, NULL); 15) while(1) { 16) agent_check_and_process(1); 17) } 18) snmp_shutdown("ustMain"); 19) }
按如下命令進行編譯:
gcc -g -I/usr/local/include -o ustMain ustMain.c ustScalarSet.c -lucdagent -lucdmibs -lsnmp
生成子代理程序, ustMain.
在snmpd.config配置文件中加入一行:
master agentx
以支持AgentX子代理. 并重新啟動snmpd.然后啟動 ustMain.運行相應(yīng)的工具程序, 測試是否可以訪問新加入的MIB信息.#p#
一個簡單的SNMP代理程序
實際上, 我們可以利用ucd-snmp編寫自己的SNMP代理程序. 如下文件, hsnmpd.c, 所示. 其實, 這個文件與上一個子代理程序完全相同. 我僅僅是將變量agentx_subagent賦成0.代碼如下.
hsnmpd.c :
1) #include; 2) #include ; 3) #include ; 4) int main () { 5) int agentx_subagent=0; 6) if (agentx_subagent) { 7) ds_set_boolean(DS_APPLICATION_ID, DS_AGENT_ROLE, 1); 8) } 9) init_agent("snmpd"); 10) init_ustScalarSet(); 11) init_snmp("snmpd"); 12) if (!agentx_subagent) 13) init_master_agent(161, NULL, NULL); 14) while(1) { 15) agent_check_and_process(1); 16) } 17) snmp_shutdown("snmpd"); 18) }
第1-3行: 必須包含的頭文件. 第5行: 定義一個變量, 表示該代理是主代理或子代理. 通過ucd-snmp開發(fā)包編寫的代理程序, 既可以作為AgentX主代理, 也可以作為AgentX子代理. 第7-9行:子代理需要初始化的內(nèi)容. 第10行:初始化代理. 第11行:初始化支持的MIB. 文件ustScalarSet.c中的函數(shù). 第12行:初始化SNMP. 第13-14行:主代理需要初始化的內(nèi)容. 第15-17行:SNMP協(xié)議PDU處理主循環(huán). 第18行:關(guān)閉SNMP, 做一些釋放資源的工作.
如下編譯:
gcc -g -I/usr/local/include -o hsnmpd hsnmpd.c ustScalarSet.c /usr/local/lib/libucdagent.a /usr/local/lib/libucdmibs.a /usr/local/lib/libsnmp.a
運行該程序, hsnmpd. 除了一些關(guān)于無法解釋配置文件的相關(guān)內(nèi)容的報警外, 程序運行正常. 并且, 可以用工具程序, 如snmpget, snmpwalk等訪問其中的MIB信息. 當(dāng)然, 僅僅只有UCD-SNMP-TUTORIAL-MIB中所描述的信息, 而其他的沒有實現(xiàn)的MIB信息無法獲得.