#!/usr/bin/perl
#########################################################################
#
# CGI скрипт для поиска и визуализации данных собранных rdrcollector-ом
#
# Автор: Сергей Калинин e-mail: banzaj28@yandex.ru
# распространяется под лицензией GPL
# (c) 2015
#########################################################################
use CGI ':standard';
# Вывод заголовка
print header(-type=>'text/html', -charset=>'utf-8');
print start_html("Форма поиска сессий абонента");
print "
| Поиск сессий абонента |
\n";
print "
\n";
print_prompt();
do_work();
print_tail();
read_protocol();
print end_html;
# вывод формы с полями
sub print_prompt {
print start_form;
print "Дата (ДД.ММ.ГГГГ) | ";
print "".textfield('date')." |
";
print "IP 1 | ";
print "".textfield('src_ip')." |
";
print "IP 2 | ";
print "".textfield('dst_ip')." |
";
#print "sss | ";
# print "",reset;
print submit('Action','Выполнить');
print end_form;
print "
\n";
}
# Проверка введённого IP адреса на корректность
sub match_ip
{
my $ip = $_[0];
if ($ip eq "")
{
return "";
}
#print $ip;
if ($ip =~ m/^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$/ )
{
return $ip;
} else {
return 0;
}
}
# проверка корректности даты
sub match_date {
my $input = shift;
if ($input =~ m!^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$!) {
# At this point, $1 holds the year, $2 the month and $3 the day of the date entered
if ($3 == 31 and ($2 == 4 or $2 == 6 or $2 == 9 or $2 == 11)) {
return 0; # 31st of a month with 30 days
} elsif ($3 >= 30 and $2 == 2) {
return 0; # February 30th or 31st
} elsif ($2 == 2 and $3 == 29 and not ($1 % 4 == 0 and ($1 % 100 != 0 or $1 % 400 == 0))) {
return 0; # February 29th outside a leap year
} else {
return $input; # Valid date
}
} else {
return 0; # Not a date
}
}
sub do_work {
my $key;
my $cmd;
# получаем данные введённые в форме
# и проверяем формат
my $date = match_date(param(date));
my $dst = match_ip(param(dst_ip));
my $src = match_ip(param(src_ip));
# если данные введены не верно выводим сообщение
if ($dst eq 0 || $src eq 0)
{
print "Введите корректный IP адрес";
exit;
}
if ($date eq "" || $date == 0)
{
print "Необходимо корректно ввести дату";
exit;
}
if ($dst eq "" && $src eq "")
{
print "Необходимо ввести IP адрес";
exit;
}
# формируем каталог для поиска в соответствии с датой
my ($day,$month,$year) = split(/\./,$date);
my $dir = "/var/srv/rdrcollector/$year/$month/$day";
# формируем команду поиска данных в зависимости от даты и IP адресов (1 или 2 адреса)
# определяем каталог в архиве и если он есть ищем данные в файлах этого каталога
# если такого каталога нет - поиск производится в кэше.
if (-d $dir)
{
if ($dst eq "") {
$cmd = "/usr/bin/gzip -c -d ".$dir."/*.gz | /usr/bin/grep -h ".$src;
} else {
$cmd = "/usr/bin/gzip -c -d ".$dir."/*.gz | /usr/bin/grep -h ".$src." | /bin/grep ".$dst;
}
} else {
print "Данные за $date в архиве не найдены производится поиск за последние сутки
";
if ($dst eq "") {
$cmd = "/usr/bin/grep -h ".param(src_ip)." /var/cache/rdrcollector/*";
} else {
$cmd = "/usr/bin/grep -h ".param(src_ip)." /var/cache/rdrcollector/* | /usr/bin/grep ".param(dst_ip);
}
}
# print $cmd;
# exit;
# выполняем команду поиска и выводим данные ввиде html-таблицы
print "Список TCP/IP сессий c адреса ".param(src_ip)." за ".$date."
";
print "Дата | Абонент | IP клиента | IP сервера | Трафик вх/исх | Протокол | Информация |
";
my $i = 0;
my $bgcolor;
foreach my $lines (`$cmd`) {
my $expr = $i % 2;
# чередование цвета фона строк для чётных и не чётных
if ($expr eq 0) {
$bgcolor = "#fffff";
} else {
$bgcolor = "#c5eaff";
}
# разбиваем строку на поля для удобства вывода.
my ($date_time, $client, $client_ip, $server_ip, $up_down, $protocol_sign) = split(/\t/, $lines);
# вывод данных
my ($user_ip, $group) = split("@", $client);
my ($t, $date) = split(" ", $date_time);
my ($d,$m,$y) = split(/\./,$date);
$protocol = read_protocol("$protocol_sign");
print "$date_time | ";
print "$client | ";
print "$client_ip | $server_ip | $up_down | $protocol | $info_string |
\n";
$i++;
}
print "
";
}
sub print_tail {
print "
© 2015, OOO \"Терион\"
";
}
# читаем файл с описанием протокола
sub read_protocol {
#print $_[0];
$cmd = "/usr/bin/grep -h \'".$_[0]."\' /usr/local/etc/protocol.csv";
my $lines = `$cmd`;
#print "$lines";
if ($lines) {
my ($prot, $signature) = split(";", $lines);
return $prot;
} else {
return $_[0];
}
}