#!/bin/bash ### cisco678polld # written by # 1) poll cisco 678 ADSL modem via SNMP # 2) save interface counter data to rrd file # 3) generate plots ### execution tracing ON (debug) #set -x ### bail if anything exits abnormally set -e ### check/make lock ckmklock() { if [ -f ${LOCKFILE} ] ; then printf "${LOCKFILE} found, exiting ...\n" exit else printf "$$" > ${LOCKFILE} trap "rm -f ${LOCKFILE} > /dev/null 2>&1" EXIT fi } ### check for db files, create if necessary ckmkdb() { if [ ! -f ${DBDIR}/${ETHDBFILE} ] ; then printf "${DBDIR}/${ETHDBFILE} does not exist!\n" RRDARGZ=("") RRDARGZ=( "${RRDARGZ[@]:0}" \ "-s ${RRDSTEP}" \ "DS:inoctets:COUNTER:120:U:U" \ "DS:outoctets:COUNTER:120:U:U" ) for CF in AVERAGE MIN MAX LAST ; do RRDARGZ=( "${RRDARGZ[@]:0}" \ "RRA:${CF}:0.5:1:2880" \ "RRA:${CF}:0.5:4:2880" \ "RRA:${CF}:0.5:20:2880" \ "RRA:${CF}:0.5:120:2880" \ "RRA:${CF}:0.5:720:2928" \ "RRA:${CF}:0.5:2880:2922" ) done echo rrdtool create ${DBDIR}/${ETHDBFILE} ${RRDARGZ[@]} unset RRDARGZ fi if [ ! -f ${DBDIR}/${PPPDBFILE} ] ; then printf "${DBDIR}/${PPPDBFILE} does not exist!\n" RRDARGZ=("") RRDARGZ=( "${RRDARGZ[@]:0}" \ "-s ${RRDSTEP}" \ "DS:inoctets:COUNTER:120:U:U" \ "DS:outoctets:COUNTER:120:U:U" ) for CF in AVERAGE MIN MAX LAST ; do RRDARGZ=( "${RRDARGZ[@]:0}" \ "RRA:${CF}:0.5:1:2880" \ "RRA:${CF}:0.5:4:2880" \ "RRA:${CF}:0.5:20:2880" \ "RRA:${CF}:0.5:120:2880" \ "RRA:${CF}:0.5:720:2928" \ "RRA:${CF}:0.5:2880:2922" ) done echo rrdtool create ${DBDIR}/${PPPDBFILE} ${RRDARGZ[@]} unset RRDARGZ else echo rrdtool info ${DBDIR}/${FDBFILE} fi } polldem() { IPADDR=10.0.0.1 COMMUNITY=0x09c5 ## poll cisco678 interface counters, return formatted rrd update string PPPSTR="$( date +%s ):$( ## wan0-0, PPP IN, octets snmpget -v1 -c ${COMMUNITY} ${IPADDR} 1.3.6.1.2.1.2.2.1.10.2 |\ awk '{print $4}' ):$( ## wan0-0, PPP OUT, octets snmpget -v1 -c ${COMMUNITY} ${IPADDR} 1.3.6.1.2.1.2.2.1.16.2 |\ awk '{print $4}' )" ETHSTR="$( date +%s ):$( ## eth0, ETH IN, octets snmpget -v1 -c ${COMMUNITY} ${IPADDR} 1.3.6.1.2.1.2.2.1.10.1 |\ awk '{print $4}' ):$( ## eth0, ETH OUT, octets snmpget -v1 -c ${COMMUNITY} ${IPADDR} 1.3.6.1.2.1.2.2.1.16.1 |\ awk '{print $4}' )" ## print counters printf "${PPPDBFILE} \t ${PPPSTR}\n" printf "${ETHDBFILE} \t ${ETHSTR}\n" ## save counter data rrdtool update ${DBDIR}/${PPPDBFILE} ${PPPSTR} rrdtool update ${DBDIR}/${ETHDBFILE} ${ETHSTR} } ### generate graph image plotdem() { printf "${DATESTR} [${RRDNAME}, ${RRDFILE}, ${IMGFILE}]\n" RRDARGZ=("") RRDARGZ=( "${RRDARGZ[@]:0}" \ "${common_graph_opts[@]:0}" \ "--start -${GRAPHTIME}" \ "--logarithmic" ) for DBDATAZ in in out ; do RRDARGZ=( "${RRDARGZ[@]:0}" \ "DEF:${DBDATAZ}octets=${DBDIR}/${RRDFILE}:${DBDATAZ}octets:AVERAGE" \ "DEF:${DBDATAZ}octets_min=${DBDIR}/${RRDFILE}:${DBDATAZ}octets:MIN" \ "DEF:${DBDATAZ}octets_max=${DBDIR}/${RRDFILE}:${DBDATAZ}octets:MAX" \ "CDEF:${DBDATAZ}octets_net=${DBDATAZ}octets_max,${DBDATAZ}octets_min,-" \ "CDEF:${DBDATAZ}bits=${DBDATAZ}octets,8,*" \ "CDEF:${DBDATAZ}bits_min=${DBDATAZ}octets_min,8,*" \ "CDEF:${DBDATAZ}bits_max=${DBDATAZ}octets_max,8,*" \ "CDEF:${DBDATAZ}bits_net=${DBDATAZ}octets_net,8,*" \ ) case ${DBDATAZ} in in) RRDARGZ=( "${RRDARGZ[@]:0}" \ "AREA:${DBDATAZ}bits_min#00331133:" \ "STACK:${DBDATAZ}bits_net#00CC3377:" \ "LINE:${DBDATAZ}bits#00FF77CC:In\t" ) ; ;; out) RRDARGZ=( "${RRDARGZ[@]:0}" \ "AREA:${DBDATAZ}bits_min#00113333:" \ "STACK:${DBDATAZ}bits_net#0033CC77:" \ "LINE:${DBDATAZ}bits#0077FFCC:Out\t" ) ; ;; esac RRDARGZ=( "${RRDARGZ[@]:0}" \ "VDEF:${DBDATAZ}b_min=${DBDATAZ}bits_min,MINIMUM" \ "GPRINT:${DBDATAZ}b_min:Min=%.6lg%s\t" \ "VDEF:${DBDATAZ}b_max=${DBDATAZ}bits_max,MAXIMUM" \ "GPRINT:${DBDATAZ}b_max:Max=%.6lg%s\t" \ "VDEF:${DBDATAZ}bits_avg=${DBDATAZ}bits,AVERAGE" \ "GPRINT:${DBDATAZ}bits_avg:Avg=%.6lg%s" \ "VDEF:${DBDATAZ}bits_std=${DBDATAZ}bits,STDEV" \ "GPRINT:${DBDATAZ}bits_std:(+/-)%.6lg%s" \ "COMMENT:(bps)\n" \ ) done case ${INT} in ppp) TITLESTR="Cisco-678 PPP Interface (bits/s), [${GRAPHTIME}]" ; ;; eth) TITLESTR="Cisco-678 Ethernet Interface (bits/s), [${GRAPHTIME}]" ; ;; esac ( rrdtool graph ${GRAPHDIR}/${IMGFILE} \ --title "${TITLESTR}" \ --watermark "${DATESTR}" \ ${RRDARGZ[@]} ) & unset RRDARGZ } ### main main() { ## script parameters SCRIPTNAME=$( basename ${0} ) ETHDBNAME="${SCRIPTNAME}_eth" ETHDBFILE="${ETHDBNAME}.rrd" PPPDBNAME="${SCRIPTNAME}_ppp" PPPDBFILE="${PPPDBNAME}.rrd" ## file names LOCKFILE="/tmp/rrd/${SCRIPTNAME}.lock" LOGFILE="/tmp/rrd/${SCRIPTNAME}.log" DBDIR="/tmp/rrd/db" GRAPHDIR="/tmp/rrd/cisco678" RRDSTEP=15 WAIT=5 ## file checks ckmklock ckmkdb if [ ! -d ${GRAPHDIR} ] ; then mkdir -p ${GRAPHDIR} fi ## bash array for rrdtool arguments common_graph_opts=( "--lazy" \ "--border 0" \ "-h 275" \ "-w 720" \ "-c BACK#77777777" \ "-c CANVAS#000000CC" \ "-c FONT#CCCCCCCC" \ # "--font DEFAULT:0:Times" \ ) ## while lock is valid, continue polling/graphing while [ $( cat ${LOCKFILE} ) -eq $$ ] ; do polldem for INT in ppp eth ; do RRDNAME=${SCRIPTNAME}_${INT} RRDFILE=${RRDNAME}.rrd for GRAPHTIME in 1h 12h 48h 8d 64d ; do IMGFILE=${RRDNAME}_${GRAPHTIME}.png DATESTR="[$( date +%F\ %T )]" plotdem done done ## sampling interval sleep ${WAIT} done } main ### execution tracing OFF (debug) set +x