Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Мелочи —> Контроль провайдера

Восстановление подключения и запись информации о отсутствуюющем интернете

Автор: BAV_Lug.


      Очень часто (особенно на Украине у Укртелекома), когда у Вас подключение к интернету с регистрацией например PPPoE, инет пропадает и помогает только перерегистрация (зачастую не сразу). Но как узнать (автоматом), что инета нет, и затем поднять подключение? Ниже приведенный скрипт, надеюсь, Вам в этом поможет.

Предпологается, что файлы скрипта лежат в папке /usr/local/etc/myscript, а лог будет в папке /var/log.
Если это не так, то я думаю, Вы без проблем поправите нужные строчки в скрипте.

Создаем файл testinet.sh

#!/bin/sh

# Флаг пропадания инета
nr=""
# Флаг появления инета
ni=""

while !(test $ni)
 do
   is=`/sbin/ping -c 3 IP-адрес (например DNS прова) | grep -c "64 bytes"`
   # Проверяем прошли ли пинги
   if !(test $is -gt "0")
    then
        # Прибиваем тунели
        /usr/bin/killall ppp
        
        if !(test $nr)
	 then
             # Если инет пропал только что, то запоминаем время
	     nr=1
	     timeobr=`date`
	fi     
        # Ждем пока помрут тунели (этот параметр индивидуален и
        # подбирается экспериментальным путем)
	sleep 5
        
        # Поднимаем соединение
        # Например у меня так
	/usr/sbin/ppp -ddial inet
        
        # На всякий случай еще немного подождем
        # (хотя в принципе этого можно и не делать)
        sleep 5
    else
        if (test $nr)
	 then
	     echo Инета не было с $timeobr до `date` >> /var/log/internet.log
	 fi
	ni=1
   fi
done

Теперь создаем файл startinet.sh

#!/bin/sh

# Проверяем наличие скрипта testinet.sh в памяти
testz=`ps ax | grep -c testinet.sh`
if (test $testz -gt "1")
 then
     # Если уже есть, то выходим   
     exit 1
fi

/usr/local/etc/myscript/testinet.sh

Делаем эти файлы выполняемыми и добавляем в крон запуск startinet.sh, например каждую минуту.
Вот вроде и все. В конце месяца можем предъявить файл internet.log провайдеру.


Нашел более правильный способ.
В параметрах подключения в файле ppp.conf добавляем


# Включаем Link Quality Request.
# Каждый N секунд вам посылаеться сигнал от сервера
# и если сервер не получает ответа, то соединение разрываеться.
enable lqr 
set lqrperiod 5 #Ставим N=5 для предыущей строки. 

Теперрь можно без всяких скриптов обойтись.



размещено: 2006-11-14,
последнее обновление: 2007-03-15,
автор: BAV_Lug


proxy-man, 2006-11-15 в 13:56:53

Молодцом камрад!!! Остро-насущная тема однако... :-)

Vlad11, 2006-11-16 в 0:15:47

У меня тоже подключение через PPPoE, но у меня скрипт автоматом подумыется при дисконнекте.

ckpom, 2006-11-19 в 8:54:04

пасиб, как раз думал... а сач и думать не надо стало )))

warden, 2006-11-22 в 15:37:05

Спасибо за статью, весьма актуальна!
В startinet.sh последняя строка:
/usr/local/etc/myscript/TESTINET.SH ???
TESTINET.SH откуда взялось?

BAV_Lug, 2006-11-23 в 11:58:51

Ошибка, поправил.

info, 2006-11-30 в 9:19:42

Хуже нет определять связь по пингам, необходимо определять по наличию устроства в системе, при такой проверке связь может прыгать каждую минуту -)

BAV_Lug, 2006-11-30 в 12:08:18

В том то и дело, что устройство есть, а связи нет :(
А прыгать не будет. Если у вас из трех пингов к ДНС прова не прошел не один, то только тогда мы считаем, что связи нет (кстати их количество легко можно увеличить, но вот зачем?)

Аноним, 2007-01-03 в 16:21:14

Только такие методы плодят у Укртелекома "нулевые коннекты"
А они за такие вещи даунят порт и просят искать другие методы восстановления соединения после падения линка.
Модем настореный РОУТЕРОм спасает от таких неприятных казусов ))

Lemegeton, 2007-01-11 в 17:05:38

>> # Ждем пока помрут тунели (этот параметр индивидуален и
>> # подбирается экспериментальным путем)
>> sleep 5
Хм, ненадежно - процессы имеют свойство со временем завершаться все дольше и дольше... ;)  Можно взглянуть на FreeBSD'шный rc.subr скрипт и "выцепить" оттуда пару функций по остановке процессов (wait_for_pids(), _find_processes() etc...), или просто подключть /etc/rc.subr, для FreeBSD'шников, которые помогут дожидаться завершения процессов, а не подгонять время их завершения вручную.

Весельчак У., 2007-03-16 в 16:41:32

А mpd если попользовать? :-)

proxy-man, 2007-05-14 в 19:15:18

to BAV_Lug - в связи с тем, что появились дополнения к этой статье, касающиеся работы ppp, интересует полный конфиг ppp.conf при условии использования данных опций:
enable lqr # Включаем Link Quality Request. Каждый N секунд вам посылаеться сигнал от сервера
          # и если сервер не получает ответа, то соединение разрываеться.
set lqrperiod 5 #Ставим N=5 для предыущей строки.

dvg_lab, 2007-07-28 в 22:17:31

c mpd вообще ничего изобретать не надо, и протоколы оно все умеет и умное само по себе. Выдираешь кабель из сетевухи - все падает, втыкаешь обратно и секунд через 10 все работает - красота :-) mpd рулит.

from siveria, 2007-11-12 в 11:06:11

ето токо на украине могут быть такие проблемы? :)

mdv, 2008-03-26 в 14:14:46

конструкцию
===
  is=`/sbin/ping -c 3 IP-адрес (например DNS прова) | grep -c "64 bytes"`
  # Проверяем прошли ли пинги
  if !(test $is -gt "0")
===
заменить на
===
if (ping -qnc3 $IP 2>&1 >/dev/null)
===
меньше кода и аккуратнее.
+ не надо городить конвеера ping + grep, а вдруг пакеты не по 64 байта захочется? придется менять не только ключики у пинга, а еще и паттерн у грепа ;)
+ не надо вызывать test
+ меньше переменных. особенно если $IP захардкодить. ;)

аналогично с
===
testz=`ps ax | grep -c testinet.sh`
if (test $testz -gt "1")
===
на
===
if (ps ax | grep -q [t]estinet.sh)
===
если греп найдет чего - вернет ноль
квадратные скобки отучат греп матчить самого себя, типа:
===
$ ps ax | grep testinet.sh
13962  p0  S+     0:00.00 grep testinet.sh
===
в то время как ps ax | grep [t]estinet.sh не находит ничего ;)

mdv, 2008-03-26 в 14:21:35

до кучи.... в таких скритах правильнее pid-файл делать
типа в начале
if (test -f /tmp/testinet.pid)
then
if !(ps -p `cat /tmp/testinet.pid` 2>&1 >/dev/null)
then
 echo $$ > /tmp/testinet.pid
else
 exit 1
fi
else
echo $$ > /tmp/testinet.pid
fi

дур_прогер, 2008-09-23 в 14:44:20

кто ж так пишет скрипты и вообще проги? прямо в коде нечто "IP-адрес (например DNS прова)"

делай так: заведи переменную и прокоментарь ее как "IP-адрес (например DNS прова)", в переменной укажи как надо указывать адрес: ip или имя.



mad, 2008-11-07 в 0:08:00

в семерки такая комбинация проверки подключения
enable lqr echo
set reconnect 3 5
set redial 3 10
set lqrperiod 45

poison, 2008-12-02 в 15:05:44

/etc/crontab

*/5     *       *       *       *       root    /usr/local/etc/inet_detect/dns.sh > /dev/null 2>&1
59      23      *       *       *       root    /usr/local/etc/inet_detect/logsrotate.sh > /dev/null 2>&1

/usr/local/etc/inet_detect/
-rwxr-xr-x   1 root  1001     656B  2 дек 14:43 dns-detect.sh
-rwxr-xr-x   1 root  1001     197B  2 дек 14:44 dns.sh
-rwxr-xr-x   1 root  poison   1,6K  2 дек 11:57 log2html.sh
---x--x--x   1 root  poison   1,0K  2 дек 11:58 logsrotate.sh

#cat dns.sh
#!/bin/sh
#
# Проверяем наличие скрипта в памяти
dnsd="/usr/local/etc/inet_detect/dns-detect.sh"

if (ps ax | grep [d]ns-detect.sh)
   then
       exit 1 # Если уже есть, то выходим
   else ${dnsd}
fi

#cat dns-detect.sh
#!/bin/sh
#
log="/var/log/inet_detect/dns-detect.html"
nr=""   # Флаг пропадания инета
ni=""   # Флаг появления инета
ip="YOUR_DNS_IP"
#
while !(test $ni)
do
 pings=`/sbin/ping -c 4 ${ip} | grep -c "[i]cmp"` > /dev/null 2>&1
  if !(test $pings -gt "0" ) > /dev/null 2>&1 # Проверяем прошли ли пинги
   then
       if !(test $nr) > /dev/null 2>&1
        then   # Если инета нет, то запоминаем время
            nr=1
            timefix=`date`
       fi
   else
       if (test $nr) > /dev/null 2>&1
         then
            echo "<TR bgcolor="DAE0E7"><TD \
align=center width=800><CODE style=font-size:12px> \
DNS не отвечал с $timefix до `date`</CODE></TD>" >> \
${log}
        fi
       ni=1
  fi
done

#cat log2html.sh
#!/bin/sh
#
newfile="/usr/bin/touch"
say="/bin/echo"
#
dnstags='
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html;charset=koi8-r">
</HEAD>
<BODY style="margin: 0 0 0 0; padding: 0 0 0 0; BACKGROUND-COLOR: #f1f1f1; BORDE                                                R-RIGHT: #999999 1px solid; MARGIN: 0px; BORDER- LEFT: #999999 1px solid; ">
<CENTER>
<TABLE width="800" border="0" cellpadding="0" cellspacing="0">
   <TBODY>
       <TR><TD width="800" bgcolor="#707680">
       <TABLE border="0" width="800" cellspacing="1" cellpadding="3">
       <TBODY>
           <TR bgcolor="#B9CCDF">
               <TD align="center" colspan="6">
                   <CODE><b>Статистика отсутствия связи с DNS</b></CODE>
               </TD></TR>
           <TR bgcolor="#f1f1f1"><TD align="center" colspan="6">
           <CODE>&nbsp;</CODE></TD></TR>'
#
dnslog="/var/log/inet_detect/dns-detect.html"
#
${newfile} ${dnslog}
${say} ${dnstags} >> ${dnslog}

#cat logsrotate.sh
#!/bin/sh
#
# Set variables
#date="/bin/date"
copy="/bin/cp"
makedir="/bin/mkdir"
send="/usr/bin/mail"
del="/bin/rm"
say="/bin/echo"
worldlog="/var/log/inet_detect/world-detect.html"
dnslog="/var/log/inet_detect/dns-detect.html"
log2html="/usr/local/etc/inet_detect/log2html.sh"
webdir="/usr/local/www/apache22/https/pings"
lastday=`date -v1d -v+1m -v-1d "+%d"`
currday=`date "+%d"`
dirname=`date "+%Y%m"`
closetags='</TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR></BODY></HTML>'
#
# Program begin
if [ ${lastday} -eq ${currday} ] > /dev/null 2>&1
   then
       ${say} ${closetags} >> ${worldlog}
       ${say} ${closetags} >> ${dnslog}
       ${send} -s "Internet ping failures." root@rjhost.ru < ${worldlog}
       ${send} -s "DNS ping failures." root@rjhost.ru < ${dnslog}
       cd ${webdir}
       ${makedir} ${dirname}
       ${copy} ${worldlog} ${webdir}/${dirname}/
       ${copy} ${dnslog} ${webdir}/${dirname}/
       ${del} ${worldlog}
       ${del} ${dnslog}
       ${log2html}
   else
       #    echo -n "Сегодня не последний день месяца"
       #    echo "."
fi

poison, 2008-12-02 в 15:10:42

Комменты:
данная конструкция в последний день месяца отправляет админу логи и копирует их в папку доступную по http,
после чего трет и создает новые.

ufs, 2009-04-12 в 16:01:03

mad, 2008-11-07 в 0:08:00
>в семерки такая комбинация проверки подключения
>enable lqr echo
>set reconnect 3 5
>set redial 3 10
>set lqrperiod 45

У меня это и в 6.2 было...

Xan, 2010-01-21 в 15:55:43

 # (хотя в принципе этого можно и не делать)
       sleep 5
   else
зачем после sleep идёт else ?
это при том, что выше указано fi то есть, что конструкция if then else закрыта.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0383 секунд
Из них PHP: 27%; SQL: 73%; Число SQL-запросов: 77 шт.
Исходный размер: 35676; Сжатая: 9061