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

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
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 12 чел.
За последние 30 мин было: 59 человек
За сегодня было
4963 показов,
619 уникальных IP
 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.145 секунд
Из них PHP: 46%; SQL: 54%; Число SQL-запросов: 86 шт.
Исходный размер: 117478; Сжатая: 21136