博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单扩写UCD-SNMP源码包中的示例MIB module 之一
阅读量:6154 次
发布时间:2019-06-21

本文共 2794 字,大约阅读时间需要 9 分钟。

hot3.png

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

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

你可能感兴趣的文章
第二章
查看>>
android背景选择器selector用法汇总
查看>>
[转]Paul Adams:为社交设计
查看>>
showdialog弹出窗口刷新问题
查看>>
java
查看>>
Vue.js连接后台数据jsp页面  ̄▽ ̄
查看>>
关于程序的单元测试
查看>>
mysql内存优化
查看>>
都市求生日记第一篇
查看>>
Java集合---HashMap源码剖析
查看>>
SQL优化技巧
查看>>
thead 固定,tbody 超出滚动(附带改变滚动条样式)
查看>>
Dijkstra算法
查看>>
css 动画 和 响应式布局和兼容性
查看>>
csrf 跨站请求伪造相关以及django的中间件
查看>>
MySQL数据类型--与MySQL零距离接触2-11MySQL自动编号
查看>>
生日小助手源码运行的步骤
查看>>
Configuration python CGI in XAMPP in win-7
查看>>
bzoj 5006(洛谷 4547) [THUWC2017]Bipartite 随机二分图——期望DP
查看>>
CF 888E Maximum Subsequence——折半搜索
查看>>