#!/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 ""; print ""; print ""; print ""; print "
Дата (ДД.ММ.ГГГГ)".textfield('date')."
IP 1".textfield('src_ip')."
IP 2".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 ""; 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 ""; print ""; print "\n"; $i++; } print "
ДатаАбонентIP клиентаIP сервераТрафик вх/исхПротоколИнформация
$date_time$client$client_ip$server_ip$up_down$protocol$info_string
"; } 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]; } }