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