1. 程式人生 > >Huntinux

Huntinux

參考

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中是否接收到了資訊。