Huntinux
阿新 • • 發佈:2018-12-25
參考
Warning: Failed to connect to the agentx master agent ([NIL])
執行代理程式時(加上-f引數禁止後太執行,-d引數輸出除錯資訊)提示此資訊。
Trap
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中是否接收到了資訊。