#!/bin/sh
# Автоматическое переподключение GPRS в случае обрыва
# Последняя версия скрипта доступна по ссылке из VCS

MaxRetryNumber=8	# Максимальное число переподключений подряд (5-10-нормально)
RingTime=15 # Время(сек), необходимое для дозвона до провайдера

PingDeadLine=20 # Время ожидания пакета при пинге сервера
PingInterval=40 # Интервал между посылкой пакетов при пинге сервера
PingCount=1		# Число пакетов, кт. требуется посылать при пинге
USER=`whoami`

# расположение скрипта для wvdial
wvscript="$1"
if [[ "$wvscript" == "" ]]; then
    wvscript=/home/$USER/etc/megafon1;
fi
if [ ! -e "$wvscript" ]; then
    echo "Не найден файл $wvscript с правилами дозвона !"
    exit 1
fi

modem=/home/$USER/.mobile_modem

NumberOfServers=4		# Число серверов, которые будем пинговать
ping_server[1]=83.149.19.126	# Megafon DNS server 1
ping_server[2]=83.149.22.14	# Megafon DNS server 2
ping_server[3]=ya.ru
ping_server[4]=beeline.ru

let retryNumber=$MaxRetryNumber		# В пассивном режиме сбрасывается ограничение на частоту переподключений

# Функция создаёт новый процесс связи wvdial, если таковых в системе не обнаружено
function RedialIfNoWvdial {
    let nOfWvdialProcs=`ps aux|grep wvdial|wc -l`	# определяем - есть ли подключения (0-нет/1-есть одно)

    while [[ "$nOfWvdialProcs" == "0" && $retryNumber > 0  ]]; do	# пока соединения нет и не достигнуто макс. число переподключений подряд
	echo "Подключения GPRS не обнаружены. Выполняем подключение. Осталось попыток: $retryNumber"
	# Определяем номер устройства /dev/ttyUSB* и создаём ссылку на него
	rm -f $modem;sleep 0.1;ln -s `ls /dev/ttyUSB*` $modem
	(wvdial --config=$wvscript >/dev/null 2>&1)&	# создаём процесс с новым подключением
	echo "Ждём $RingTime секунд пока выполняется подключение"
	sleep $RingTime
	ps aux|grep wvdial
	let nOfWvdialProcs=`ps aux|grep wvdial|wc -l`	# проверяем - есть ли подключение заново
	let retryNumber--
    done
    if [[ "$nOfWvdialProcs" != "0" ]]; then
	echo "Соединение успешно установлено"
    else
	echo "Все попытки дозвониться до провайдера оказались тщетными !"
	echo "Возможными причинами могут быть: неисправность соединения,"
	echo "выключенный телефон, перегруженный провайдер,"
	echo "ошибка в скрипте wvdial: $wvscript"
	echo "Попробуйте исправить ошибки или подождать некоторое время,"
	echo "после чего перезапустите скрипт снова... Выходим !"
	exit 0
    fi
}

while true; do	# Выполняем пока не случилось страшного чего-нибудь

    RedialIfNoWvdial	# Выполнение соединения, если оно не установлено

    PingResult=false
    for server in `seq $NumberOfServers`; do
	echo "Пингуется ${ping_server[$server]}..."
	ping -w $PingDeadLine -i $PingInterval -c $PingCount ${ping_server[$server]} >/dev/null 2>&1
	if [[ "$?" == "0" ]]; then
	    echo "Пинг успешен, остальные серверы пинговать не будем."
	    let retryNumber=$MaxRetryNumber		# В пассивном режиме сбрасывается ограничение на частоту переподключений
	    PingResult=true;	# Один из серверов был "пропингован" => соединение есть
	    let sleep_time=($NumberOfServers-$server)*$PingDeadLine
	    sleep $sleep_time
	    break
	fi
    done

    if [[ $PingResult == false ]]; then
        echo "Пинг не дошёл ни до одного из серверов, выполняем переподключение"
        echo "Разрываем все соединения pppd и wvdial"
#        killall pppd >/dev/null 2>&1
        killall wvdial >/dev/null 2>&1
#        killall -9 -r pppd >/dev/null 2>&1
#        killall -9 -r wvdial >/dev/null 2>&1
        sleep 1
    fi

done

exit 0	# По идее, здесь интерпретатор оказаться не должен