1、SNMP代理需求
(1) 提供设备相关的信息节点,供SNMP管理端查询,可支持get、get next和walk查询命令。提供SN、WAN口IP、CPU占用率、内存使用率、进程个数、网络接口状态、网络接口当前流量、软件版本信息等节点信息。
(2) 提供对特俗事件到来时的发往SNMP管理端得TRAP告警功能。包括CPU使用率超阈值、内存超阈值、网口流量超阈值、WAN口IP改变、设备重启等告警功能(暂未做)。
提供对snmp v1、v2版本的支持(v3版本将在后期实现)
2、总体设计思想
(1) 开发环境:基于开源软件net-snmp-5.4.2。
(2) MIB库来源:根据管理端的功能需求和节点的定义自行开发。
(3) 程序实现:利用mib2c工具将MIB库转化为代理程序框架,然后基于此框架进行进一步开发。最后将开发的代理程序静态编译进net-snmp框架中,它将注册到net-snmp框架中。注册的方法是再特定目录下(以agent/mibgroup/bamboo目录为例)分别建立一个.c文件和头文件,例如,名称分别取为bamboo.c和bamboo.h,在bamboo中存放自己开发的所有c程序和头文件(如xxx.c和xxx.h),然后在bamboo.h中添加module_require(xxx),并在configure时跟上:—with-mib_modules=”bamboo”来配置Makefile,使之在编译时加载bamboo文件下面的xxx文件(可以有多个xxx文件)。
3、get信息节点的实现,以cpu占用率信息节点为例
(1) 自己编写该节点MIB库,由于eX110只有一个CPU,所以编写一个节点即可:
hr_proc OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION "cpu usage"
::= { my_cpu 2 }
(2) 利用mib2c工具mib2c_old-api.conf将该mib库转化为get信息节点的程序框架,然后基于该框架,添加需要实现的功能,部分代码如下:
/*由系统基于MIB库生成的与节点相关的信息的结构体*/
#define HRPROC_LOAD 2
struct variable4 hrproc_variables[] = {
{HRPROC_LOAD, ASN_INTEGER, RONLY, var_hrproc, 3, {1, 2, 768}}
};
oid hrproc_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 3, 3 };
/*由系统生成的该节点初始化函数,在该初始化函数中注册了针对该节点的处理函数*/
void init_hr_proc(void)
{
REGISTER_MIB("bamboo/hr_proc", hrproc_variables, variable4,
hrproc_variables_oid);
}
/*
* header_hrproc:自己编写实现的函数,该函数将已注册到net-snmp的节点信息和管理端与访问的节点信息作比较。由于规定第一个CPU是用节点编号768开始,并且eX110只有一个CPU,即要求该节点为1.3.6.1.2.1.25.3.3.1.2.768 ,所以将netsnmp 中提供head_generic()函数中将已注册节点最后加“0”这步去掉, 直接将注册的该节点和跟管理端欲访问的节点作对比。
* vp IN - 指向已注册节点数组的指针
* name IN/OUT - 指向管理端欲访问节点的指针
* length IN/OUT - length of IN/OUT oid's
* exact IN - TRUE if an exact match was requested
* var_len OUT - length of variable or 0 if function returned
* write_method
*/
Int header_hrproc(struct variable *vp,
oid * name,
size_t * length,
int exact, size_t * var_len, WriteMethod ** write_method)
{
oid newname[MAX_OID_LEN];
int result;
memcpy((char *) newname, (char *) vp->name,