Skip to content

Instantly share code, notes, and snippets.

@ladar
Last active January 20, 2022 02:06
Show Gist options
  • Save ladar/66d7657e9b88afc00d7f17c06f62bdbb to your computer and use it in GitHub Desktop.
Save ladar/66d7657e9b88afc00d7f17c06f62bdbb to your computer and use it in GitHub Desktop.
Generate bandwidth graphs for an AT&T internet connection.
#!/bin/bash
# Name: router-graph-setup.sh
# Author: Ladar Levison
# Gist: https://gist.github.com/ladar/66d7657e9b88afc00d7f17c06f62bdbb
# Description: A simple script to setup the pieces need to poll a router
# status page, and record the bandwidth/packet statistics. Then generate
# graphs for those values. In other words, this will allow you to generate
# usage graphs for your AT&T internet connection by polling the router.
# Tested against a Nokia BGW320-505 but it should work for AT&T router, as
# they all share the same web management interface.
# Setup Apache so the graphs can be view remotely.
dnf --assumeyes install curl httpd rrdtool
firewall-cmd --zone=public --add-service=http
truncate --size=0 /etc/httpd/conf.d/welcome.conf
systemctl enable --now httpd
# Uncomment to purge the existing files and re-install.
# rm -f /var/www/html/index.html
# rm -f /var/www/html/router-data.rrd
# rm -f /var/www/html/favicon-32x32.png
# rm -f /usr/local/bin/router-poll.sh
# rm -f /usr/local/bin/router-grapher.sh
# rm -f /etc/cron.d/router-poll
# rm -f /etc/cron.d/router-graph
# rm -f /var/www/html/router-{packets,bandwidth}-{hour,day,week}.png
if [ ! -f /var/www/html/router-data.rrd ]; then
rrdtool create /var/www/html/router-data.rrd --step 60 DS:receivepackets:COUNTER:10m:0:120000000 DS:transmitpackets:COUNTER:10m:0:120000000 DS:receivebytes:COUNTER:10m:0:75000000000 DS:transmitbytes:COUNTER:10m:0:75000000000 RRA:AVERAGE:0.5:1m:7d RRA:AVERAGE:0.5:5m:30d RRA:AVERAGE:0.5:30m:1y RRA:AVERAGE:0.5:60m:10y RRA:MAX:0.5:1m:7d RRA:MAX:0.5:5m:30d RRA:MAX:0.5:30m:1y RRA:MAX:0.5:60m:10y
fi
if [ ! -f /var/www/html/favicon-32x32.png ]; then
base64 -d <<-EOF > /var/www/html/favicon-32x32.png
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACBklEQVRYhe3XT4iNURjH8c/cd665
NTU0ozQ7YoUIKworWdmyk438CXNt1ChEk0aSko2ZhSymLBQ7KRsSNaFQFsxYjWRBZCg7i3Mud97e
98697h8L86tT9/7e557ne87znNN9WdB/qi1x/BMdxQy+oNDJxAku4yVW4Tu6O5W8F3dwD4tR7CTA
ICYxHhNrBUA/FtURtxbvMJzymwI4gc/4JGzrQSzPiNuBD9iT8eyvAUaEJhoUdmE3ruM9XuNSTHxY
6PS8o9YwQJfQwZMYyHm+ASfxAPexssZ8DQEkGMNDoYNboboBipgQjk9vi5JnApwXVrmxKqgHt+Po
mWfCpBmAJH4ZxjQeYZ+w6gl/zm6Wlgl98RVXsaKO5KtxDT8rAN2YjYkS7MJNnFZ7ZUvxAqciyAg+
4gbWpGK7sBN3hdNxBj+yAOpVP57jXMrvE+6JGaF027Afr/AUe4VyzilBowBLhG0frRFTwiE8wy1s
Tz3PBViHA/Jr2YfHwoXTjHIB1gun4Qg2C9s2Lly3W4W74IpQ07YAVCvBJmFHxvAEZ1uQvG6AdmoB
IBcgq77t8DIBSpiKAUM4Hj+/FRryWPQKeBO9IZSrvELKy5uvlAcwHYPKVT+YqkpWAahAlVNeIXoV
gLz55gAU8E34o1GMZvVohzcQF/37veBChJjt4LgopSTSdWJ07IVkXv0CbLuVOkjOD9sAAAAASUVO
RK5CYII=
EOF
fi
if [ ! -f /var/www/html/index.html ]; then
cat <<-EOF > /var/www/html/index.html
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>Router Usage Graphs</title>
<meta name="author" content="Ladar Levison"/>
<meta name="keywords" lang="en" content="graphs" />
<meta name="description" lang="en" content="There is nothing here so move right along." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<meta name="theme-color" content="#ffffff" />
<meta http-equiv="refresh" content="20" />
</head>
<body>
<div>
<a href="/hour.html"><img src="router-bandwidth-hour.png" alt="Hour Graph" /></a>
</div>
<div>
<a href="/day.html"><img src="router-bandwidth-day.png" alt="Day Graph" /></a>
</div>
<div>
<a href="/week.html"><img src="router-bandwidth-week.png" alt="Week Graph" /></a>
</div>
<div>
<a href="/hour.html"><img src="router-packets-hour.png" alt="Hour Graph" /></a>
</div>
<div>
<a href="/day.html"><img src="router-packets-day.png" alt="Day Graph" /></a>
</div>
<div>
<a href="/week.html"><img src="router-packets-week.png" alt="Week Graph" /></a>
</div>
</body>
</html>
EOF
fi
if [ ! -f /var/www/html/hour.html ]; then
cat <<-EOF > /var/www/html/hour.html
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>Router Usage Graphs</title>
<meta name="author" content="Ladar Levison"/>
<meta name="keywords" lang="en" content="graphs" />
<meta name="description" lang="en" content="There is nothing here so move right along." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<meta name="theme-color" content="#ffffff" />
<meta http-equiv="refresh" content="20" />
</head>
<body>
<div>
<a href="/index.html"><img src="router-bandwidth-hour.png" alt="Hour Graph" /></a>
</div>
<div>
<a href="/index.html"><img src="router-packets-hour.png" alt="Hour Graph" /></a>
</div>
</body>
</html>
EOF
fi
if [ ! -f /var/www/html/day.html ]; then
cat <<-EOF > /var/www/html/day.html
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>Router Usage Graphs</title>
<meta name="author" content="Ladar Levison"/>
<meta name="keywords" lang="en" content="graphs" />
<meta name="description" lang="en" content="There is nothing here so move right along." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<meta name="theme-color" content="#ffffff" />
<meta http-equiv="refresh" content="20" />
</head>
<body>
<div>
<a href="/index.html"><img src="router-bandwidth-day.png" alt="Day Graph" /></a>
</div>
<div>
<a href="/index.html"><img src="router-packets-day.png" alt="Day Graph" /></a>
</div>
</body>
</html>
EOF
fi
if [ ! -f /var/www/html/week.html ]; then
cat <<-EOF > /var/www/html/week.html
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>Router Usage Graphs</title>
<meta name="author" content="Ladar Levison"/>
<meta name="keywords" lang="en" content="graphs" />
<meta name="description" lang="en" content="There is nothing here so move right along." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<meta name="theme-color" content="#ffffff" />
<meta http-equiv="refresh" content="20" />
</head>
<body>
<div>
<a href="/index.html"><img src="router-bandwidth-week.png" alt="Week Graph" /></a>
</div>
<div>
<a href="/index.html"><img src="router-packets-week.png" alt="Week Graph" /></a>
</div>
</body>
</html>
EOF
fi
if [ ! -f /usr/local/bin/router-poll.sh ]; then
cat <<-EOF > /usr/local/bin/router-poll.sh
#!/bin/bash
S="\`date +%s\`"
D=\`echo \$(curl --silent --max-time 2 http://192.168.1.254/cgi-bin/broadbandstatistics.ha | grep -A 1 -E "Receive Packets|Transmit Packets|Receive Bytes|Transmit Bytes" | grep -Ev "\\-\\-|row|class" | sed "s/.*<td>\\(.*\\)<\\/td>/\\1/g") | sed "s/ /:/g"\`
if [ ! -z "\$D" ]; then
rrdtool update /var/www/html/router-data.rrd \$S:\$D
fi
# rrdtool graph /var/www/html/router-daily.png --start -86520 --end -120 DEF:inoctets=/var/www/html/router-data.rrd:receivebytes:AVERAGE DEF:outoctets=/var/www/html/router-data.rrd:transmitbytes:AVERAGE AREA:inoctets#00FF00:"In traffic" LINE1:outoctets#0000FF:"Out traffic" &>/dev/null
# rrdtool graph /var/www/html/router-hourly.png --start -3720 --end -120 DEF:inoctets=/var/www/html/router-data.rrd:receivebytes:AVERAGE DEF:outoctets=/var/www/html/router-data.rrd:transmitbytes:AVERAGE AREA:inoctets#00FF00:"In traffic" LINE1:outoctets#0000FF:"Out traffic" &>/dev/null
EOF
chmod +x /usr/local/bin/router-poll.sh
fi
if [ ! -f /usr/local/bin/router-graph.sh ]; then
cat <<-EOF > /usr/local/bin/router-graph.sh
#!/bin/bash
rrdtool graph /var/www/html/router-bandwidth-hour.png \\
-w 850 -h 175 -a PNG \\
--slope-mode \\
--start end-3600 --end now-70 \\
--font DEFAULT:10: \\
--title "Bandwidth Usage (1 hour)" \\
--watermark "\`date +'%b %_d at %_I:%M %P' | sed 's/ / /g'\`" \\
--vertical-label "bits/sec" \\
--x-grid MINUTE:1:MINUTE:10:MINUTE:10:0:%R \\
--lower-limit=0 \\
--units-exponent=6 \\
DEF:BytesIn=/var/www/html/router-data.rrd:receivebytes:AVERAGE \\
DEF:BytesOut=/var/www/html/router-data.rrd:transmitbytes:AVERAGE \\
CDEF:BitsIn=BytesIn,8,* \\
CDEF:BitsOut=BytesOut,8,* \\
VDEF:BitsInMax=BitsIn,MAXIMUM \\
VDEF:BitsInAvg=BitsIn,AVERAGE \\
VDEF:BitsInMin=BitsIn,MINIMUM \\
VDEF:BitsInLast=BitsIn,LAST \\
VDEF:BitsOutMax=BitsOut,MAXIMUM \\
VDEF:BitsOutAvg=BitsOut,AVERAGE \\
VDEF:BitsOutMin=BitsOut,MINIMUM \\
VDEF:BitsOutLast=BitsOut,LAST \\
COMMENT:"\\s" \\
AREA:BitsOut#33CC33:"Transmit" \\
GPRINT:BitsOutLast:"Cur\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsOutAvg:"Avg\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsOutMax:"Max\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsOutMin:"Min\\: %7.2lf %Sbits/sec\\n" \\
LINE3:BitsIn#0000CC:"Receive " \\
GPRINT:BitsInLast:"Cur\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsInAvg:"Avg\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsInMax:"Max\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsInMin:"Min\\: %7.2lf %Sbits/sec\\n" &> /dev/null
rrdtool graph /var/www/html/router-bandwidth-day.png \\
-w 850 -h 175 -a PNG \\
--slope-mode \\
--start end-86400 --end now-70 \\
--font DEFAULT:10: \\
--title "Bandwidth Usage (1 day)" \\
--watermark "\`date +'%b %_d at %_I:%M %P' | sed 's/ / /g'\`" \\
--vertical-label "bits/sec" \\
--x-grid MINUTE:10:HOUR:1:MINUTE:120:0:%R \\
--lower-limit=0 \\
--units-exponent=6 \\
DEF:BytesIn=/var/www/html/router-data.rrd:receivebytes:AVERAGE \\
DEF:BytesOut=/var/www/html/router-data.rrd:transmitbytes:AVERAGE \\
CDEF:BitsIn=BytesIn,8,* \\
CDEF:BitsOut=BytesOut,8,* \\
VDEF:BitsInMax=BitsIn,MAXIMUM \\
VDEF:BitsInAvg=BitsIn,AVERAGE \\
VDEF:BitsInMin=BitsIn,MINIMUM \\
VDEF:BitsInLast=BitsIn,LAST \\
VDEF:BitsOutMax=BitsOut,MAXIMUM \\
VDEF:BitsOutAvg=BitsOut,AVERAGE \\
VDEF:BitsOutMin=BitsOut,MINIMUM \\
VDEF:BitsOutLast=BitsOut,LAST \\
COMMENT:"\\s" \\
AREA:BitsOut#33CC33:"Transmit" \\
GPRINT:BitsOutLast:"Cur\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsOutAvg:"Avg\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsOutMax:"Max\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsOutMin:"Min\\: %7.2lf %Sbits/sec\\n" \\
LINE3:BitsIn#0000CC:"Receive " \\
GPRINT:BitsInLast:"Cur\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsInAvg:"Avg\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsInMax:"Max\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsInMin:"Min\\: %7.2lf %Sbits/sec\\n" &> /dev/null
rrdtool graph /var/www/html/router-bandwidth-week.png \\
-w 850 -h 175 -a PNG \\
--slope-mode \\
--start end-604800 --end now-70 \\
--font DEFAULT:10: \\
--title "Bandwidth Usage (1 week)" \\
--watermark "\`date +'%b %_d at %_I:%M %P' | sed 's/ / /g'\`" \\
--vertical-label "bits/sec" \\
--x-grid HOUR:8:DAY:1:DAY:1:86400:%A \\
--lower-limit=0 \\
--units-exponent=6 \\
DEF:BytesIn=/var/www/html/router-data.rrd:receivebytes:AVERAGE \\
DEF:BytesOut=/var/www/html/router-data.rrd:transmitbytes:AVERAGE \\
CDEF:BitsIn=BytesIn,8,* \\
CDEF:BitsOut=BytesOut,8,* \\
VDEF:BitsInMax=BitsIn,MAXIMUM \\
VDEF:BitsInAvg=BitsIn,AVERAGE \\
VDEF:BitsInMin=BitsIn,MINIMUM \\
VDEF:BitsInLast=BitsIn,LAST \\
VDEF:BitsOutMax=BitsOut,MAXIMUM \\
VDEF:BitsOutAvg=BitsOut,AVERAGE \\
VDEF:BitsOutMin=BitsOut,MINIMUM \\
VDEF:BitsOutLast=BitsOut,LAST \\
COMMENT:"\\s" \\
AREA:BitsOut#33CC33:"Transmit" \\
GPRINT:BitsOutLast:"Cur\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsOutAvg:"Avg\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsOutMax:"Max\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsOutMin:"Min\\: %7.2lf %Sbits/sec\\n" \\
LINE3:BitsIn#0000CC:"Receive " \\
GPRINT:BitsInLast:"Cur\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsInAvg:"Avg\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsInMax:"Max\\: %7.2lf %Sbits/sec" \\
GPRINT:BitsInMin:"Min\\: %7.2lf %Sbits/sec\\n" &> /dev/null
rrdtool graph /var/www/html/router-packets-hour.png \\
-w 850 -h 175 -a PNG \\
--slope-mode \\
--units-exponent 0 \\
--start end-3600 --end now-70 \\
--font DEFAULT:10: \\
--title "Packet Fowarding Rate (1 hour)" \\
--watermark "\`date +'%b %_d at %_I:%M %P' | sed 's/ / /g'\`" \\
--vertical-label "packets/sec" \\
--x-grid MINUTE:1:MINUTE:10:MINUTE:10:0:%R \\
--lower-limit=0 \\
DEF:PktsIn=/var/www/html/router-data.rrd:receivepackets:AVERAGE \\
DEF:PktsOut=/var/www/html/router-data.rrd:transmitpackets:AVERAGE \\
COMMENT:"\\s" \\
AREA:PktsOut#33CC33:"Transmit" \\
GPRINT:PktsOut:LAST:"Cur\\: %8.0lf pkts/sec" \\
GPRINT:PktsOut:AVERAGE:"Avg\\: %8.0lf pkts/sec" \\
GPRINT:PktsOut:MAX:"Max\\: %8.0lf pkts/sec" \\
GPRINT:PktsOut:MIN:"Min\\: %8.0lf pkts/sec\\n" \\
LINE3:PktsIn#0000CC:"Receive " \\
GPRINT:PktsIn:LAST:"Cur\\: %8.0lf pkts/sec" \\
GPRINT:PktsIn:AVERAGE:"Avg\\: %8.0lf pkts/sec" \\
GPRINT:PktsIn:MAX:"Max\\: %8.0lf pkts/sec" \\
GPRINT:PktsIn:MIN:"Min\\: %8.0lf pkts/sec\\n" &> /dev/null
rrdtool graph /var/www/html/router-packets-day.png \\
-w 850 -h 175 -a PNG \\
--slope-mode \\
--units-exponent 0 \\
--start end-86400 --end now-70 \\
--font DEFAULT:10: \\
--title "Packet Fowarding Rate (1 day)" \\
--watermark "\`date +'%b %_d at %_I:%M %P' | sed 's/ / /g'\`" \\
--vertical-label "packets/sec" \\
--x-grid MINUTE:10:HOUR:1:MINUTE:120:0:%R \\
--lower-limit=0 \\
DEF:PktsIn=/var/www/html/router-data.rrd:receivepackets:AVERAGE \\
DEF:PktsOut=/var/www/html/router-data.rrd:transmitpackets:AVERAGE \\
COMMENT:"\\s" \\
AREA:PktsOut#33CC33:"Transmit" \\
GPRINT:PktsOut:LAST:"Cur\\: %8.0lf pkts/sec" \\
GPRINT:PktsOut:AVERAGE:"Avg\\: %8.0lf pkts/sec" \\
GPRINT:PktsOut:MAX:"Max\\: %8.0lf pkts/sec" \\
GPRINT:PktsOut:MIN:"Min\\: %8.0lf pkts/sec\\n" \\
LINE3:PktsIn#0000CC:"Receive " \\
GPRINT:PktsIn:LAST:"Cur\\: %8.0lf pkts/sec" \\
GPRINT:PktsIn:AVERAGE:"Avg\\: %8.0lf pkts/sec" \\
GPRINT:PktsIn:MAX:"Max\\: %8.0lf pkts/sec" \\
GPRINT:PktsIn:MIN:"Min\\: %8.0lf pkts/sec\\n" &> /dev/null
rrdtool graph /var/www/html/router-packets-week.png \\
-w 850 -h 175 -a PNG \\
--slope-mode \\
--units-exponent 0 \\
--start end-604800 --end now-70 \\
--font DEFAULT:10: \\
--title "Packet Fowarding Rate (1 week)" \\
--watermark "\`date +'%b %_d at %_I:%M %P' | sed 's/ / /g'\`" \\
--vertical-label "packets/sec" \\
--x-grid HOUR:8:DAY:1:DAY:1:86400:%A \\
--lower-limit=0 \\
DEF:PktsIn=/var/www/html/router-data.rrd:receivepackets:AVERAGE \\
DEF:PktsOut=/var/www/html/router-data.rrd:transmitpackets:AVERAGE \\
COMMENT:"\\s" \\
AREA:PktsOut#33CC33:"Transmit" \\
GPRINT:PktsOut:LAST:"Cur\\: %8.0lf pkts/sec" \\
GPRINT:PktsOut:AVERAGE:"Avg\\: %8.0lf pkts/sec" \\
GPRINT:PktsOut:MAX:"Max\\: %8.0lf pkts/sec" \\
GPRINT:PktsOut:MIN:"Min\\: %8.0lf pkts/sec\\n" \\
LINE3:PktsIn#0000CC:"Receive " \\
GPRINT:PktsIn:LAST:"Cur\\: %8.0lf pkts/sec" \\
GPRINT:PktsIn:AVERAGE:"Avg\\: %8.0lf pkts/sec" \\
GPRINT:PktsIn:MAX:"Max\\: %8.0lf pkts/sec" \\
GPRINT:PktsIn:MIN:"Min\\: %8.0lf pkts/sec\\n" &> /dev/null
EOF
chmod +x /usr/local/bin/router-graph.sh
fi
if [ ! -f /etc/cron.d/router-poll ]; then
cat <<-EOF > /etc/cron.d/router-poll
* * * * * root /usr/local/bin/router-poll.sh
EOF
fi
if [ ! -f /etc/cron.d/router-graph ]; then
cat <<-EOF > /etc/cron.d/router-graph
* * * * * root /usr/local/bin/router-graph.sh
EOF
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment