参考
http://www.net-snmp.org/wiki/index.php
https://www.cnblogs.com/sddai/p/5911031.html
https://www.cnblogs.com/oloroso/p/4599501.html
https://blog.csdn.net/hepeng597/article/details/8782868
https://www.cnblogs.com/oloroso/category/703615.html
Warning: Failed to connect to the agentx master agent ([NIL])
运行代理程序时(加上-f参数禁止后太运行,-d参数输出调试信息)提示此信息。
Trap
https://www.ibm.com/developerworks/cn/linux/l-cn-snmp/
https://blog.csdn.net/qq_27204267/article/details/52118947
https://www.noction.com/blog/snmp_traps_explained
https://www.cnblogs.com/pangblog/p/3395384.html
1. 创建mib
IBM-DW-SAMPLE DEFINITIONS ::= BEGIN
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, TimeTicks FROM SNMPv2-SMI
DisplayString, FROM SNMPv2-TC
enterprises
FROM RFC1155-SMI;
test OBJECT IDENTIFIER ::= { enterprises 1000 }
TestTraps OBJECT IDENTIFIER ::= { test 1 }
nodeDown NOTIFICATION-TYPE
STATUS current
DESCRIPTION "node down notification"
::= { TestTraps 1 }
END
以IBM-DW-SAMPLE.mib
为文件名保存到~/.snmp/mibs/
中,并添加到/etc/snmp/snmp.conf中
mibs +/home/yourname/.snmp/mibs/IBM-DW-SAMPLE.mib
重启snmpd
$ sudo service snmpd restart
验证mib
$ snmptranslate -On IBM-DW-SAMPLE::nodeDown
.1.3.6.1.4.1.1000.1.1
说明上面编写的mib文件已经被识别。
2. 搭建接受 Trap 的 snmptrapd 进程
snmptrapd用于接收trap信息,启动方式为(使用udp 1622端口):
$ snmptrapd -c mysnmptrapd.conf udp:1622
其中mysnmptrapd.conf
的内容为:
traphandle default lognotify IBM-DW-SAMPLE::nodeDown
authCommunity log,execute,net public
第一行是接收到trap信息后需要执行的动作,这里制定为lognotify脚本,它的内容为;
#!/bin/sh
read host
read ip
vars=
while read oid val
do
if [ "$vars" = "" ]
then
vars="$oid = $val"
else
vars="$vars, $oid = $val"
fi
done
echo trap: $1 $host $ip $vars >checkfile
注意:如果提示没有找到lognotify,那么配置文件中lognotify脚步可以写full path
3. 使用 snmptrap 发送 SNMP Trap
$ sudo snmptrap -m ~/.snmp/mibs/IBM-DW-SAMPLE.mib -v 2c -c public 127.0.0.1:1622 "" IBM-DW-SAMPLE::nodeDown IBM-DW-SAMPLE::nodeDown.1 s "M1"
4. C语言直接调用 API 发送 SNMP Trap
安装库: sudo apt install libsnmp-dev
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRAP_NAME_1 "IBM-DW-SAMPLE::nodeDown"
int main(void)
{
char peername[256],commu[256];
init_snmp("myexample");
struct snmp_session session;
snmp_sess_init(&session);
session.version = SNMP_VERSION_2c;
strcpy(peername,"127.0.0.1:1622");
strcpy(commu,"public");
session.peername = peername;
session.community = (unsigned char*)commu;
session.community_len = strlen(commu);
netsnmp_session *ss = snmp_open(&session);
oid objid_sysuptime[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 };
oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };
netsnmp_pdu * pdu = NULL;
oid tmpOID[MAX_OID_LEN],varId[MAX_OID_LEN];
size_t tmpOID_len;
in_addr_t addr;
pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
long sysuptime;
char tempbuf[128];
memset(tempbuf,128,0);
sprintf(tempbuf,"%ld",sysuptime);
sysuptime = get_uptime();
size_t varIdLen;
tmpOID_len = MAX_OID_LEN;
if(!snmp_parse_oid(TRAP_NAME_1, tmpOID, &tmpOID_len))
snmp_perror("snmp_parse_oid");
snmp_add_var(pdu, objid_sysuptime, sizeof(objid_sysuptime)/sizeof(oid), 't', tempbuf);
snmp_add_var(pdu, objid_snmptrap, sizeof(objid_snmptrap)/sizeof(oid),'o',"IBM-DW-SAMPLE::nodeDown");
#if 0
if(!snmp_parse_oid("HP-DW-SAMPLE::ip",varId,&varIdLen))
{
snmp_perror("ip");
}
else
{
printf("Success snmp_parse_oid\n");
snmp_add_var(pdu, varId, sizeof(varId)/sizeof(oid),'s',"2.2.2.2");
}
int retv;
if(!snmp_parse_oid("HP-DW-SAMPLE::host",varId,&varIdLen))
{
snmp_perror("host");
}
else
{
retv = snmp_add_var(pdu, varId, sizeof(varId)/sizeof(oid),'s',"M1");
}
#endif
if( !snmp_send(ss, pdu) )
{
printf("Send pdu error \n");
}
snmp_close(ss);
snmp_shutdown( "myexample" );
SOCK_CLEANUP;
return 0;
}
编译 & 运行:
$ gcc -o t1 snmptrap.c -lnetsnmp
$ sudo ./t1
检查checkfile中是否接收到了信息。