#!/usr/local/bin/bash
##################################################################
# works on default OpenBSD installation with ipcad and httpd
# /usr/local/sbin/traffic.sh
# please update $traf_net_range
# CRONTAB:
# * * * * * rsh localhost dump /var/log/ipcad/ipcad-`date +%m`.dump &> /dev/null
# 0 0 1 * * rsh localhost dump /var/log/ipcad/ipcad-`date +%m`.dump && rsh localhost clear ip accounting &> /dev/null
# 59 23 * * * bash /usr/local/sbin/traffic.sh &> /dev/null
#
##################################################################

PATH=$PATH:$HOME/bin:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin
LANG=C
function cleanup () {
    if [ -n "$tmpdir" -a -d "$tmpdir" ]; then
	rm -rf "$tmpdir"
    fi
}

trap 'cleanup' EXIT
trap 'exit 4' SIGTERM

traf_full_date=`date`
traf_this_month=`date +%m`
traf_this_day=`date +%d`
traf_this_year=`date +%Y`
traf_cmddir=`dirname $0`
traf_cmdname=`basename $0`
traf_tmpdir=`mktemp -d /tmp/$cmdname.XXXXXX`
traf_net_range=10.0
traf_log_file="/var/log/ipcad/ipcad-${traf_this_month}.dump"
traf_tmp_file="$traf_tmpdir/traf_tmp_file"
traf_output_folder="/var/www/htdocs/traffic"
traf_output_file="${traf_output_folder}/${traf_net_range}_net_${traf_this_month}_${traf_this_year}.html"
traf_dhcpd_conf="/etc/dhcpd.conf"

#dump current stats
echo "updating current stats to $traf_log_file ..."
rsh localhost dump $traf_log_file &> /dev/null 

traf_total_internet_to_localnet=`grep -E "^ .+ $traf_net_range" $traf_log_file |awk '{s+=$4} END {print((s/1024)/1024)}'`
traf_total_localnet_to_internet=`grep -E "^ $traf_net_range" $traf_log_file |awk '{s+=$4} END {print((s/1024)/1024)}'`

if [ -d "$traf_output_folder" ] 
then
	echo "destination folder: $traf_output_folder"
else
mkdir -p $traf_output_folder 
fi
#cleanup old stats
cat /dev/null > $traf_output_file

echo "parsing stats to $traf_output_file ..."
cat > $traf_output_file <<EOF
<h1>Traffic report for ${traf_net_range} network $traf_this_month/$traf_this_year</h1>
<p>Generated: $traf_full_date </p>
<table width="600" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td bgcolor="green">&nbsp;</td>	
    <td bgcolor="green"><font color="white">IP ( Name / HW address ):</font></td>
    <td bgcolor="green">&nbsp;</td>
    <td bgcolor="green"><font color="white">Inbound:(Mb)</font></td>
    <td bgcolor="green">&nbsp;</td>
    <td bgcolor="green"><font color="white">Outbound:(Mb)</font></td>
    <td bgcolor="green">&nbsp;</td>
  </tr>

   <tr>
    <td bgcolor="#EEFFBE">&nbsp;</td>     
    <td bgcolor="#EEFFBE"><b>TOTAL:</b></td>
    <td bgcolor="#EEFFBE">&nbsp;</td>
    <td bgcolor="#EEFFBE"><b>$traf_total_internet_to_localnet</b></td>
    <td bgcolor="#EEFFBE">&nbsp;</td>
    <td bgcolor="#EEFFBE"><b>$traf_total_localnet_to_internet</b></td>
    <td bgcolor="#EEFFBE">&nbsp;</td>
  </tr>

EOF

traf_our_ips=`grep -E "^ $traf_net_range" $traf_log_file | awk '{print$1}' |sort -u > $traf_tmp_file && grep -E "^ .+ $traf_net_range" $traf_log_file | awk '{print$2}' |sort -u >> $traf_tmp_file | sort -u $traf_tmp_file`

cat /dev/null > $traf_tmp_file

for i in $traf_our_ips
do
traf_ip_name=`grep "$i;" $traf_dhcpd_conf |awk '{print$2}'`
traf_ip_mac=`grep "$i;" $traf_dhcpd_conf |awk '{print$6}' | awk -F";" '{print$1}'`
[ "$traf_ip_name" = "" ] && traf_ip_name=noname
[ "$traf_ip_mac" = "" ] && traf_ip_mac=nomac
traf_inbound_mb=`grep -E "^ .+ $i .+" $traf_log_file |awk '{s+=$4} END {print((s/1024)/1024)}'`
traf_outbound_mb=`grep -E "^ $i .+" $traf_log_file |awk '{s+=$4} END {print((s/1024)/1024)}'`


cat >> $traf_tmp_file <<EOF
<tr><td bgcolor="#EEFFBE">&nbsp;</td><td bgcolor="#EEFFBE"><a href="http://$i" target="_blank">$i</a> ( $traf_ip_name / $traf_ip_mac ) </td><td bgcolor="#EEFFBE">&nbsp;</td><td bgcolor="#EEFFBE"> $traf_inbound_mb </td> <td bgcolor="#EEFFBE">&nbsp;</td><td bgcolor="#EEFFBE">$traf_outbound_mb</td><td bgcolor="#EEFFBE">&nbsp;</td></tr>
EOF
done
sort -k 14rn $traf_tmp_file >> $traf_output_file
echo "</table>" >> $traf_output_file

