#!/bin/sh

log() {
	logger -t "wrtbwlimits" "$@"
}

lock()
{
	while [ -f /tmp/wrtbwlimits.lock ]; do
		if [ ! -d /proc/$(cat /tmp/wrtbwlimits.lock) ]; then
			log "WARNING : Lockfile detected but process $(cat wrtbwlimits.lock) does not exist !"
			rm -rf /tmp/wrtbwlimits.lock
		fi
		sleep 1
	done
	echo $$ > /tmp/wrtbwlimits.lock
}

unlock()
{
	rm -rf /tmp/wrtbwlimits.lock
}

upiface() {
	lock
	OX=$(vnstat -i $1 | grep rx: )

	if [ "x$OX" != "x" ]; then
		RX=$(echo $OX | awk -F " " '{print $2}')
		RXS=$(echo $OX | awk -F " " '{print $3}')
		TX=$(echo $OX | awk -F " " '{print $5}')
		TXS=$(echo $OX | awk -F " " '{print $6}')
		TOT=$(echo $OX | awk -F " " '{print $8}')
		TOTS=$(echo $OX | awk -F " " '{print $9}')
		source /tmp/busage.var
		/etc/bwupdate $RX $RXS $TX $TXS $TOT $TOTS $1 $DOWN $UP $TOTAL
		source /tmp/busage.var
		uci set limit.bandwidth.bdown=$DOWN
		uci set limit.bandwidth.bup=$UP
		uci set limit.bandwidth.btotal=$TOTAL
		uci commit limit
	fi
	unlock
}

case ${1} in

"setup" )
	;;
	
"update" )
	BASEDOWN=$(uci get limit.bandwidth.basedown)
	BASEUP=$(uci get limit.bandwidth.baseup)
	BASETOTAL=$(uci get limit.bandwidth.basetotal)

	INTERFACE=$(uci get limit.bandwidth.interface)

	vnstat -u

	rm -rf /tmp/busage.db
	rm -rf /tmp/busage.var

	/etc/bwupdate $BASEDOWN KiB $BASEUP KiB $BASETOTAL KiB base 0 0 0

	if [ -f /var/lib/vnstat/$INTERFACE ]; then
		upiface $INTERFACE
	fi

if [ -f "/tmp/debug" ]; then
	if [ -f /var/lib/vnstat/wwan0 ]; then
		upiface wwan0
	fi
	if [ -f /var/lib/vnstat/tun0 ]; then
		upiface tun0
	fi
	if [ -f /var/lib/vnstat/3g-usb ]; then
		upiface 3g-usb
	fi
	if [ -f /var/lib/vnstat/eth1 ]; then
		upiface eth1
	fi
	if [ -f /var/lib/vnstat/eth2 ]; then
		upiface eth2
	fi
	if [ -f /var/lib/vnstat/usb0 ]; then
		upiface usb0
	fi
	if [ -f /var/lib/vnstat/eth0.2 ]; then
		upiface eth0.2
	fi
	if [ -f /var/lib/vnstat/apcli0 ]; then
		upiface apcli0
	fi
fi # end debug
	;;
"backup" )
	if [ -f /tmp/busage.var ]; then
		source /tmp/busage.var
		uci set limit.bandwidth.bdown=$DOWN
		uci set limit.bandwidth.bup=$UP
		uci set limit.bandwidth.btotal=$TOTAL
		uci commit limit
	fi
	;;
"blimit" )
	source /tmp/busage.var
	#uci set limit.bandwidth.bdown=$DOWN
	#uci set limit.bandwidth.bup=$UP
	#uci set limit.bandwidth.btotal=$TOTAL
	#uci commit limit

	USERLIMIT=$(uci -q get limit.bandwidth.blimituser)
	USERSIZE=$(uci -q get limit.bandwidth.blimitsize)

	if [ $USERLIMIT -eq 0 ]; then
		return
	fi

	if [ $USERSIZE -eq 1 ]; then
		usertotal=$((USERLIMIT))
		echo KB SELECTED $usertotal
	else
		if [ $USERSIZE -eq 2 ]; then
			usertotal=$((USERLIMIT*1000))
			echo MB SELECTED $usertotal
		else
			usertotal=$((USERLIMIT*1000000))
			echo GB SELECTED $usertotal
		fi
	fi
	if [ $TOTAL -lt 1000 ] ; then
		limit=$TOTAL
		echo "Limit(KB):" $limit "Total: " $TOTAL
	else
		if [ $TOTAL -lt 1000000 ] ; then
			limit=$((TOTAL/1000))
			echo "Limit(MB):" $limit "Total: " $TOTAL
		else
			limit=$((TOTAL/1000000))
			echo "Limit(GB):" $limit "Total: " $TOTAL
		fi
	fi

	if [ $TOTAL -ge $usertotal ]; then
		echo "Bandwidth Limit Reached: BLOCKING"
		uci set limit.bandwidth.blimitstatus="BLOCKED"
		uci commit limit
		touch /tmp/fw3.block
		fw3 -q flush
	else
		if [ -f /tmp/fw3.block ]; then
			fw3 -q reload
			rm -rf /tmp/fw3.block
		fi
		uci set limit.bandwidth.blimitstatus="UN-BLOCKED"
		uci commit limit
	fi
	;;	
"reset" )
	/etc/bcalc
	rm -rf /tmp/busage.var
	echo base,0,0,0,0,0,0 > /tmp/busage.db

	if [ -f /var/lib/vnstat/wwan0 ]; then
		rm -rf /var/lib/vnstat/wwan0
		vnstat -u -i wwan0
	fi
	if [ -f /var/lib/vnstat/3g-usb ]; then
		rm -rf /var/lib/vnstat/3g-usb
		vnstat -u -i 3g-usb
	fi
	if [ -f /var/lib/vnstat/tun0 ]; then
		rm -rf /var/lib/vnstat/tun0
		vnstat -u -i tun0
	fi

	if [ -f /var/lib/vnstat/eth1 ]; then
		rm -rf /var/lib/vnstat/eth1
		vnstat -u -i eth1
	fi
	if [ -f /var/lib/vnstat/eth2 ]; then
		rm -rf /var/lib/vnstat/eth2
		vnstat -u -i eth2
	fi
	if [ -f /var/lib/vnstat/usb0 ]; then
		rm -rf /var/lib/vnstat/usb0
		vnstat -u -i usb0
	fi
	if [ -f /var/lib/vnstat/eth0.2 ]; then
		rm -rf /var/lib/vnstat/eth0.2
		vnstat -u -i eth0.2
	fi
	if [ -f /var/lib/vnstat/apcli0 ]; then
		rm -rf /var/lib/vnstat/apcli0
		vnstat -u -i apcli0
	fi
	uci set limit.bandwidth.bdown="0"
	uci set limit.bandwidth.bup="0"
	uci set limit.bandwidth.btotal="0"
	uci set limit.bandwidth.basedown="0"
	uci set limit.bandwidth.baseup="0"
	uci set limit.bandwidth.basetotal="0"

	uci set limit.bandwidth.down="0 KB"
	uci set limit.bandwidth.up="0 KB"
	uci set limit.bandwidth.total="0 KB"
	uci set limit.bandwidth.blimitstatus="UN-BLOCKED"
	uci commit limit
	if [ -f /tmp/fw3.block ]; then
		fw3 -q reload
		rm -rf /tmp/fw3.block
	fi
	;;
"writeodl" )
	uci set limit.bandwidth.oldtot="$2 $3"
	uci commit limit
	;;
"writedl" )
	uci set limit.bandwidth.down="$2 $3"
	uci set limit.bandwidth.up="$4 $5"
	uci set limit.bandwidth.total="$6 $7"
	uci commit limit
	;;	
esac
