#!/bin/bash##Time:2014-06-23#Author:ftlynx#Function:useNET-SNMPgetNICtrafficonnagios.Usage(){echo"Usage:check_traffic.sh[options]"echo"-HHostIP."echo"-Pnet-snmpcommunitystring."echo"-NNICdesc."echo"-Wnagioswarningvalue.Format:200,300.200isintraffic.300isouttraffic.unit:Kb.Default:5000,5000"echo"-Cnagioscritvalue.Reference-W.Default:10000,10000"echo"-Vnet-snmpversion.Default2c."exit2}DefaultValue(){if[-z"$IP"-o-z"$nicdesc"-o-z"$community"];thenecho-e"Error:Parameternotenough.\n"Usagefiif[-z"$warn"];thenwarn="5000,5000"fiif[-z"$crit"];thencrit="10000,10000"fiif[-z"$version"];thenversion=2cfi}GetResult(){while[1]doindex=`snmpwalk-v$version-c$community$IPIF-MIB::ifDescr|grep"${nicdesc}$"|awk-F'.''{print$2}'|awk'{print$1}'`if[$?-ne0];thenecho"Error:snmpwalkwrong."exit2fiif[-z"$index"];thencontinueelsebreakfidonetempfile="/tmp/traffic.${IP}-$index"while[1]doif[-f"$tempfile"];thenvalue=`cat$tempfile`last_time=`echo"$value"|awk'{print$1}'`last_in_traffic=`echo"$value"|awk'{print$2}'`last_out_traffic=`echo"$value"|awk'{print$3}'`now_time=`date+%s`now_in_traffic=`snmpwalk-v$version-c$community$IPIF-MIB::ifInOctets.${index}|awk'{print$NF}'`now_out_traffic=`snmpwalk-v$version-c$community$IPIF-MIB::ifOutOctets.${index}|awk'{print$NF}'`if[-z"$now_in_traffic"-o-z"$now_out_traffic"];thensleep10continuefiin_traffic=$(($now_in_traffic-$last_in_traffic))out_traffic=$(($now_out_traffic-$last_out_traffic))second=$(($now_time-$last_time))elsenow_time=`date+%s`now_in_traffic=`snmpwalk-v$version-c$community$IPIF-MIB::ifInOctets.${index}|awk'{print$NF}'`now_out_traffic=`snmpwalk-v$version-c$community$IPIF-MIB::ifOutOctets.${index}|awk'{print$NF}'`if[-z"$now_in_traffic"-o-z"$now_out_traffic"];thensleep10continuefiin_traffic=0out_traffic=0fiecho"$now_time$now_in_traffic$now_out_traffic">$tempfileif[$?-ne0];thenecho"$tempfilewritefail."exit2fiif[$in_traffic-le0-o$out_traffic-le0];thensleep10continueelsein_result=$(($in_traffic/$second/1024*8))out_result=$(($out_traffic/$second/1024*8))breakfidone#warnvaulein_warn=`echo$warn|awk-F',''{print$1}'`out_warn=`echo$warn|awk-F',''{print$2}'`#critvaluein_crit=`echo$crit|awk-F',''{print$1}'`out_crit=`echo$crit|awk-F',''{print$2}'`echo"IN:${in_result}Kbps[${in_warn}Kbps][${in_crit}Kbps]OUT:${out_result}Kbps[${out_warn}Kbps][${out_crit}Kbps]|IN=${in_result}Kb;OUT=${out_result}Kb;"if[$in_result-ge$in_crit-o$out_result-ge$out_crit];thenexit2fiif[$in_result-ge$in_warn-o$out_result-ge$out_warn];thenexit1fiexit0}whilegetoptsH:P:N:W:C:V:argsdocase$argsinH)IP="$OPTARG";;P)community="$OPTARG";;W)warn="$OPTARG";;C)crit="$OPTARG";;V)version="$OPTARG";;N)nicdesc="$OPTARG";;?)UsageesacdoneDefaultValueGetResult

需要注意的地方:

使用IF-MIB::ifDescr,使用网卡名称来获取网卡对应的索引值,然后使用IF-MIB::ifInOctets.{index}和IF-MIB::ifOutOctets.{index}来获取网卡的进出流量。

使用snmpwalk -v 2c -c public 127.0.0.1IF-MIB::ifDescr 来查看有哪些接口,找到自己对应的。

要保证使用snmpwalk能抓取到数据。所以脚本中使用死循环来判断。

由于使用的snmp的32位计数器,所以当达到最大值时,计数器会从头开始。这样取两次间隔时会出现负数,所以脚本中有判断两次间隔的值一定要大于0。同时使用sleep 10来延迟10秒再取值,同时 这个间隔时间最好不要小于10s,因为使用snmpwalk抓取数据时,间隔太小会导致抓取到的值是一样的。

临时文件的权限,如果先手动运行就会就root用户,导致放在naigos中的时候不能写临时文件。

被监控机要安装snmp服务。

本脚本实用于linux 和windows。同时满足pnp4nagios的绘图。当然要自己定义模板(见下面)


本人使用:

定义nagiso命令:

definecommand{command_namecheck_trafficcommand_line$USER1$/check_traffic.sh-H$HOSTADDRESS$-P$ARG1$-W$ARG2$-C$ARG3$-N$ARG4$#ARG1issnmp-community;ARG2iswarn;ARG3iscrit;ARG4isNICName}

定义nagios 服务:

windows 的

defineservice{useXXXhost_nameXXXservice_descriptionwan_trafficcheck_commandcheck_traffic!public!5000,5000!9000,9000!"NetDevicePVDriver#2"}

linux的

defineservice{useXXXhost_nameXXXservice_descriptionwan_trafficcheck_commandcheck_traffic!public!10000,12000!14000,14000!eth2}


pnp4nagios的模板

[root@nagiospnp4nagios]#catshare/templates/check_traffic.php<?php###Copyright(c)2006-2010JoergLinge(http://www.pnp4nagios.org)##Plugin:check_iftraffic.pl(COUNTER)#$opt[1]="--vertical-label\"Traffic\"-b1024--title\"InterfaceTrafficfor$hostname/$servicedesc\"";$def[1]="DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE";$def[1].="DEF:var2=$RRDFILE[2]:$DS[2]:AVERAGE";$def[1].="LINE1:var1#003300:\"in\"";$def[1].="GPRINT:var1:LAST:\"%7.2lf%SKb/slast\"";$def[1].="GPRINT:var1:AVERAGE:\"%7.2lf%SKb/savg\"";$def[1].="GPRINT:var1:MAX:\"%7.2lf%SKb/smax\\n\"";$def[1].="LINE1:var2#00ff00:\"out\"";$def[1].="GPRINT:var2:LAST:\"%7.2lf%SKb/slast\"";$def[1].="GPRINT:var2:AVERAGE:\"%7.2lf%SKb/savg\"";$def[1].="GPRINT:var2:MAX:\"%7.2lf%SKb/smax\""?>