четверг, 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)