Контролируем провайдера
Всем сомнивающимся в количестве предоставляемых интернет-услуг, посвящается :)
Я живу в Киеве, пользуюсь услугами провайдера 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 Не сочтите за рекламу. Мне действительно приятно, что Украина хоть немного пытается соответствовать мировым стандартам, приятно что витуха лежит в гофре, приятно видеть аккуратные шкафчики для свичей в подьездах, приятно знать что в шкафчиках управляемые свичи, а не барахло с радиорынка…
Но нам еще расти и расти до того момента, пока мы начнем понимать что главный в Вашем «бизнесе», дорогой провайдер — Клиент, а значит отношение должно быть соответствующее.
Рубрики: bash, FreeBSD, Programming · Теги: Corbina, FreeBSD, perl, shell, SLA, uptime

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