SNMP

参考

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])

https://stackoverflow.com/questions/13193471/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中是否接收到了信息。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值