大家好,又见面了,我是你们的朋友全栈君。
一、什么是SNMPTRAP
二、SNMPTRAP功能特点
三、SNMPTRAP工作流程
四、TRAP MIB编写及编译 NET-SNMP中TRAP的实现是基于一个由NOTIFICATION-TYPE 定义的MIB对象实现的。该对象在TrapPDU中头部位置,后续紧跟着该Trap携带的其他节点的信息,这些节点信息是Trap中有意义的信息,体现本次“告警”的真正内容,这些节点一般为普通的MIB对象。其中OBJECTS 子句中可以包含多个对象。
其生成的框架代码:
Trap的发送逻辑一般具有重复发送的特性,这一特性可有snmp_alarm_register()实现。该API能够准确地实现计时器功能。示例代码中也是由该API实现重复,周期调用的功能。 五、TRAP MIB示例文件
TEST-TRAP-MIB DEFINITIONS ::= BEGIN
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, TimeTicks FROM SNMPv2-SMI
DisplayString, FROM SNMPv2-TC
jsHostInfo FROM JS-MAIN-MIB ;
TestTraps OBJECT IDENTIFIER ::= {
jsHostInfo 99 }
cpuRatioHigh NOTIFICATION-TYPE
OBJECTS {
TestTrapDescription} --可以包含多个对象
STATUS current
DESCRIPTION "."
::= {
TestTraps 1 }
TestDescription OBJECT IDENTIFIER ::= {
TestTraps 2 }
TestTrapDescription OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..256))
MAX-ACCESS read-only
STATUS current
DESCRIPTION " "
::= {
TestDescription 1 }
END
六、TRAP 示例代码
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "TestTraps.h"
//extern const oid snmptrap_oid[];
//extern const size_t snmptrap_oid_len;
int cpu = 0;
const oid snmptrap_oid[] = {
1,3,6,1,6,3,1,1,4,1,0};
const size_t snmptrap_oid_len = OID_LENGTH(snmptrap_oid);
//如果CPU大于80 则发送告警 否则不发送
void judge_send_cputrap(int cpu)
{
static unsigned int cputrap_clientreg = 0;
if(cpu > 80)
{
if(cputrap_clientreg == 0){
send_cpuRatioHigh_trap();
//注册每5秒发送一次
cputrap_clientreg = snmp_alarm_register(5,SA_REPEAT,send_cpuRatioHigh_trap,NULL);
}
}
else
{
if(cputrap_clientreg != 0)
{
snmp_alarm_unregister(cputrap_clientreg);
cputrap_clientreg = 0;
}
}
}
void read_cpudata_repeat(unsigned int clientreg, void *clientarg)
{
cpu = 90;
judge_send_cputrap(cpu); //判断发送告警
}
void init_TestTraps(void)
{
printf(("TestTraps","Initializing\n"));
snmp_alarm_register(1,SA_REPEAT,read_cpudata_repeat, NULL);
}
int
send_cpuRatioHigh_trap(void)
{
netsnmp_variable_list *var_list = NULL;
const oid cpuRatioHigh_oid[] =
{
1, 3, 6, 1, 4, 1, 88888, 1, 1, 99, 1 };
const oid TestTrapDescription_oid[] =
{
1, 3, 6, 1, 4, 1, 88888, 1, 1, 99, 2, 1, 0 }
/* * 设置 snmpTrapOid.0 的值为私有MIB中定义的TestTrapDescription_oid */
snmp_varlist_add_variable(&var_list,
snmptrap_oid, snmptrap_oid_len,
ASN_OBJECT_ID,
cpuRatioHigh_oid, sizeof(cpuRatioHigh_oid));
/* * Add any objects from the trap definition */
snmp_varlist_add_variable(&var_list,
TestTrapDescription_oid,
OID_LENGTH(TestTrapDescription_oid),
ASN_OCTET_STR,
/* * Set an appropriate value for TestTrapDescription */
(int*)&cpu, sizeof(cpu));
/* * Add any extra (optional) objects here */
/* * Send the trap to the list of configured destinations * and clean up */
//发送TRAP之后并释放
send_v2trap(var_list);
snmp_free_varbind(var_list);
return SNMP_ERR_NOERROR;
}
七、TRAP 注册到子代理中 方法跟普通MIB对象一样
八、测试和验证 需启动主代理进程和子代理进程 以及snmptrapd进程 直接到/usr/local/sbin/目录下 启动代理进程 ./snmpd -f -Le -c /usr/local/share/snmp/snmpd.conf 然后启动子代理进程 ./ example-demon
最后启动snmptrapd进程。
./snmptrapd -f -Le -c /usr/local/share/snmp/snmptrapd.conf
启动snmptrapd进程需要snmptrapd.conf配置文件 启动后即可看到 则每过5秒可以看到trap返回来的告警信息。
九、snmptrapd.conf编写 说明:配置文件所有指令都要顶格写,左侧不要留空格。 允许使用空格,但不能使用Tab键。 路径分隔符不能使用反斜杠,必须使用“/”。 此文件用来指定管理进程如何处理接收到的snmp notification。
注意:上述是使用服务器本机获取TRAP ,如果想使用远程的管理设备获取TRAP 需要修改snmpd.conf文件
Trap的发送还需要指定到管理端地址和端口。在配置文件中,添加下面关键字: 不是关键点:Authtrapenable 1 //打开trap自动告警的开关,1代表开启,2代表关闭 Trap2sink localhost [community] [port] //指定trap发送的地址,共同体和端口 共同体和端口可以不指定,默认为public 和 162。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171245.html原文链接:https://javaforall.cn