internet :: проверка связи с внешним миром

сетуация такая:
юзаю инет по выделинке, провайдер так себе - ч\з пень колода качество связи, часто рвется vpn

хочу написать скрипт, который проверяет наличие связи с внешним миром пингуя к примеру ya.ru (213.180.204.8) c периодом в минуту, если ответа нет, то реконнект [/etc/init.d/inet restart] vpn, реализован скрипт(примитивный), сильно не пиннайте если глупо написано..

cat /etc/init.d/inet
#!/sbin/runscript
MY_GW="10.10.10.10"

start(){
    ebegin "Starting VPN"

        ebegin "   Load module ipip"
         /sbin/modprobe ipip && \
        eend $?

        ebegin "   Load module ip_gre"
         /sbin/modprobe ip_gre && \
        eend $?

        ebegin "   Up pptp to 10.10.10.10 for VPN"
         pppd call vpn
        eend $?
    eend 0
}

stop(){
ebegin "stopping VPN"
    ebegin "  stopping PPP"
     /usr/sbin/poff -a
     /sbin/modprobe ip_gre -r
     /sbin/modprobe ipip -r
     /sbin/modprobe tunnel4 -r
    eend $!
eend 0
}

желательно бы готовый вариант, наверно в 3 строчки пишется, и наверно ч\з Cron, вот только с ним я не знаком...

Лучше

Лучше настроить по-нормальному сеть (через /etc/conf.d/net) и проверять на наличие поднятого ppp0 по крону. Если нет - то /etc/init/net.ppp0 restart
_________________
Это заговор квадратикофф!!!
From Siberia with Love!

У меня такая же

У меня такая же ботва с провом.
Только как по крону-то проверить? При разрыве связи со стороны прова ppp0 не падает (т.е. связи нет, а при /etc/init.d/net.ppp0 start выдает "* WARNING: net.ppp0 has already been started.")
Сам над этой проблемой голову ломаю - пока тоже пришел к мысле о пинге (только не красиво это как-то, имхо).

а если делать

а если делать не /etc/init.d/net.ppp0 start а restart?
_________________

... в дополнение

... в дополнение к restart ... некоторые владельцы skystar2 используют следующий подход для проверки: - регулярно (cron - ежеминутно) проверяют наличие входящего трафика (ifconfig-ifconfig) в интервале нескольких секунд (например 4) - если в это время трафика нет то принудительно перегружают интерфейс (restart) ...
... можно попробовать, что нибудь похожее ...

2 sungreen: не понял

2 sungreen:
не понял что за ifconfig-ifconfig?
Но это в любом случае не подойдет - т.к. у меня нет постоянного входящего трафика.
Следовательно, если я периодически захожу на свой комп по ssh - чтоб проверить как там дела, то в перерывах между ssh сессиями у меня будет постоянно перегружаться интерфейс.
Боюсь мой пров такой натуги не вынесет и на его стороне просто порт подвиснет :))

...

...

#!/bin/sh
iface=ppp0
ONE=`ifconfig $iface | grep "RX byte" | awk '{print $2}' | tr -d [:alpha:] | tr -d [:punct:]`
sleep 4
TWO=`ifconfig $iface | grep "RX byte" | awk '{print $2}' | tr -d [:alpha:] | tr -d [:punct:]`
if [ $ONE = $TWO ]; then
рестарт интерфейса
fi

... смысл в том, что бы не ждать когда отвалится, а регулярно проверять и если трафика в 4х секундном интервале не было (никто не качает или уже отвалилось), то принудительно делать рестарт ...

а между

а между сравнениями крутить пинг, еси входящего нету, кердык соединение, граммотно и просто =)

... если даже не

... если даже не кердык, но входящего нет - то есть никто не качает (по этому рестарт никому не повредит) - рестарт! ... а если входящий есть, то не кердык полюбому ;) ...

работает =)но

работает =)
но работает тогда, когда интервейс явно поднят
хотелось бы добавить проверку того, поднят ли интервейс ppp0, если не поднят, то поднять

я б сам написал, если б язык знал... =)

ps
как добавить правило крону( опрашивать скрипт если существует /var/run/inet с интервалом 15 сек)? капался в конфигах в районе /etc/cron.* примеров ни нашел =(
и что нужно дописать в /etc/init.d/inet, чтоб при успешном старте создавался /var/run/inet с pid внутри.

... if !(ifconfig | grep

... например, if !(ifconfig | grep 'ppp0'); then поднять ppp0; fi ...
... но, ifconfig-ifconfig должен вызывать рестарт даже если интерфейс не поднят!, а задача рестарта - поднять интерфейс ...

ps на ps
... хз, можно в самом скрипте слипать ...

Если делать

2 iNDiAnFLy:
Если делать restart - то само собой прокатит. Только это когда я сижу за компом и вижу , что сайтики открываться перестали - сл-но дисконнект и сл-но restart. Но если, к примеру, я поставил что-то на закачку, лег спать, и через минут 10 случится дисконнект, то как система определит это? Интерфейс-то она считает поднятым :)

Моё чудо

Я в когда понадобилось быстренько сваял скрипт. Впринципе он кривенький, я не силен в шелл-скриптах, но у меня оно работает на ура.
Нужно многое что переделать, хотя бы проверять тот же код выхода ping, а не его вывод. Еще очень жутко выглядит проверка сколько пингов на контрольных прошло. Для отладки сделал так, нужно бы переделать, но мне влом это делать =)
Скрипт пингует раз в 30 секунд. Если пинг не прошел, он делает 3 контрольных пинга. Если все 3 проходят то скрипт считает что все нормально, если нет, то уведомляет.
Далее в случае глюка скрипт рассылает через самбу на виндовые клиенты уведомления. Эту часть поменять можно под себя.

Вобщем скрипт написан жутко, не пинайте, писал в спешке и некогда было особо разбираться в bash'e. Написал, работая, я забыл =/

#!/bin/bash
# Скрипт пингует шлюз и вслучае неудач отсылает об этом уведомления
HOST="что.пингуем.ip"
PING_CMD="ping -c 1 -I eth0 $HOST 2>&1 | grep \"64 bytes from $HOST\""
PING_DROPS=0
FAILURE_STATUS=0
LOGFILE='/var/log/ping-script.log'

while [ -z "$PING_SCRIPT_STOP" ]
do

  if [ $PING_DROPS -eq 0 ]; then
    PING_RESULT=`/bin/bash -c "$PING_CMD"`
  else
    PING_RESULT=""
  fi

  if [ -z "$PING_RESULT" ]; then
    if [ $PING_DROPS -eq 0 ]; then
      echo `date` Одиночная ошибка пинга шлюза! Попытка сделать 3 пинга с интервалом 2 секунды... >> $LOGFILE
    else
      echo `date` Повторная проверка контрольными пингами >> $LOGFILE
    fi

    for ((c=1;c<4;c++))
    do
      PING_RESULT=`/bin/bash -c "$PING_CMD"`
      if [ -z "$PING_RESULT" ]; then
        export P_$c="непрошел"
        if [ $FAILURE_STATUS -eq 0 ]; then
          echo `date` попытка $c: непрошел >> $LOGFILE
        fi
      else
        export P_$c="прошел"
        if [ $FAILURE_STATUS -eq 0 ]; then
          echo `date` попытка $c: прошел >> $LOGFILE
        fi
      fi

      sleep 2;
    done

    if [ "$P_1 $P_2 $P_3" = "непрошел непрошел непрошел" ]; then
      if [ $FAILURE_STATUS -eq 0 ]; then
        echo `date` все 3 контрольных пинга не прошли! Отсылаю сообщения. >> $LOGFILE
        echo "Ошибка пинга шлюза! Возможно проблемы с ADSL!" | smbclient -M ADMIN -U "Скрипт уведомлений" > /dev/null
        echo "Ошибка пинга шлюза! Возможно проблемы с ADSL!" | smbclient -M EXCIMER1 -U "Скрипт уведомлений" > /dev/null
        echo "Ошибка пинга шлюза! Возможно проблемы с ADSL!" | smbclient -M JURA -U "Скрипт уведомлений" > /dev/null
        echo "Ошибка пинга шлюза! Возможно проблемы с ADSL!" | smbclient -M OLGA -U "Notify script" > /dev/null
      fi
      FAILURE_STATUS=1
    elif [ "$P_1 $P_2 $P_3" = "прошел прошел прошел" ]; then
      echo `date` все 3 контрольных пинга прошли. Продолжаем в нормальном режиме >> $LOGFILE
      PING_DROPS=0
    else
      let PING_DROPS=PING_DROPS+1
      if [ $PING_DROPS -ge 3 ]; then
        echo `date` покрайне мере один из 3х контрольных пингов прошел, $PING_DROPS попытка. Отсылаем сообщения >> $LOGFILE
        if [ $FAILURE_STATUS -eq 0 ]; then
          echo "Проблема с прохождение пингов! Возможно проблемы с ADSL" | smbclient -M ADMIN -U "Скрипт уведомлений" > /dev/null
          echo "Проблема с прохождение пингов! Возможно проблемы с ADSL" | smbclient -M EXCIMER1 -U "Скрипт уведомлений" > /dev/null
          echo "Проблема с прохождение пингов! Возможно проблемы с ADSL!" | smbclient -M JURA -U "Скрипт уведомлений" > /dev/null
          echo "Проблема с прохождение пингов! Возможно проблемы с ADSL!" | smbclient -M OLGA -U "Notify script" > /dev/null
        fi
        FAILURE_STATUS=1
        PING_DROPS=0
      else
        echo `date` покрайне мере один из 3х контрольных пингов прошел, продолжаем. $PING_DROPS попытка >> $LOGFILE
      fi
    fi
  else
    if [ $FAILURE_STATUS -eq 1 ]; then
      echo `date` Соединение восстановлено... >> $LOGFILE
      echo "Соединение ADSL восстановлено, отключите модем" | smbclient -M ADMIN -U "Скрипт уведомлений" > /dev/null
      echo "Соединение ADSL восстановлено, отключите модем" | smbclient -M EXCIMER1 -U "Скрипт уведомлений" > /dev/null
      echo "Соединение ADSL восстановлено, отключите модем" | smbclient -M JURA -U "Скрипт уведомлений" > /dev/null
      echo "Соединение ADSL восстановлено, отключите модем" | smbclient -M OLGA -U "Notify script" > /dev/null
      FAILURE_STATUS=0
    fi
    echo `date` пинг-понг! >> $LOGFILE
    PING_DROPS=0
#    echo "Пинг шлюза удался" | smbclient -M ADMIN -U "Скрипт уведомлений" > /dev/null
  fi
  if [ $PING_DROPS -ge 1 ]; then
    sleep 2
  else
    sleep 30
  fi

done

скрипт на bash:

скрипт на bash: проверять вывод пинга(указав в параметрах один запрос и максимальный таймаут) утилитой grep на наличие строки 100%, если есть 100% значит пинг не прошел, рестартить интефейс. Потом ложится спать на n секунд (sleep).... и все это в бесконечном цикле. Далее nohup'ом кидануть в фон.

Это самый простой вариант.

http://gentoo.ru/node/5373
мб на какие-то мысли подтолкнет )

У кого ADSL ETH

То собственно по телнету может опросить наличие соединения от "коробки" и сделать рестарт.
Правда вот бывает что коробочки "отпадают" и тогда помогает только холодный старт. ((

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".