#!/bin/bash

declare interface="ippp0"
declare -i length=${#interface}
let "length += 1" # perche' dovro' togliere la lunghezza tipo eth0: e mi serve la lunghezza + 1
declare -i bw_bod=6000 # banda necessaria per alzare il 2. canale

# variabili globali
declare -i ret=0
declare position="/proc/net/dev"

declare -i bw_actual=0
declare -i bw_old=0
declare -i count_down=0 # contatore per sganciare il canale
declare -i count_up=0 # contatore per agganciare il canale
declare -i max_switch=5 # valore da arrivare per aggancio
declare -i min_switch=5 # valore da arrivare per sgancio
declare bod_up="false"
declare bod_down="false"

function check_bw() {
	tmp=$( grep $interface $position ) # prendo la riga dedicata alla $interface da $position
	IFS_OLD="$IFS" # salvo la var IFS
	IFS=" " # imposto il giusto IFS per l'array
	ris=( $tmp ) # splitto la stringa in un array con ' ' come divisore
	
	if [ "${#ris}" -eq "$length" ]; then # vedo se i dati sono sulla stessa riga oppure no
		ret=${ris[1]} # dati sulla riga successiva
	else
		tmp=${interface}":"
		ret=${ris[0]##${tmp}} # stessa riga, rimuovo la parte non utile
	fi

	#echo "Risultato : "$ret
	IFS=$IFS_OLD # ripristino la var IFS
}

while [ "1" ]
do
	check_bw # setta la var $ret con il traffico in byte dell'interfaccia $interface
	
	# ora inizia la serie di condizioni per alzare/abbassare il 2. canale ISDN
	
	let "ris=ret - bw_old"
	
	if [[ "$ris" -gt "$bw_bod" ]]; then # sto consumando molta banda, oltre bw_bod
		let "count_up += 1"
		count_down=0
	else
		let "count_down += 1"
		count_up=0
	fi # devono essere consecutivi !! altrimenti non ha senso...
	
	if [[ "$count_up" -ge "$max_switch" ]]; then
		#devo attivare il 2. canale !
		count_up=$max_switch # fixxo il valore sempre a max_switch cosi non cresce all'infinito
		if [[ "$bod_up" == "false" ]]; then
			isdnctrl addlink $interface
			#echo "secondo canale agganciato !"
			count_down=0 # faccio ripartire da 0
			bod_up="true"
		fi
	fi
	
	if [[ "$count_down" -ge "$min_switch" ]]; then
		#devo sganciare il 2. canale !
		count_down=$min_switch # fixxo il valore sempre a min_switch cosi non cresce all'infinito
		if [[ "$bod_up" == "true" ]]; then
			isdnctrl removelink $interface
			#echo "secondo canale sganciato..."
			count_up=0 # faccio ripartire da 0
			bod_up="false"
		fi
	fi
	
	bw_old=$ret
	
	sleep 1 # faccio tutti i controlli ogni secondo
done

exit 0
