本文写做的目的是记录工做的内容,主要是记录和整理扩写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等等。