Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  Шелезяки
  Мелочи
  Русификация
  COM-порт
  Монтирование образов
  dd
  burncd
  Консоль
  polling
  redirect_port
  wolf3d
  W.O.L.
  HDD->HDD
  bsdstats
  pdf в html
  monitord
  monit
  dvd в avi
  LAM
  Контроль провайдера
  pppd
  ru man
  geom_uzip
  colorize
  nettop
  немного о ssh
  установка по сети
  ClamAV mirror
  BlueTooth
  WiFi WPA
  iftop
  iPod
  2 CD -> 1 DVD
  ipcalc
  LACP и VLAN
  FFS из-под WinXP
  queues
  NFS & Win2k3
  Dynamic DNS
  ProFTPD+iconv
  deltup, xdelta, bdelta
  Приглашение csh/tcsh
  настрока bash
  Lan over Bluetooth
  pppoe
  метаданные exif
  dd : бэкапируем windows
  mozilla autoconfig
  Proxy Auto Configuration
  NNTP сервер
  Rinetd
  ISO DVD FreeBSD
  my disc1
  sftp+chroot
  SendXMPP
  APCUPSD
  Видеонаблюдение
  Настройка аудиоплеера на ximp3
  HDD(mbr) -> HDD(gpt)
  mc 4.6.2
  Динамический DNS
  axel
  LiveCD
  NAS на MPD
  backup конфигов на почту
  Файловая система
  WWW
  Security
  system
  Games Servers
  X11
  Programming
Очумелые Ручки
OpenBSD
Cisco


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 закрыта.


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту

Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis

Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 6 чел.
За последние 30 мин было: 24 человек
За сегодня было
42 показов,
9 уникальных IP
 

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

© lissyara 2006-10-24 08:47 MSK

Зарядка для аккумулятора 12В в Санкт-Петербурге

Время генерации страницы 0.0598 секунд
Из них PHP: 23%; SQL: 77%; Число SQL-запросов: 77 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 132664