четверг, 17 февраля 2011 г.

Fucking BeeLine

У меня дома подключен интернет через бывшую Корбину, ныне BeeLine. У этих деятелей часто пропадает сеть. Особенно любят они баловаться этим по ночам. И товарищи не предоставляют никаких компенсаций за это.

Как то я проснулся ночью. Спать не хотелось и я решил пошариться по интернету. Да не тут то было. Во внутреннюю сеть Корбины вхожу - далее никуда.

Думаю деньги кончились - полез в личный кабинет, а зайти туда не могу. Соединение сбрасывается.
Потом по прошествии времени с ними очень трудно разбираться.
- Когда у Вас было отключение? Не помните? Ну вспомните - позвоните.

В общем я разозлился и написал вот такой скрипт.
#!/bin/bash
# Контроль работы домашнего проводного интернет BeeLine (Corbina)
# Скрипт последовательно проверяет доступность внутреннего роутера,
# внутренней сети Корбины (Билайн) и сайта google.
# В случае ошибки доступа в log файле делается соответствующая запись.
# 
# Для автоматической отправки писем требуется MTA. Я использую exim
# Настройка MTA exim http://wiki.debian.org/GmailAndExim4
#
# Copyleft AxaRu http://axa-ru.blogspot.com/2011/02/fucking-beeline.html

# Версия         Изменения
# ------------   ---------------------------------------------------------------
#VERSION=0.1      # Первая версия. Проверка работы интернета
#VERSION=0.11     # Добавлена возможность измерения скорости соединения
#VERSION=0.12     # Добавлены опции командной строки
#VERSION=0.13     # Добавил опцию спецификации log-файла
#VERSION=0.131    # Убрал ключ -v Verbose. Информация по доступности узлов 
                  # в log не пишется и выводится только в консоль при включении 
                  # ключа -d debug
#VERSION=0.14     # сделал отправку письма и sms о перебое в работе интернета
                  # и письма в службу Корбина (Билайн) с требованием компенсации
                  # за непредоставленную услугу
VERSION=0.141    # добавил спецификацию почтового ящика, куда будут 
                  # отправляться письма

LOG_FILE=/var/log/corbina.log         # журнал работы программы

RC_FAIL=0              # return code = FAIL
RC_OK=1                # return code = OK000

ERROR_BARIER=4         # Количество ошибок подряд, после которого высылается 
                       # письмо в службу поддержки о предоставлении компенсации

EMAILTO=ivanov@gmail.com     
                       # Адрес, куда направлять письма о компенсации за 
                       # отсутствие услуги интернета

#-------------------------------------------------------------------------------
# Текст письма в службу поддержки
CLAIM11="В службу поддержки пользователей
от пользователя услуги ""Домашний интернет""
Иванова И.И. 

Договор №1234 от 12 октября 2008 года



Сообщаю вам, что с"
Start_interrupt=0      # когда прекратилась услуга интернета

CLAIM12=" по "
Stop_interrupt=0       # когда интернета был восстановлен

CLAIM13=" были перебои в 
предоставлении услуги интернет.

Прошу предоставить мне компенсацию.

С уважением Иванов И.И.
"

#-------------------------------------------------------------------------------
# 
Usage()
{
  echo "chki -[dehlmsvV]"
  echo "check internet connection"
  echo "   d              - debug mode, shows the internal variables"
  echo "   e              - logs only error state"
  echo "   h              - this help"
  echo "   l [filename]   - specify log file, default /var/log/corbina.log"
  echo "   m [mailbox]    - mail to, specify mail recipient. If mailbox is"
  echo "                    wrong mail will not be delivered"
  echo "   s              - download speed measurement"
  echo "   V              - version"
  echo "example:"
  echo "chki.sh -del corbina.log -m myaddress -s"
}

#-------------------------------------------------------------------------------
# 

Version()
{
  echo "chki - check internet connection v$VERSION"
}

#-------------------------------------------------------------------------------
# запись текста в log-файл
Log() 
{
  echo $(date +'%F %T') ! "$*"  |  tee -a $LOG_FILE
}

#-------------------------------------------------------------------------------
# Проверяет доступность сайта и возвращает результат
Chk_ip() 
{
  if ping -c 3 -q $* | grep '100% packet loss'> /dev/null 
    then
      Val=$RC_FAIL
    else
      Val=$RC_OK
  fi
  $DEBUG && echo "Address=$*, Result=$Val"
  return $Val
}

#-------------------------------------------------------------------------------
# Проверяет это восстановление после сбоя?
# Если да, то пишем письмо с претензией.
Check_interrupt()
{
  local x=2

  line_rec=$(tail -$x "$LOG_FILE" | head -1 | grep FAILED)

  if [ -n "$line_rec" ]
    then
      Stop_interrupt=${line_rec:0:19}
      while [ -n "$line_rec" ]
      do
        let x++
        Start_interrupt=${line_rec:0:19}
        line_rec=$(tail -$x "$LOG_FILE" | head -1 | grep FAILED)
      done
      $DEBUG && echo "Start_interrupt = $Start_interrupt, Stop_interrupt = $Stop_interrupt"
  fi
  let "ERROR_BARIER += 2"
  $DEBUG && echo "Count=$x, Barrier=$ERROR_BARIER"
  if [ "$x" -gt "$ERROR_BARIER" ]
    then
      $DEBUG && echo "Длинный перерыв. Пишем претензию."
      $DEBUG && printf "%s %s %s %s %s" \
          "$CLAIM11" "$Start_interrupt" "$CLAIM12" "$Stop_interrupt" "$CLAIM13"
      printf "%s %s %s %s %s" \
          "$CLAIM11" "$Start_interrupt" "$CLAIM12" "$Stop_interrupt" "$CLAIM13" \
          | mail -s 'Компенсация по непредоставлению услуги Домашний интернет' $EMAILTO
  fi
}

#-------------------------------------------------------------------------------
# Скачивает тестовый файл длиной 10 MB 
TEST_FILE=http://speedtest.wdc01.softlayer.com/downloads/test10.zip  
# и расчитывает скорость закачки
SPEED=0
Speed_tst()
{
  Start=`eval date +%s`
  eval curl -o /dev/null $TEST_FILE
  Stop=`eval date +%s`
  Ttime=$(( $Stop - $Start ))
  Speed_Rate=$(( 10485760 / $Ttime / 1024 ))
  $DEBUG && echo "speed_tst: $Stop - $Start = $Ttime, Rate = $Speed_Rate k"
  SPEED=$Speed_Rate
  return 
}

#-------------------------------------------------------------------------------
# --- Configuration ---
IP1=192.168.1.1         # Роутер
IP2=home.corbina.net    # Сеть Корбины/Билайна
IP3=www.google.com      # Всегда onLine

#  IP1  IP2  IP3
#  ok   ok   ok   - Все работает
#  ok   ok   fail - Соединение с сетью есть но выхода в интернет нет
#  ok   fail fail - Отсутствует соединение с сетью
#  fail fail fail - Ошибка локальной сети
# 

#-------------------------------------------------------------------------------
# Считываем ключи командной строки и устанавливает 
# соответствующие значения переменным

DEBUG=false
CSPEED=false
LOG_OK=true

  while getopts 'dehl:svV' OPTION
  do
    $DEBUG && printf "%s " $OPTION

    case $OPTION in
      d)
        DEBUG=true
        ;;
      e)
        LOG_OK=false
        ;;
      h)
        Usage
        exit 2
        ;;
      l)
        LOG_FILE=$OPTARG
        ;;
      m)
        MAILTO=$OPTARG
        ;;
      s)
        CSPEED=true
        ;;
      V)
        Version
        exit 2
        ;;
      *)
        Usage
        exit 2
        ;;
    esac
  done


  $DEBUG && printf "d\n" && echo + Отладка +
  $DEBUG && echo "Log file = $LOG_FILE"
  Chk_ip "$IP1"
  NVal=$(( $? * 100 ))
  $DEBUG && echo "NVal=$NVal"
  Chk_ip "$IP2"
  NVal=$(( $NVal + $? * 10 ))
  $DEBUG && echo "NVal=$NVal"
  Chk_ip "$IP3"
  NVal=$(( $NVal + $? ))
  $DEBUG && echo "NVal=$NVal"

  case $NVal in
    0)
      Log "*********** BIG FAIL: You home network is destroyed!!!"
      ;;
    100)
      Log "************* FAILED: BeeLine is shitheads"
      ;;
    110)
      Log "************* FAILED: BeeLine is shitheads"
      ;;
    111)
      $DEBUG && echo "Internet OK"
      Check_interrupt
      SPEED='---'
      $CSPEED && Speed_tst
      $LOG_OK && Log "OK: Life is beautiful. Download speed = $SPEED"
      ;;
    *)
      Log "Fucking shit. You BAD programmer!!! NVal=$NVal"
      ;;
  esac

  exit
Запускается с различными опциями.
$ chki.sh -h chki -[dehlsvV] check internet connection d - debug mode, shows the internal variables e - logs only error state h - this help l [filename] - specify log file, default /var/log/corbina.log s - download speed measurement V - version Вывод максимально полной информации о соединении с интернет: $ ./chki.sh -l corbina.log -s % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 11.0M 100 11.0M 0 0 322k 0 0:00:34 0:00:34 --:--:-- 344k 2011-02-23 00:07:17 ! OK: Life is beautiful. Download speed = 292 Вставил его в cron ReadyNas Duo. Он запускается каждый час и логирует состояние интернета.

Теперь достаточно посмотреть corbina.log я подкован фактическим материалом 8)

7 комментариев:

  1. Надо было сразу звонить в службу поддержки: я от оператора до технического специалиста доходил:) фиксировал номер заявки и возвращал деньги:)
    раз не спалось - надо было звонить! минут за 20 разобрались бы. Правда с роутером сложнее. Они корректно обычно отвечают по тем моделям, которые они официально рекомендуют, но в последний раз я им объяснял, что у меня асус н 15 - они не заставили лезть и переключать кабель в комп. Разобрались и так:)

    ОтветитьУдалить
  2. Это правда.
    Если им сразу позвонить, то все происходит.
    Но.
    1. Автоматически, без моего участия Билайн не хочет ставить компенсацию. Им зачем то мой звонок требуется.

    2. Если девочка "забудет" поставить в своей системе компенсацию, пройдет пол месяца и, покопавшись в памяти и поняв, что я не помню дату и время, когда был инцидент, плюешь на это и живешь дальше до следующего отключения. Когда оно происходит (в самый неудобный момент): материшься, звонишь, ждешь включения и круг замкнулся.

    3. Они сознательно не вводят фиксации переписки с клиентом, что бы не осталось никаких следов.

    Я хочу, чтобы этот процесс был детерминирован и автоматизирован, то есть требовалось мое минимальное участие. 8)

    Вот, собственно, мои движущие силы

    ОтветитьУдалить
  3. Я понимаю, что скрипт это круто, но не проще ли сменить провайдера?

    ОтветитьУдалить
  4. А что? Другой провайдер весь такой из себя честный?

    ОтветитьУдалить
  5. Хоть у меня не билайн, но скрипт оказался какраз очень полезен, спасибо!
    Но:
    Заменил IP1 и IP2 на свои адреса,
    Почему-то нет никаких уведомлений, для начала пробовал отправлять к себе на почту.

    ОтветитьУдалить
  6. Упс, разобрался. Сорри.

    Спасибо ещё раз!

    ОтветитьУдалить
  7. Ух! Круто. Я посмотрел сейчас. У меня по логам длительные сбои прекратились.
    Не знаю что повлияло: то ли письма, то ли они все наладили.
    А наверное и то и другое.

    Рад, что скрипт пригодился еще кому то.

    ОтветитьУдалить