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