簡單擴寫UCD-SNMP源碼包中的示例MIB module 之一

    本文寫做的目的是記錄工做的內容,主要是記錄和整理擴寫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等等。

相關文章
相關標籤/搜索