基于Net-SNMP的Agent的开发和使用

基于Net-SNMP的Agent的开发和使用

一.背景技术及术语解释

Net-SNMP是一个免费的、开放源码的SNMP实现,其中包含了一个Agent模块,通过这个模块可以获取到服务器的相关信息;在源码中实现了对服务器部分信息的获取,我们同样可以通过扩展mib库文件来实现获取我们需要的服务器的信息和管理服务器。

二.方案详细描述

1. Agent扩展方法简介

1.1添加自定义mib文件

1.   在windows下安装net-snmp。

2.将Mib Builder生成的HIKVISION-MIB.my文件重命名为txt文件,拷贝到net-snmp安装目录C:\usr\share\snmp\mibs目录下。

3.编辑C:\usr\etc\snmp.conf,

     加入一行:

     mibs +HIKVISION-MIB

4.使用snmptranslate -IR -Tp hikvision,

   检查是否能正确生成MIB树。

1.2根据mib文件生成C代码文件

进入netsnmp源码的agent/mibgroup/目录,创建目录hikvision,在目录下执行:

>setMIBFILES=C:\usr\share\snmp\mibs\HIKVISION-MIB.txt

>mib2c -cmib2c.scalar.conf  hikHardwareThreshold

生成文件hikHardwareThreshold.h和hikHardwareThreshold.c

或者mib2c -c mib2c. iterate.conf  hikServiceTable

生成文件hikServiceTable.h和hikServiceTable.c

 

注:“mib2c -c mib2c.scalar.conf OID名”生成对应的代码文件,OID可以是一张表,也可以是一个叶子节点。MIB模块一般都由变量和表组成。因此Net-snmp把SMI中的对象分为两大类:scalar和table。Scalar就包含我们常用的整型,字符串,时间等等数据类型。table就是scalar的一种集合,有一个和多个列组成,类似于数据库中的表。它必须具有索引项,用来按一定顺序检索表项。对于表,一般用模板” mib2c -c mib2c. iterate.conf”来生成相应的C代码文件,否则无法正常通过Net-snmp中的SNMPWalk命令来获取table的值。

 

1.3 Agent功能扩展

打开net-snmp工程,将上一步中生成的文件加入到工程中。如图所示:


1.     修改添加的文件,在形如:

int handle_hikCpuWarnVal(netsnmp_mib_handler *handler,
                          netsnmp_handler_registration *reginfo,
                          netsnmp_agent_request_info   *reqinfo,
                          netsnmp_request_info         *requests)


的函数中加入GET或SET操作实现的代码,该函数是同步相应的,当一个请求在响应时,其他的请求需要等待,可以设法将其改成异步方式以提高效率。

 

2.     在文件 net-snmp源码目录\win32\ mib_module_includes.h 中添加

#include "mibgroup/hikvision/hikHardwareThreshold.h"


3.     在文件 net-snmp源码目录\win32\ mib_module_inits.h 中添加

if (should_init("hikHardwareThreshold")) init_hikHardwareThreshold();


4.     重新编译netsnmpmibs库和snmpd,然后重新运行 net-snmp源码目录\win32\ 目录下的install-net-snmp.bat文件。

 

5.     >snmpget–v 2c –c public 127.0.0.1  [新添加的OID] 测试是否添加成功,同样用snmpwalk命令测试table是否添加成功。

 

1.4 Trap消息的自动发送

根据Net-SNMP源码中的例子程序notification.c编写自定义的Trap消息发送的代码。添加了文件源码文件hikNotification.h和hikNotification.cpp;在添加的文件中有初始化函数:

void init_hiknotification(void);


需要通过1.3中的第二步和第三部来将新增的文件加入到Net-SNMP的工程中,在初始化函数中通过函数:

snmp_alarm_register(10,  /* seconds */
                    SA_REPEAT,  /* repeat (every 10 seconds). */
                    send_hikTraps,   /* our callback */
                    NULL);      /* no callback data needed */


来定时的调用send_hikTraps函数,在send_hikTraps函数中需要检测相应的服务器信息(比如CPU使用率和内存使用率)来判断是否需要发送相应的Trap信息。

 

代码添加完成后重新编译,重新安装;然后需要指定Trap消息发送的目的地址,编辑文件/usr/local/share/snmp/snmpd.conf,在文件末尾添加:

# send v1 traps
 trapsink       ip:port  public
# also send v2traps
 trap2sink      ip:port  public
# send traps onauthentication failures
 authtrapenable 1

注:ip:port替换成相应的目的IP地址和端口。

 

2. Agent使用方法简介

程序编译安装后默认在C:\usr目录下,目录结构如下图:


在bin目录下有可执行程序snmpd.exe,可以通过snmpd.exe –register将其安装成Windows服务,同样可以通过snmpd.exe –unregister将其卸载。

 

三.经验总结

        通过扩展Net-SNMP中的Agent可以获取和设置自定义的MIB库中的服务器相关信息,方便对服务器进行管理,同样可以管理服务器上的各个服务。

同样Agent的开发中还存在不足的地方,由于Net-SNMP本身对snmp请求的响应是同步方式,这样在获取一项信息的时候,其他的snmp请求需要等待,这样会影响采集的效

率,需要作相应修改来提高采集的效率。

你可能感兴趣的:(net-snmp,wndows,net-snmp)