本文寫做的目的是記錄工做的內容,主要是記錄和整理擴寫mib的方法和思路。並非通讀本文後,便可掌握擴寫mib的方法以及瞭解snmp協議相關背景。下面即開始,整理記錄簡單擴寫mib模版的方法。shell
一、編輯mib文件,對照mib文件中已有的定義,定義一個節點。定義語句以下:app
ucdDemoExtentMibRONLY OBJECT-TYPE SYNTAX OCTET STRING MAX-ACCESS read-only STATUS current DESCRIPTION "I use ucdDemoMIB to execise extent MIB moudle." ::= { ucdDemoPublic 5 }
二、在對應的頭文件中先將/* Magic number definitions: */下面的定義相應的擴寫。Magic number定義實際上就是擴寫的對應節點的索引值。函數
#define UCDDEMORESETKEYS 1 #define UCDDEMOPUBLICSTRING 2 #define UCDDEMOUSERLIST 3 #define UCDDEMOPASSPHRASE 4 #define UCDDEMOEXTENTMIBRONLY 5
三、而後就是要擴寫新註冊的oid節點對應的查找變量(struct variable2:FindVarMethod *findVar)函數。找到對應的函數,咱們簡單大體瀏覽了之後,就能夠發現這個查找對應變量的函數其核心就是一個switch語句,根據agent核心傳過來的查詢oid的信息找到對應節點,而後作相應的處理。this
/* this is where we do the value assignments for the mib results. */ switch(vp->magic) { case UCDDEMORESETKEYS: *write_method = write_ucdDemoResetKeys; long_ret = 0; return (unsigned char *) &long_ret; case UCDDEMOPUBLICSTRING: *write_method = write_ucdDemoPublicString; *var_len = strlen(publicString); return (unsigned char *) publicString; case UCDDEMOUSERLIST: cp = string; for(i=0; i < num; i++) { snprintf(cp, sizeof(string)-strlen(string), " %s", demoUsers[i]); string[MYMAX] = 0; cp = cp + strlen(cp); } *var_len = strlen(string); return (unsigned char *) string; case UCDDEMOPASSPHRASE: *var_len = strlen(demopass); return (unsigned char *) demopass; default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ucdDemoPublic\n", vp->magic)); }
從代碼中很明顯看出來剛纔在頭文件中定義的Magic number實際上就是一會用來區分MIB tree中同一父節點下不一樣子節點用的。spa
case UCDDEMOEXTENTMIBRONLY: gethostname(str_hostname, sizeof (str_hostname)); str_hostname[64-1] = 0; *var_len = strlen(str_hostname); return (unsigned char *) str_hostname;
對於新添加的節點,加上對應的case判斷,而後獲取數據並返回給上層函數。pwa
因爲沒有添加新的函數,因此這個很是簡單的擴寫並無添加新函數,因此不須要添加頭文件中函數聲明的變化。
code
四、從新配置編譯
索引
因爲咱們擴展的MIB module不是默認的基本mib,因此須要通知配置腳本要將咱們擴寫的示例mib 也就是ucdDemoMIB編譯進snmpd中去。ci
./configure -with-mib-modules="examples/ucdDemoPublic"
而後就是正常的make、make install的過程了。字符串
五、驗證新添加的oid
上述三個過程都處理好之後啓動咱們的新編譯好的snmpd,並用snmpwalk命令遍歷ucdDemoMIB的全部子節點。
yanglei@localhost:~/src/net-snmp-5.7.1/apps> ./snmpwalk -v2c -c bfby localhost .1.3.6.1.4.1.2021.14 SNMPv2-SMI::enterprises.2021.14.1.1.1.0 = INTEGER: 0 SNMPv2-SMI::enterprises.2021.14.1.1.2.0 = "" SNMPv2-SMI::enterprises.2021.14.1.1.3.0 = "" SNMPv2-SMI::enterprises.2021.14.1.1.4.0 = "" SNMPv2-SMI::enterprises.2021.14.1.1.5.0 = STRING: "localhost"
由於是嘗試着擴展示有mib因此擴展oid對應的信息就取的很是簡單。就是用gethostname函數返回一個字符串。經過命令查看咱們新添加的.5節點已經能夠正常遍歷出來。
第一次嘗試的擴展是很是簡單的,僅僅是一個只讀(read-only)所謂的一個標量(scale)。從此,將繼續研究若是全新自定義一個mib、定義能夠set的oid、定義一個table、定義本身的trap等等。