简单扩写UCD-SNMP源码包中的示例MIB module 之一

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

转载于:https://my.oschina.net/u/249511/blog/51573

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值