summaryrefslogtreecommitdiff
path: root/cisco678polld.sh
diff options
context:
space:
mode:
authorwukong <wukong@longaeva>2026-05-23 22:10:21 -0700
committerwukong <wukong@longaeva>2026-05-23 22:10:21 -0700
commit1afd0eb13b84a642a620c721917df3df03767c5e (patch)
tree3a02ad72bee98a75e506dbc07417a15589d88bfd /cisco678polld.sh
new init of legacy Cisco 678 monitoring scripts;
Diffstat (limited to '')
-rw-r--r--cisco678polld.sh252
1 files changed, 252 insertions, 0 deletions
diff --git a/cisco678polld.sh b/cisco678polld.sh
new file mode 100644
index 0000000..b017601
--- /dev/null
+++ b/cisco678polld.sh
@@ -0,0 +1,252 @@
+#!/bin/bash
+
+### cisco678polld
+# written by <sp>
+# 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
+ echo ${DBDIR}/${PPPDBFILE} does not exist!
+ 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"
+ 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