Контролируем провайдера

Всем сомнивающимся в количестве предоставляемых интернет-услуг, посвящается :)

Я живу в Киеве, пользуюсь услугами провайдера Corbina Telecom (не путайте с Русской Corbin’ой), чем вполне доволен. За 20$ в месяц я имею неплохой канал шириной 100Mbit по «Украине» и 25Mbit в «мир». Есть у меня балконная домашняя зверушка, которая шуршит кулерами и работает в режиме 24/7. Используется для разных полезных и не очень целей: гейт для локалки, прокся, впн, файлопомойка, хостинг (в том числе хостит MyJournal.org.ua) etc. Заморочился я как-то вопросом статистики аптайма моего канала. Вот что с этого вышло:

Открываем наш любимый mcedit/vim/ee/nano/notepad/word/photoshop o_O и рисуем скрипт:

#!/bin/sh

###################################################
#                                                 #
#    Scripts for monitoring internet-link         #
#    Usage in cron:                               #
#    1 * * * * /path/to/script >/dev/null 2>&1    #
#                                                 #
###################################################

#-------------------------------------------------#
#                  VARIABLE                       #
#-------------------------------------------------#

existip=192.5.5.241             # NS Internet Systems Consortium (ns.isc.org)
pid_file=/var/run/internet.pid  # Lock file
log_file=/var/log/internet.log  # Log file
dhcp=yes                        # Use dhcp?
dhcp_if=net0                    # DHCP external interface

#-------------------------------------------------#
#                    BODY                         #
#-------------------------------------------------#

nr=""
ni=""
my_name=$0
pid=$$

if [ ! -f $log_file ];then
        touch $log_file
        echo " +------------------------------------------" >> $log_file
        echo " | A new file is created " `date "+%Y-%m-%d"` >> $log_file
        echo " +------------------------------------------" >> $log_file
fi

if [ -f $pid_file ];then
    old_pid=`cat ${pid_file}`
    result=`ps aux | grep "${old_pid}" | grep "${my_name}"`
        if [ "${result}" ]; then
            exit 255
        fi
fi

echo ${pid} > ${pid_file}

while !(test $ni);do
    if !(/sbin/ping -c 2 ${existip}) >/dev/null 2>&1;then
        if !(test $nr);then
            nr=1
            timeobr=`date "+%H:%M:%S"`
        fi
        if [ ${dhcp} = yes ];then
            killall dhclient >/dev/null 2>&1
            sleep 1
            /sbin/dhclient $dhcp_if >/dev/null 2>&1
            sleep 3
        else
            sleep 3
        fi
    else
        if (test $nr);then
            echo `date "+%Y-%m-%d`" Internet was absent from $timeobr to "`date "+%H:%M:%S"` >> $log_file
        fi
        ni=1
    fi
done

if [ -f ${pid_file} ]; then
    rm ${pid_file}
fi

Скрипт пингует указанный вами адрес, если он не доступен предполагает что канал умер, запоминает время падения, пишет пид в файл и входит в цикл, до тех пор пока не запингуется снова. После успешного пинга отписывает в лог-файл что, дескать, интернетов небыло со стольки-то до стольки-то, после чего стирает пид и завершает работу до следующего старта. Пихаем в крон для запуска каждую минуту:

1 * * * * /usr/local/etc/scripts/internet.sh >/dev/null 2>&1

…Прошел годик-полтора и лог файл вырос в несколько тыщ строк, читать их стало, мягко говоря, затруднительно, да и пропускать незначительные подения какнала в 20-30 секунд стало тоже напряжно. Избавляемся от головной боли. Берем в руки перл и стругаем скрипт:

#!/usr/bin/perl

###################################################
#                                                 #
#    Scripts for parsing internet-down log file   #
#    Usage:                                       #
#    /path/to/script YYYY MM                      #
#                                                 #
###################################################

#-------------------------------------------------#
#                  VARIABLE                       #
#-------------------------------------------------#

$logfile="/var/log/internet.log"; # Path to log file

#-------------------------------------------------#
#                    BODY                         #
#-------------------------------------------------#

open(INTERNET, "<$logfile") || die("$0: could not open file: $!");

print "------------+------------------------+\n";
print ("Date        |\tHOUR\tMIN\tSEC  |\n");
print "------------+------------------------+\n";

while (<INTERNET>){
    $str = $_;
    if ( $srt = ~ /(\d{4}-\d{2}-\d{2}).*(\d{2}:\d{2}:\d{2}).*(\d{2}:\d{2}:\d{2})/ ) {
        my $date = $1;
        my $time1 = $2;
        my $time2 = $3;

        ($year, $month, $day)=split('-',$date);
        ($from_hour, $from_min, $from_sec)=split(':',$time1);
        ($to_hour, $to_min, $to_sec)=split(':',$time2);

        $from_main = $from_hour*3600+$from_min*60+$from_sec;
        $to_main = $to_hour*3600+$to_min*60+$to_sec;
        $downtime = ($to_main - $from_main);
        if ( $downtime > 30 and $year == $ARGV[0] and $month == $ARGV[1]){
            $downtime_all = $downtime_all+$downtime;
            $unit = "seconds";
            if ( $downtime < 3600) {
                $hour = 0;
                $min = int($downtime/60);
                $sec = $downtime-$min*60;
            }
            if ( $downtime > 3600) {
                $hour = int($downtime/3600);
                $minsec = $downtime-$hour*3600;
                $min = int($minsec/60);
                $sec = $downtime-($hour*3600+$min*60);
            }
                $sec = sprintf("%02d",$sec);
                $min = sprintf("%02d",$min);
                $hour = sprintf("%02d",$hour);
                print "$date  |\t$hour\t$min\t$sec   |\n";
        }
    }
}
if ( $downtime_all < 3600 ) {
    $hour = 0;
    $min = int($downtime_all/60);
    $sec = $downtime_all-$min*60;
}
if ( $downtime_all > 3600 ) {
    $hour = int($downtime_all/3600);
    $minsec = $downtime_all-$hour*3600;
    $min = int($minsec/60);
    $sec = $downtime_all-($hour*3600+$min*60);
}
$sec = sprintf("%02d",$sec);
$min = sprintf("%02d",$min);
$hour = sprintf("%02d",$hour);
print "------------+------------------------+\n";
print "All downtime:\t$hour\t$min\t$sec   |\n";
print "------------+------------------------+\n";

Скрипт парсит наш лог-файл, и выводит время даунтайма в красивом и понятном виде. Рекомендую к пользованию в скриптах статистики. Запуск и вывод:

# ./downtime.pl 2010 01
------------+------------------------+
Date        |   HOUR    MIN     SEC  |
------------+------------------------+
2010-01-02  |   00      00      45   |
2010-01-05  |   00      09      14   |
2010-01-06  |   00      14      05   |
2010-01-06  |   00      00      54   |
2010-01-10  |   00      00      33   |
2010-01-11  |   00      00      34   |
2010-01-11  |   00      00      33   |
------------+------------------------+
All downtime:   00      26      38   |
------------+------------------------+

Подводим итоги. За весь 2009 год у меня небыло интернета по вине провайдера почти 67 часов. Тоесть процент даунтайма меньше 1%, чему я, безусловно, рад. Спасибо за хорошую теническую работу.

UDP Не сочтите за рекламу. Мне действительно приятно, что Украина хоть немного пытается соответствовать мировым стандартам, приятно что витуха лежит в гофре, приятно видеть аккуратные шкафчики для свичей в подьездах, приятно знать что в шкафчиках управляемые свичи, а не барахло с радиорынка…
Но нам еще расти и расти до того момента, пока мы начнем понимать что главный в Вашем «бизнесе», дорогой провайдер — Клиент, а значит отношение должно быть соответствующее.

Опубликовано 12.01.2010 в 14:10 · Автор Berezhinskiy · Ссылка
Рубрики: bash, FreeBSD, Programming · Теги: , , , , ,

2 комментария

Подписаться на комментарии по RSS

  1. Написал(-а) Lenny
    10 марта 2010 в 19:25
    Ответить · Ссылка

    да… хороший канал и достаточно дешёвый, у меня 20$ за 4 мБит

  2. Написал(-а) bigooyan
    25 ноября 2010 в 14:58
    Ответить · Ссылка

    Толково сделано, фряха в доме не игрушка :) у меня это файлопомойка ну и трансмишн, куда ж без него, причём как и водится на порядочных дровах, фряха для таких дров — вторая жизнь!
    А каналу такому только обзавидоваться,
    я плачУ $50 за анлим 1.2 Мбита при этом, если сдую более 20Гиг, то скорость упадёт до конца месяца до 300кбит.
    И это на Дальнем Востоке в РФ. Эх, Россия, которая всех учит жить, а сама-то в жопе…
    А в Святошино, в Киеве у меня бабушка живёт, эт так к слову, 10 лет уж как не бы в Киеве, очень красивый город. Привет чёрному коту, что у золотых ворот.

Подписаться на комментарии по RSS

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