summaryrefslogtreecommitdiff
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
new init of legacy Cisco 678 monitoring scripts;
Diffstat (limited to '')
-rw-r--r--cisco678.html27
-rw-r--r--cisco678polld.sh252
-rwxr-xr-xstart-cisco678polld.sh117
3 files changed, 396 insertions, 0 deletions
diff --git a/cisco678.html b/cisco678.html
new file mode 100644
index 0000000..1643be1
--- /dev/null
+++ b/cisco678.html
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
+<head>
+ <title>cisco-678 traffic stats</title>
+ <link rel="stylesheet" type="text/css" href="/" />
+ <meta http-equiv="refresh" content=60 />
+</head>
+<body style="background-color:#000000">
+ <table>
+ <tr>
+ <td> <img src="cisco678polld_ppp_1h.png" /> </td>
+ <td> <img src="cisco678polld_ppp_12h.png" /> </td>
+ <td> <img src="cisco678polld_ppp_48h.png" /> </td>
+ <td> <img src="cisco678polld_ppp_8d.png" /> </td>
+ <td> <img src="cisco678polld_ppp_64d.png" /> </td>
+ </tr>
+ <tr>
+ <td> <img src="cisco678polld_eth_1h.png" /> </td>
+ <td> <img src="cisco678polld_eth_12h.png" /> </td>
+ <td> <img src="cisco678polld_eth_48h.png" /> </td>
+ <td> <img src="cisco678polld_eth_8d.png" /> </td>
+ <td> <img src="cisco678polld_eth_64d.png" /> </td>
+ </tr>
+ </table>
+</body>
+</html>
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
diff --git a/start-cisco678polld.sh b/start-cisco678polld.sh
new file mode 100755
index 0000000..fb82ef0
--- /dev/null
+++ b/start-cisco678polld.sh
@@ -0,0 +1,117 @@
+#!/bin/sh
+
+### check to see if cisco678polld.sh is running, start if needed
+
+#clear
+#reset
+
+### execution tracing ON
+#set -x
+
+DAEMON=cisco678polld.sh
+DPATH=~/mon_rrd
+DLOCK=/var/tmp/${DAEMON}.lock
+
+
+### check lock file
+cklock() {
+ if [ -f ${1} ] ; then
+ if [ -r ${1} ] ; then
+ DPID=$( cat ${1} )
+ else
+ echo lock is not readable
+ fi
+ else
+ echo lock does not exist
+ fi
+}
+
+
+### check lock pid
+cklockpid() {
+ if [ ${1} ] ; then
+ CKPID=$( ps ax |\
+ grep ${1} |\
+ grep -v 'grep' |\
+ awk '{print $1}' )
+ if [ ${CKPID} ] && [ ${1} -eq ${CKPID} ] ; then
+ echo proc is running, lock is valid
+ fi
+ else
+ echo lock pid does not exist
+ fi
+}
+
+
+### check for running procs by name
+ckprox() {
+ PSPIDZ=$( ps ax |\
+ grep ${DAEMON} |\
+ grep -v 'grep' |\
+ awk '{print $1}' )
+}
+
+
+start_daemon() {
+ ( ${DPATH}/${DAEMON} ) &
+ cklock ${DLOCK}
+ cklockpid ${DPID}
+}
+
+
+stop_daemon(){
+ ### remove lock, script should exit on its own
+ cklock ${DLOCK}
+ cklockpid ${DPID}
+ if [ -f ${DLOCK} ] ; then
+ rm -fv ${DLOCK}
+ fi
+}
+
+
+terminate_daemon() {
+ cklock ${DLOCK}
+ cklockpid ${DPID}
+ kill -9 ${DPID}
+}
+
+
+exterminate_daemons() {
+ ### EXTERMINATE!
+ ckprox ${DAEMON}
+ for PID in PSPIDZ ; do
+ kill -9 ${PID}
+ done
+}
+
+
+case "${1}" in
+ 'start')
+ start_daemon
+ ;;
+ 'stop')
+ stop_daemon
+ terminate_daemon
+ ;;
+ 'terminate')
+ stop_daemon
+ terminate_daemon
+ ;;
+ 'exterminate')
+ stop_daemon
+ terminate_daemon
+ exterminate_daemons
+ ;;
+ 'restart')
+ stop_daemon
+ terminate_daemon
+ start_daemon
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|terminate|exterminate|restart}"
+ ;;
+esac
+
+### execution tracing OFF
+set +x
+