#!/bin/sh # Автоматическое переподключение GPRS в случае обрыва #killall reconnect.sh MaxRetryNumber=50000 # Максимальное число переподключений подряд (5-10-нормально) RingTime=15 # Время(сек), необходимое для дозвона до провайдера PingDeadLine=20 # Время ожидания пакета при пинге сервера PingInterval=40 # Интервал между посылкой пакетов при пинге сервера PingCount=1 # Число пакетов, кт. требуется посылать при пинге # расположение скрипта для wvdial wvscript="$1" if [[ "$wvscript" == "" ]]; then wvscript=/home/kolan/etc/megafon1; fi if [ ! -e "$wvscript" ]; then echo "Не найден файл $wvscript с правилами дозвона !" exit 1 fi modem=/home/kolan/.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 # По идее, здесь интерпретатор оказаться не должен