diff options
| author | wukong <wukong@longaeva> | 2026-05-23 22:10:21 -0700 |
|---|---|---|
| committer | wukong <wukong@longaeva> | 2026-05-23 22:10:21 -0700 |
| commit | 1afd0eb13b84a642a620c721917df3df03767c5e (patch) | |
| tree | 3a02ad72bee98a75e506dbc07417a15589d88bfd | |
new init of legacy Cisco 678 monitoring scripts;
Diffstat (limited to '')
| -rw-r--r-- | cisco678.html | 27 | ||||
| -rw-r--r-- | cisco678polld.sh | 252 | ||||
| -rwxr-xr-x | start-cisco678polld.sh | 117 |
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 + |
