dev/bash/gprs/3Greconnect.sh

92 lines
4.8 KiB
Bash
Raw Normal View History

2011-04-09 19:06:44 +04:00
#!/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 # По идее, здесь интерпретатор оказаться не должен