http://cocnm.computerisms.ca/index.php?title=/root/scripts/bwrprt.sh&feed=atom&action=history
/root/scripts/bwrprt.sh - Revision history
2024-03-29T05:50:07Z
Revision history for this page on the wiki
MediaWiki 1.41.0
http://cocnm.computerisms.ca/index.php?title=/root/scripts/bwrprt.sh&diff=386&oldid=prev
Bob at 03:49, 16 April 2014
2014-04-16T03:49:33Z
<p></p>
<p><b>New page</b></p><div><b><center>BIG FAT NOTE: This script is know to have issues on fast connections, particularly when using 32 bit systems on connections that can exceed 4 GB/hour<br><br />
This script still works well enough for slower connections, but find a script for faster connections with a few more features here: [[/root/scripts/bwrpt.pl]]</center></b><br><br />
<br />
<br />
<pre><br />
#!/bin/bash<br />
<br />
## Written by Bob Miller<br />
## Computerisms.ca<br />
## Last updated October 2012<br />
## Please feel free to share this script, but please do not claim it.<br />
<br />
## This script depends on xtables-addons, and usage of the ACCOUNT target.<br />
<br />
## This will set up the tables we need in iptables to do our accounting. We need one entry for each lan subnet, and 0/0 is for the external address:<br />
## iptables -t filter -I FORWARD -j ACCOUNT --addr 192.168.25.0/24 --tname lan<br />
## iptables -t mangle -I POSTROUTING -j ACCOUNT --addr 0/0 --tname wan<br />
<br />
## Hostname detection currently requires at least the nbtscan program, make sure that and the iptaccount program are in your PATH<br />
<br />
## Set this program to run every hour in your crontab. Note: if you can/will exceed the IPTWRAP or NETWRAP values in the space of one hour,<br />
## you will need to run this script more often, and adjust the TTLNOW value and routine to account for minutes instead of just hours.<br />
<br />
#########################################################################################<br />
#########################################################################################<br />
## ##<br />
## Configurable Options ##<br />
## ##<br />
#########################################################################################<br />
#########################################################################################<br />
<br />
## Next, we need to set up some variables to make configuration and life easy.<br />
## Modify the following variables to your needs<br />
<br />
## Make sure your path includes the iptaccount and nbtscan commands<br />
<br />
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/scripts<br />
<br />
## Set a comma-separated list of recipients for the daily report<br />
<br />
ADMINML=bob.miller@computerisms.com<br />
MLFRM=porchlian@computerisms.com<br />
<br />
## Set the total number of internal interfaces (do not include external interface) - Valid value is any integer higher than zero:<br />
<br />
NETNUM=2<br />
<br />
## these are the tables you configured your --tname as. Add more NNM* variables as needed<br />
<br />
NNM1=computerisms<br />
NNM2=pubaccess<br />
NNM3=<br />
NNM4=<br />
<br />
## For each table in iptaccount, Set the ethx interface of each port to match the NNM number (ie NNM1=IF1=ethx, NNM2=IF2=ethx)<br />
<br />
WAN=eth0<br />
IF1=eth1<br />
IF2=eth2<br />
IF3=<br />
IF4=<br />
<br />
## For the /sys statistics, the counter will wrap after a certain number of bits. On a 32-bit system, the counter wraps at<br />
## 32 bits (or (2^32)-1 or 4 GB, so set it as 4294967295. on a 64-bit system, this number is (2^63)-1 or 18446744073709551615. <br />
## Set this number for NETWRAP. For the iptaccount program, the wrap is currently hard coded to 32 bits so use 4294967295. <br />
## If this changes, it will presumably still need to wrap at some point, so set IPTWRAP to the number it wraps at.<br />
## Set the wrap numbers:<br />
<br />
IPTWRAP=4294967295<br />
NETWRAP=4294967295<br />
<br />
## Set a base directory to hold all your working stats. Stat files will be kept here for archival purposes<br />
<br />
WRKDIR=/root/scripts/bwfiles<br />
<br />
## set how much data is your 100% monthly usage limit in GB (valid value is any integer greater than zero):<br />
<br />
USAGE=90<br />
<br />
## Set if you want Mega or Mebi (valid values are 1000 or 1024)<br />
<br />
DIV=1000<br />
<br />
## Totalling and reporting should happen only once per day, at the end of day. <br />
## This is a way of only running the totals on the last hour of production. <br />
## Set this value to the last hour of the day the script runs in 24-hour format<br />
## Note that a report can only contain today's data, so you can't get 9-12PM on tomorrow's report<br />
## I put this here for testing, so I could make it run at the top of the next hour,<br />
## But it might be useful if you shut your interface or machine down on a schedule.<br />
<br />
TTLNOW=23<br />
<br />
#########################################################################################<br />
#########################################################################################<br />
## ##<br />
## END Configurable Options ##<br />
## ##<br />
#########################################################################################<br />
<br />
## That should be all the configuration items required. You probably shouldn't modify the rest of this <br />
## Here are more variables that we will need later.<br />
<br />
DOIPT=$(which iptaccount)<br />
DONBT=$(which nbtscan)<br />
<br />
## The following variables need to be set to prevent unwanted effects:<br />
<br />
TTLIN=0<br />
TTLOUT=0<br />
TTLWAN=0<br />
STIPTIN=0<br />
STIPTOUT=0<br />
TMTDIPTWAN=0<br />
TMTDRAWWANIN=0<br />
TMTDRAWWANOUT=0<br />
TMTDRAWWAN=0<br />
TMTDRAWWANIN=0<br />
TMTDRAWWANOUT=0<br />
TMTDIF=0<br />
TMTDIFIN=0<br />
TMTDIFOUT=0<br />
TMTDLAN=0<br />
TMTDLANIN=0<br />
TMTDLANOUT=0<br />
<br />
## These variables will give us a way to deal with IP addresses.<br />
<br />
LAN1=$(/sbin/ifconfig $IF1 | sed -n -e'/inet addr:/s/^.*inet addr:\([0-9.]*\).*$/\1/p' | cut -f 1,2,3 -d .)<br />
LAN2=$(/sbin/ifconfig $IF2 | sed -n -e'/inet addr:/s/^.*inet addr:\([0-9.]*\).*$/\1/p' | cut -f 1,2,3 -d .)<br />
LAN3=$(/sbin/ifconfig $IF3 | sed -n -e'/inet addr:/s/^.*inet addr:\([0-9.]*\).*$/\1/p' | cut -f 1,2,3 -d .)<br />
LAN4=$(/sbin/ifconfig $IF4 | sed -n -e'/inet addr:/s/^.*inet addr:\([0-9.]*\).*$/\1/p' | cut -f 1,2,3 -d .)<br />
<br />
## We need to create time variables for setting up our directory system and other things<br />
<br />
LOGDT=$(date "+%F %T")<br />
CURHOUR=$(date +%H)<br />
YR=$(date +%Y)<br />
MNTH=$(date +%m)<br />
DAY=$(date +%d)<br />
LSTYR=$(date +%Y --date="-1 day")<br />
LSTMNTH=$(date +%m --date="-1 day")<br />
LSTDAY=$(date +%d --date="-1 day")<br />
<br />
## Let's set up our directory system:<br />
<br />
if [ ! -d $WRKDIR ]; then<br />
mkdir $WRKDIR;<br />
fi<br />
if [ ! -d $WRKDIR/$YR ]; then<br />
mkdir $WRKDIR/$YR;<br />
fi<br />
if [ ! -d $WRKDIR/$YR/$MNTH ]; then<br />
mkdir $WRKDIR/$YR/$MNTH;<br />
fi<br />
if [ ! -d $WRKDIR/$YR/$MNTH ]; then<br />
mkdir $WRKDIR/$YR/$MNTH;<br />
fi<br />
if [ ! -d $WRKDIR/$YR/$MNTH/$DAY ]; then<br />
mkdir $WRKDIR/$YR/$MNTH/$DAY;<br />
fi<br />
<br />
## Lets make a working dir variable for yesterday and today<br />
<br />
CURWRKDIR=$WRKDIR/$YR/$MNTH/$DAY<br />
LSTWRKDIR=$WRKDIR/$LSTYR/$LSTMNTH/$LSTDAY<br />
<br />
## Now we need to put some data in these directories. This will populate all the LAN IPT data:<br />
<br />
for NUM in $(seq $NETNUM); do<br />
LAN=$(eval echo \$LAN$NUM)<br />
NNM=$(eval echo \$NNM$NUM)<br />
<br />
## If this is the first run of the day, this stanza will create our directory and bring forward totals from the previous day.<br />
<br />
if [ ! -d $CURWRKDIR/$LAN ]; then <br />
mkdir $CURWRKDIR/$LAN<br />
if [[ $(ls $CURWRKDIR/$LAN/*.in) == "" ]]; then<br />
if [[ $(ls $LSTWRKDIR/$LAN/*.in) != "" ]]; then<br />
cp $LSTWRKDIR/$LAN/*.in $CURWRKDIR/$LAN/<br />
fi<br />
fi<br />
if [[ $(ls $CURWRKDIR/$LAN/*.out) == "" ]]; then<br />
if [[ $(ls $LSTWRKDIR/$LAN/*.out) != "" ]]; then<br />
cp $LSTWRKDIR/$LAN/*.out $CURWRKDIR/$LAN/<br />
fi<br />
fi<br />
fi<br />
<br />
## Move last run's data into the .old files<br />
<br />
if [[ $(ls $CURWRKDIR/$LAN/*.in) != "" ]]; then<br />
for MVIN in $(ls $CURWRKDIR/$LAN/*.in); do <br />
mv $MVIN $MVIN.old<br />
done<br />
fi<br />
if [[ $(ls $CURWRKDIR/$LAN/*.out) != "" ]]; then<br />
for MVOUT in $(ls $CURWRKDIR/$LAN/*.out); do <br />
mv $MVOUT $MVOUT.old<br />
done<br />
fi<br />
<br />
## Populate this run's data.<br />
<br />
for DATA in $($DOIPT -l $NNM -s | grep $LAN); do<br />
FN=$(echo $DATA | cut -f 1 -d \;)<br />
echo $DATA | cut -f 3 -d \; > $CURWRKDIR/$LAN/$FN.in<br />
echo $DATA | cut -f 5 -d \; > $CURWRKDIR/$LAN/$FN.out<br />
done<br />
for RT in $(ls $CURWRKDIR/$LAN/*.in); do<br />
HOST=$(basename $RT .in)<br />
NEWIN=$(cat $CURWRKDIR/$LAN/$HOST.in)<br />
if [ ! -e $CURWRKDIR/$LAN/$HOST.in.old ]; then<br />
echo 0 > $CURWRKDIR/$LAN/$HOST.in.old<br />
fi<br />
OLDIN=$(cat $CURWRKDIR/$LAN/$HOST.in.old)<br />
if [[ $NEWIN -lt $OLDIN ]]; then<br />
NEWIN=$(( $NEWIN + $IPTWRAP ))<br />
fi<br />
NEWOUT=$(cat $CURWRKDIR/$LAN/$HOST.out)<br />
if [ ! -e $CURWRKDIR/$LAN/$HOST.out.old ]; then<br />
echo 0 > $CURWRKDIR/$LAN/$HOST.out.old<br />
fi<br />
OLDOUT=$(cat $CURWRKDIR/$LAN/$HOST.out.old)<br />
if [[ $NEWOUT -lt $OLDOUT ]]; then<br />
NEWOUT=$(( $NEWOUT + $IPTWRAP ))<br />
fi<br />
RUNIN=$(( $NEWIN - $OLDIN ))<br />
RUNOUT=$(( $NEWOUT - $OLDOUT ))<br />
echo "$LOGDT;$RUNIN;$RUNOUT" >> $CURWRKDIR/$LAN/$HOST.rt<br />
done <br />
done<br />
<br />
## This will give IPT data for external interface<br />
## First, check if this is first run today and if it is set up directory and bring last data forward<br />
<br />
if [ ! -d $CURWRKDIR/WAN ]; then<br />
mkdir $CURWRKDIR/WAN<br />
if [ ! -e $CURWRKDIR/WAN/wan ]; then<br />
if [ -e $LSTWRKDIR/WAN/wan ]; then<br />
cp $LSTWRKDIR/WAN/wan $CURWRKDIR/WAN/<br />
fi<br />
fi<br />
fi<br />
if [ -e $CURWRKDIR/WAN/wan ]; then<br />
mv $CURWRKDIR/WAN/wan $CURWRKDIR/WAN/wan.old<br />
else<br />
echo 0 > $CURWRKDIR/WAN/wan.old<br />
fi<br />
<br />
## Now populate the current data:<br />
<br />
$DOIPT -l wan | grep bytes | cut -f 4 -d : | cut -f 2 -d " " > $CURWRKDIR/WAN/wan<br />
NEWWAN=$(cat $CURWRKDIR/WAN/wan)<br />
OLDWAN=$(cat $CURWRKDIR/WAN/wan.old)<br />
if [[ $NEWWAN -lt $OLDWAN ]]; then<br />
NEWWAN=$(( $NEWWAN + $IPTWRAP ))<br />
fi<br />
RUNWAN=$(echo "$NEWWAN - $OLDWAN" | bc)<br />
echo "$LOGDT;$NEWWAN;$OLDWAN;$RUNWAN" >> $CURWRKDIR/WAN/wan.rt<br />
<br />
## This is to give raw egress/ingress data on internal interfaces<br />
<br />
for NUM in $(seq $NETNUM); do<br />
IF=$(eval echo \$IF$NUM)<br />
<br />
## Test if this is first run, if it is, make the directory and bring last day's data forward.<br />
<br />
if [ ! -d $CURWRKDIR/IFACE ]; then<br />
mkdir $CURWRKDIR/IFACE<br />
fi<br />
if [ ! -e $CURWRKDIR/IFACE/$IF.in ]; then<br />
if [ -e $LSTWRKDIR/IFACE/$IF.in ]; then<br />
cp $LSTWRKDIR/IFACE/$IF.in $CURWRKDIR/IFACE/<br />
fi<br />
fi<br />
if [ ! -e $CURWRKDIR/IFACE/$IF.out ]; then<br />
if [ -e $LSTWRKDIR/IFACE/$IF.out ]; then<br />
cp $LSTWRKDIR/IFACE/$IF.out $CURWRKDIR/IFACE/<br />
fi<br />
fi<br />
if [ -e $CURWRKDIR/IFACE/$IF.in ]; then<br />
mv $CURWRKDIR/IFACE/$IF.in $CURWRKDIR/IFACE/$IF.in.old<br />
else<br />
echo 0 > $CURWRKDIR/IFACE/$IF.in.old<br />
fi<br />
if [ -e $CURWRKDIR/IFACE/$IF.out ]; then<br />
mv $CURWRKDIR/IFACE/$IF.out $CURWRKDIR/IFACE/$IF.out.old<br />
else<br />
echo 0 > $CURWRKDIR/IFACE/$IF.out.old<br />
fi<br />
cat /sys/class/net/$IF/statistics/rx_bytes > $CURWRKDIR/IFACE/$IF.in<br />
cat /sys/class/net/$IF/statistics/tx_bytes > $CURWRKDIR/IFACE/$IF.out<br />
NEWRX=$(cat $CURWRKDIR/IFACE/$IF.in)<br />
NEWTX=$(cat $CURWRKDIR/IFACE/$IF.out)<br />
OLDRX=$(cat $CURWRKDIR/IFACE/$IF.in.old)<br />
OLDTX=$(cat $CURWRKDIR/IFACE/$IF.out.old)<br />
if [[ $NEWRX -lt $OLDRX ]]; then<br />
NEWRX=$(( $NEWRX + $NETWRAP ))<br />
fi<br />
if [[ $NEWTX -lt $OLDTX ]]; then<br />
NEWTX=$(( $NEWTX + $NETWRAP ))<br />
fi<br />
RUNRX=$(( $NEWRX - $OLDRX ))<br />
RUNTX=$(( $NEWTX - $OLDTX ))<br />
echo "$LOGDT;$RUNRX;$RUNTX" >> $CURWRKDIR/IFACE/$IF.rt<br />
done<br />
<br />
## Now we need egress/ingress for the wan<br />
<br />
if [ ! -e $CURWRKDIR/IFACE/$WAN.in ]; then<br />
if [ -e $LSTWRKDIR/IFACE/$WAN.in ]; then<br />
cp $LSTWRKDIR/IFACE/$WAN.in $CURWRKDIR/IFACE/<br />
fi<br />
fi<br />
if [ ! -e $CURWRKDIR/IFACE/$WAN.out ]; then<br />
if [ -e $LSTWRKDIR/IFACE/$WAN.out ]; then<br />
cp $LSTWRKDIR/IFACE/$WAN.out $CURWRKDIR/IFACE/<br />
fi<br />
fi<br />
if [ -e $CURWRKDIR/IFACE/$WAN.in ]; then<br />
mv $CURWRKDIR/IFACE/$WAN.in $CURWRKDIR/IFACE/$WAN.in.old<br />
else<br />
echo 0 > $CURWRKDIR/IFACE/$WAN.in.old<br />
fi<br />
if [ -e $CURWRKDIR/IFACE/$WAN.out ]; then<br />
mv $CURWRKDIR/IFACE/$WAN.out $CURWRKDIR/IFACE/$WAN.out.old<br />
else<br />
echo 0 > $CURWRKDIR/IFACE/$WAN.out.old<br />
fi<br />
cat /sys/class/net/$WAN/statistics/rx_bytes > $CURWRKDIR/IFACE/$WAN.in<br />
cat /sys/class/net/$WAN/statistics/tx_bytes > $CURWRKDIR/IFACE/$WAN.out<br />
NEWRX=$(cat $CURWRKDIR/IFACE/$WAN.in)<br />
NEWTX=$(cat $CURWRKDIR/IFACE/$WAN.out)<br />
OLDRX=$(cat $CURWRKDIR/IFACE/$WAN.in.old)<br />
OLDTX=$(cat $CURWRKDIR/IFACE/$WAN.out.old)<br />
if [[ $NEWRX -lt $OLDRX ]]; then<br />
NEWRX=$(( $NEWRX + $NETWRAP ))<br />
fi<br />
if [[ $NEWTX -lt $OLDTX ]]; then<br />
NEWTX=$(( $NEWTX + $NETWRAP ))<br />
fi<br />
RUNRX=$(( $NEWRX - $OLDRX ))<br />
RUNTX=$(( $NEWTX - $OLDTX ))<br />
echo "$LOGDT;$RUNRX;$RUNTX" >> $CURWRKDIR/IFACE/$WAN.rt<br />
<br />
## Whew!! that should provide us all the raw data we need to generate some totals and put a report together.<br />
## We want all of the above to run frequently enough that neither of the *WRAP variables is exceeded<br />
## From this point, we start calculating daily totals and generating reports<br />
<br />
## We only want to generate totals once per day. In this case, when CURHOUR is now.<br />
## Make sure to not delete the matching fi statement at the end of the script:<br />
<br />
if [[ $CURHOUR == $TTLNOW ]]; then<br />
<br />
## First lets generate totals from our interface data.<br />
<br />
for TIF in $(ls $CURWRKDIR/IFACE/*.rt); do<br />
while read ETH; do<br />
RAWIN=$(echo $ETH | cut -f 2 -d \;)<br />
RAWOUT=$(echo $ETH | cut -f 3 -d \;)<br />
TTLIN=$(( $TTLIN + $RAWIN ))<br />
TTLOUT=$(( $TTLOUT + $RAWOUT ))<br />
done < $TIF<br />
DTTL=$(( $TTLIN + $TTLOUT ))<br />
IFN=$(basename $TIF .rt)<br />
echo "$IFN;$TTLIN;$TTLOUT;$DTTL" >> $CURWRKDIR/ttl.iface<br />
done<br />
<br />
## This will total up the ipt count for the external interface<br />
<br />
while read TWAN; do<br />
CNTWAN=$(echo $TWAN | cut -f 4 -d \;)<br />
TTLWAN=$(echo "$TTLWAN + $CNTWAN" | bc)<br />
done < $CURWRKDIR/WAN/wan.rt<br />
echo $TTLWAN > $CURWRKDIR/ttl.wan<br />
<br />
## Now we need to bring everythign together for the internal interface<br />
<br />
for NUM in $(seq $NETNUM); do<br />
STIPTOUT=0<br />
STIPTIN=0<br />
STIPT=0<br />
LAN=$(eval echo \$LAN$NUM)<br />
NNM=$(eval echo \$NNM$NUM)<br />
for TLAN in $(ls $CURWRKDIR/$LAN/*.rt); do<br />
TIPTIN=0<br />
TIPTOUT=0<br />
while read IPT; do<br />
IPTIN=$(echo $IPT | cut -f 2 -d \;)<br />
IPTOUT=$(echo $IPT | cut -f 3 -d \;)<br />
TIPTIN=$(( $TIPTIN + $IPTIN ))<br />
TIPTOUT=$(( $TIPTOUT + $IPTOUT ))<br />
done < $TLAN<br />
TIPT=$(( $TIPTIN + $TIPTOUT ))<br />
TFN=$(basename $TLAN .rt)<br />
echo "$TFN;$TIPTIN;$TIPTOUT;$TIPT" >> $CURWRKDIR/rpt.$NNM<br />
STIPTIN=$(( $STIPTIN + $TIPTIN ))<br />
STIPTOUT=$(( $STIPTOUT + $TIPTOUT ))<br />
done<br />
STIPT=$(( $STIPTIN + $STIPTOUT ))<br />
echo "$LAN;$STIPTIN;$STIPTOUT;$STIPT" >> $CURWRKDIR/ttl.lan<br />
done<br />
<br />
## Now we need to create some month-to-date stats<br />
<br />
for MTD in $(ls $WRKDIR/$YR/$MNTH); do<br />
MTDIPTWAN=$(cat $WRKDIR/$YR/$MNTH/$MTD/ttl.wan)<br />
TMTDIPTWAN=$(echo "$TMTDIPTWAN + $MTDIPTWAN" | bc)<br />
MTDRAWWANIN=$(cat $WRKDIR/$YR/$MNTH/$MTD/ttl.iface | grep $WAN | cut -f 2 -d \;)<br />
TMTDRAWWANIN=$(echo "$TMTDRAWWANIN + $MTDRAWWANIN" | bc)<br />
MTDRAWWANOUT=$(cat $WRKDIR/$YR/$MNTH/$MTD/ttl.iface | grep $WAN | cut -f 3 -d \;)<br />
TMTDRAWWANOUT=$(echo "$TMTDRAWWANOUT + $MTDRAWWANOUT" | bc)<br />
MTDRAWWAN=$(cat $WRKDIR/$YR/$MNTH/$MTD/ttl.iface | grep $WAN | cut -f 4 -d \;)<br />
TMTDRAWWAN=$(echo "$TMTDRAWWAN + $MTDRAWWAN" | bc)<br />
echo "IPT;$TMTDIPTWAN;RAW;$TMTDRAWWANIN;$TMTDRAWWANOUT;$TMTDRAWWAN" > $CURWRKDIR/mtd.$WAN<br />
for NUM in $(seq $NETNUM); do<br />
IF=$(eval echo \$IF$NUM)<br />
MTDIFIN=$(cat $WRKDIR/$YR/$MNTH/$MTD/ttl.iface | grep $IF | cut -f 2 -d \;)<br />
TMTDIFIN=$(echo "$TMTDIFIN + $MTDIFIN" | bc)<br />
MTDIFOUT=$(cat $WRKDIR/$YR/$MNTH/$MTD/ttl.iface | grep $IF | cut -f 3 -d \;)<br />
TMTDIFOUT=$(echo "$TMTDIFOUT + $MTDIFOUT" | bc)<br />
MTDIF=$(cat $WRKDIR/$YR/$MNTH/$MTD/ttl.iface | grep $IF | cut -f 4 -d \;)<br />
TMTDIF=$(echo "$TMTDIF + $MTDIF" | bc)<br />
echo "$TMTDIFIN;$TMTDIFOUT;$TMTDIF" > $CURWRKDIR/mtd.$IF<br />
done<br />
for NUM in $(seq $NETNUM); do<br />
LAN=$(eval echo \$LAN$NUM)<br />
MTDLANIN=$(cat $WRKDIR/$YR/$MNTH/$MTD/ttl.lan | grep $LAN | cut -f 2 -d \;)<br />
TMTDLANIN=$(echo "$TMTDLANIN + $MTDLANIN" | bc)<br />
MTDLANOUT=$(cat $WRKDIR/$YR/$MNTH/$MTD/ttl.lan | grep $LAN | cut -f 3 -d \;)<br />
TMTDLANOUT=$(echo "$TMTDLANOUT + $MTDLANOUT" | bc)<br />
MTDLAN=$(cat $WRKDIR/$YR/$MNTH/$MTD/ttl.lan | grep $LAN | cut -f 4 -d \;)<br />
TMTDLAN=$(echo "$TMTDLAN + $MTDLAN" | bc)<br />
echo "$TMTDLANIN;$TMTDLANOUT;$TMTDLAN" > $CURWRKDIR/mtd.$LAN<br />
done<br />
done<br />
<br />
## Now that we have totals, we will make a few final calculations to put in our report.<br />
## The lan parts of the report will be calculated and reported on the fly so they can be in loops<br />
## First thing; Percentage of allowable bandwidth consumed this month<br />
<br />
ABITS=$(( $USAGE * $DIV * $DIV * $DIV ))<br />
UBITS=$(cat $CURWRKDIR/mtd.$WAN | cut -f 6 -d \;)<br />
PBITS=$(echo "scale=2; $UBITS * 100 / $ABITS" | bc)<br />
<br />
## Convert daily WAN stats to MB:<br />
<br />
IWANRAW=$(cat $CURWRKDIR/ttl.iface | grep $WAN | cut -f 2 -d \;)<br />
IWANRAWMB=$(echo "$IWANRAW / $DIV / $DIV" | bc)<br />
OWANRAW=$(cat $CURWRKDIR/ttl.iface | grep $WAN | cut -f 3 -d \;)<br />
OWANRAWMB=$(echo "$OWANRAW / $DIV / $DIV" | bc)<br />
TWANRAW=$(cat $CURWRKDIR/ttl.iface | grep $WAN | cut -f 4 -d \;)<br />
TWANRAWMB=$(echo "$TWANRAW / $DIV / $DIV" | bc)<br />
WANIPT=$(cat $CURWRKDIR/ttl.wan)<br />
WANIPTMB=$(echo "$WANIPT / $DIV / $DIV" | bc)<br />
<br />
## Convert mtd WAN stats to MB<br />
<br />
IMTDWANRAW=$(cat $CURWRKDIR/mtd.$WAN | cut -f 4 -d \;)<br />
IMTDWANRAWMB=$(echo "$IMTDWANRAW / $DIV / $DIV" | bc)<br />
OMTDWANRAW=$(cat $CURWRKDIR/mtd.$WAN | cut -f 5 -d \;)<br />
OMTDWANRAWMB=$(echo "$OMTDWANRAW / $DIV / $DIV" | bc)<br />
TMTDWANRAW=$(cat $CURWRKDIR/mtd.$WAN | cut -f 6 -d \;)<br />
TMTDWANRAWMB=$(echo "$TMTDWANRAW / $DIV / $DIV" | bc)<br />
MTDWANIPT=$(cat $CURWRKDIR/mtd.$WAN | cut -f 2 -d \;)<br />
MTDWANIPTMB=$(echo "$MTDWANIPT / $DIV / $DIV" | bc)<br />
<br />
## Let's start the report by generating a header and appending it to today's report file:<br />
<br />
echo "========================================================================" >> $CURWRKDIR/daily.rpt<br />
echo "Bandwidth Report generated at end of this day: $YR-$MNTH-$DAY" >> $CURWRKDIR/daily.rpt<br />
echo "========================================================================" >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
echo "========================================================================" >> $CURWRKDIR/daily.rpt<br />
echo "SUMMARY" >> $CURWRKDIR/daily.rpt<br />
echo "========================================================================" >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
echo "Percentage of allowable bandwidth usage this month : $PBITS %" >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
echo "Egress/Ingress(1) external usage today in MegaBytes: $TWANRAWMB MB" >> $CURWRKDIR/daily.rpt<br />
echo "Egress/Ingress(1) external usage this Month To Date: $TMTDWANRAWMB MB" >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
for NUM in $(seq $NETNUM); do<br />
LAN=$(eval echo \$LAN$NUM)<br />
NNM=$(eval echo \$NNM$NUM)<br />
LANIPT=$(cat $CURWRKDIR/ttl.lan | grep $LAN | cut -f 4 -d \;)<br />
LANIPTMB=$(echo "$LANIPT / $DIV / $DIV" | bc)<br />
MTDLANIPT=$(cat $CURWRKDIR/mtd.$LAN | cut -f 3 -d \;)<br />
MTDLANIPTMB=$(echo "$MTDLANIPT / $DIV / $DIV" | bc)<br />
echo "Accounted(2) $NNM usage today in MegaBytes: $LANIPTMB MB" >> $CURWRKDIR/daily.rpt<br />
echo "Accounted(2) $NNM usage this Month To Date: $MTDLANIPTMB MB" >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
done<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
echo "========================================================================" >> $CURWRKDIR/daily.rpt<br />
echo "External Network - Upload/Download(3) Detailed Report" >> $CURWRKDIR/daily.rpt<br />
echo "========================================================================" >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" "Detail" "DOWN" "UP" "TOTAL" >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" "Egress/Ingress(1) Today (MB): " "$IWANRAWMB" "$OWANRAWMB" "$TWANRAWMB" >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" " In Bytes: " $IWANRAW $OWANRAW $TWANRAW >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" "Egress/Ingress(1) This Month: " "$IMTDWANRAWMB" "$OMTDWANRAWMB" "$TMTDWANRAWMB" >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" " In Bytes: " $IMTDWANRAW $OMTDWANRAW $TMTDWANRAW >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s\n" "Detail(4)" "BYTES:" "MEGABYTES:" >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s\n" "Accounted(2) Today: " $WANIPT $WANIPTMB >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s\n" "Accounted(2) This Month: " $MTDWANIPT $MTDWANIPTMB >> $CURWRKDIR/daily.rpt<br />
<br />
## set up a loop so each network segment can be reported:<br />
<br />
for NUM in $(seq $NETNUM); do<br />
LAN=$(eval echo \$LAN$NUM)<br />
IF=$(eval echo \$IF$NUM)<br />
NNM=$(eval echo \$NNM$NUM)<br />
<br />
## This pile of variables will grab the numbers from the data for each network<br />
<br />
ILANRAW=$(cat $CURWRKDIR/ttl.iface | grep $IF | cut -f 2 -d \;)<br />
ILANRAWMB=$(echo "$ILANRAW / $DIV / $DIV" | bc)<br />
OLANRAW=$(cat $CURWRKDIR/ttl.iface | grep $IF | cut -f 3 -d \;)<br />
OLANRAWMB=$(echo "$OLANRAW / $DIV / $DIV" | bc)<br />
TLANRAW=$(cat $CURWRKDIR/ttl.iface | grep $IF | cut -f 4 -d \;)<br />
TLANRAWMB=$(echo "$TLANRAW / $DIV / $DIV" | bc)<br />
ILANIPT=$(cat $CURWRKDIR/ttl.lan | grep $LAN | cut -f 2 -d \;)<br />
ILANIPTMB=$(echo "$ILANIPT / $DIV / $DIV" | bc)<br />
OLANIPT=$(cat $CURWRKDIR/ttl.lan | grep $LAN | cut -f 3 -d \;)<br />
OLANIPTMB=$(echo "$OLANIPT / $DIV / $DIV" | bc)<br />
TLANIPT=$(cat $CURWRKDIR/ttl.lan | grep $LAN | cut -f 4 -d \;)<br />
TLANIPTMB=$(echo "$TLANIPT / $DIV / $DIV" | bc)<br />
IMTDLANRAW=$(cat $CURWRKDIR/mtd.$IF | cut -f 1 -d \;)<br />
IMTDLANRAWMB=$(echo "$IMTDLANRAW / $DIV / $DIV" | bc)<br />
OMTDLANRAW=$(cat $CURWRKDIR/mtd.$IF | cut -f 2 -d \;)<br />
OMTDLANRAWMB=$(echo "$OMTDLANRAW / $DIV / $DIV" | bc)<br />
TMTDLANRAW=$(cat $CURWRKDIR/mtd.$IF | cut -f 3 -d \;)<br />
TMTDLANRAWMB=$(echo "$TMTDLANRAW / $DIV / $DIV" | bc)<br />
IMTDLANIPT=$(cat $CURWRKDIR/mtd.$LAN | cut -f 1 -d \;)<br />
IMTDLANIPTMB=$(echo "$IMTDLANIPT / $DIV / $DIV" | bc)<br />
OMTDLANIPT=$(cat $CURWRKDIR/mtd.$LAN | cut -f 2 -d \;)<br />
OMTDLANIPTMB=$(echo "$OMTDLANIPT / $DIV / $DIV" | bc)<br />
TMTDLANIPT=$(cat $CURWRKDIR/mtd.$LAN | cut -f 3 -d \;)<br />
TMTDLANIPTMB=$(echo "$TMTDLANIPT / $DIV / $DIV" | bc)<br />
<br />
## And now we can present that in a nice little table for each network<br />
<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
echo "========================================================================" >> $CURWRKDIR/daily.rpt<br />
echo "$NNM Network - Upload/Download(3) Detailed Report" >> $CURWRKDIR/daily.rpt<br />
echo "========================================================================" >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" "Detail" "DOWN" "UP" "TOTAL" >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" "Egress/Ingress(1) Today (MB): " $OLANRAWMB $ILANRAWMB $TLANRAWMB >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" " In Bytes: " $OLANRAW $ILANRAW $TLANRAW >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" "Egress/Ingress(1) This Month: " $OMTDLANRAWMB $IMTDLANRAWMB $TMTDLANRAWMB >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" " In Bytes: " $OMTDLANRAW $IMTDLANRAW $TMTDLANRAW >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" "Accounted(2) Today (MB): " $OLANIPTMB $ILANIPTMB $TLANIPTMB >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" " In Bytes: " $OLANIPT $ILANIPT $TLANIPT >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" "Accounted(2) This Month: " $OMTDLANIPTMB $IMTDLANIPTMB $TMTDLANIPTMB >> $CURWRKDIR/daily.rpt<br />
printf "%-33s %-16s %-16s %-20s\n" " In Bytes: " $OMTDLANIPT $IMTDLANIPT $TMTDLANIPT >> $CURWRKDIR/daily.rpt <br />
echo "" >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
<br />
## Now we have to chop up the rpt.* files and present them in the report.<br />
<br />
printf "%-20s %-20s %-10s %-10s %-15s\n" "Host:" "IP:" "DOWN:" "UP:" "TOTAL:" >> $CURWRKDIR/daily.rpt<br />
# echo "Host: IP: DOWN: UP: TOTAL:" >> $CURWRKDIR/daily.rpt<br />
while read RPT; do<br />
IP=$(echo $RPT | cut -f 1 -d \;)<br />
IPIN=$(echo $RPT | cut -f 2 -d \;)<br />
IPINMB=$(echo "$IPIN / $DIV / $DIV" | bc)<br />
IPOUT=$(echo $RPT | cut -f 3 -d \;)<br />
IPOUTMB=$(echo "$IPOUT / $DIV / $DIV" | bc)<br />
IPTOT=$(echo $RPT | cut -f 4 -d \;)<br />
IPTOTMB=$(echo "$IPTOT / $DIV / $DIV" | bc)<br />
<br />
## Try some hostname detection<br />
<br />
if [[ $IPTOTMB != "0" ]]; then<br />
HST=$($DONBT -s \! $IP | cut -f 2 -d \!)<br />
if [[ $HST == "" ]]; then<br />
HST="Not Available"<br />
fi<br />
# echo "$HST $IP $IPOUTMB $IPINMB $IPTOTMB" >> $CURWRKDIR/daily.rpt<br />
printf "%-20s %-20s %-10s %-10s %-15s\n" "$HST" $IP "$IPOUTMB MB" "$IPINMB MB" "$IPTOTMB MB" >> $CURWRKDIR/daily.rpt<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
fi<br />
done < $CURWRKDIR/rpt.$NNM<br />
done<br />
echo "" >> $CURWRKDIR/daily.rpt<br />
echo "========================================================================" >> $CURWRKDIR/daily.rpt<br />
echo "Foot Notes" >> $CURWRKDIR/daily.rpt<br />
echo "========================================================================" >> $CURWRKDIR/daily.rpt<br />
echo "(1) Egress is outgoing, Ingress is incoming" >> $CURWRKDIR/daily.rpt<br />
echo " This is a measure of bits passed between the firewall and the cable" >> $CURWRKDIR/daily.rpt<br />
echo " This number should match your ISP count" >> $CURWRKDIR/daily.rpt<br />
echo "(2) Accounted traffic passes into or out of the firewall packet filter, and is" >> $CURWRKDIR/daily.rpt<br />
echo " expected to always be a little bit less than Egress/Ingress. Unlike" >> $CURWRKDIR/daily.rpt<br />
echo " Egress and Ingress, this traffic can be filtered and therefor used to" >> $CURWRKDIR/daily.rpt<br />
echo " track usage by individuals on the LANs" >> $CURWRKDIR/daily.rpt<br />
echo "(3) Upload/Download for this report relate the end user and are not from" >> $CURWRKDIR/daily.rpt<br />
echo " the point of view of the firewall. In other words, Upload from the" >> $CURWRKDIR/daily.rpt<br />
echo " firewall to a LAN user will be reported as Download" >> $CURWRKDIR/daily.rpt<br />
echo "(4) Accounted traffic on the external port does not differentiate direction." >> $CURWRKDIR/daily.rpt<br />
echo " Any packet from any IP address will be counted on the external port" >> $CURWRKDIR/daily.rpt<br />
<br />
## At last, all we have gathered data all day, generated some interesting information, and created a report. <br />
## No good leaving the report on the server, though, let's mail it to someone, just for fun...<br />
<br />
env MAILRC=/dev/null from=$MLFRM mailx -n -s "Daily Bandwidth Report - $PBITS% Used this Month" $ADMINML < $CURWRKDIR/daily.rpt<br />
<br />
## This closes the if statement that determines if the daily totals should be calculated. DO NOT DELETE THIS LINE:<br />
<br />
fi<br />
</pre></div>
Bob