dev/bash/gprs/3Greconnect.sh

92 lines
4.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 # По идее, здесь интерпретатор оказаться не должен