本文写作的目的是记录工作的内容,主要是记录和整理扩写mib的方法和思路。并不是通读本文后,即可掌握扩写mib的方法以及了解snmp协议相关背景。下面即开始,整理记录简单扩写mib模版的方法。
1、编辑mib文件,对照mib文件中已有的定义,定义一个节点。定义语句如下:
ucdDemoExtentMibRONLY OBJECT-TYPE SYNTAX OCTET STRING MAX-ACCESS read-only STATUS current DESCRIPTION "I use ucdDemoMIB to execise extent MIB moudle." ::= { ucdDemoPublic 5 }
2、在对应的头文件中先将/* Magic number definitions: */下面的定义相应的扩写。Magic number定义实际上就是扩写的对应节点的索引值。
#define UCDDEMORESETKEYS 1#define UCDDEMOPUBLICSTRING 2#define UCDDEMOUSERLIST 3#define UCDDEMOPASSPHRASE 4#define UCDDEMOEXTENTMIBRONLY 5
3、然后就是要扩写新注册的oid节点对应的查找变量(struct variable2:FindVarMethod *findVar)函数。找到对应的函数,我们简单大致浏览了以后,就可以发现这个查找对应变量的函数其核心就是一个switch语句,根据agent核心传过来的查询oid的信息找到对应节点,然后做相应的处理。
/* 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中同一父节点下不同子节点用的。
case UCDDEMOEXTENTMIBRONLY: gethostname(str_hostname, sizeof (str_hostname)); str_hostname[64-1] = 0; *var_len = strlen(str_hostname); return (unsigned char *) str_hostname;
对于新添加的节点,加上对应的case判断,然后获取数据并返回给上层函数。
由于没有添加新的函数,所以这个非常简单的扩写并没有添加新函数,所以不需要添加头文件中函数声明的变化。
4、重新配置编译
由于我们扩展的MIB module不是默认的基本mib,所以需要通知配置脚本要将我们扩写的示例mib 也就是ucdDemoMIB编译进snmpd中去。
./configure -with-mib-modules="examples/ucdDemoPublic"
然后就是正常的make、make install的过程了。
5、验证新添加的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.14SNMPv2-SMI::enterprises.2021.14.1.1.1.0 = INTEGER: 0SNMPv2-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等等。