rdrcollector/cgi/search

174 lines
6.7 KiB
Perl
Executable File
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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 "<table width=100%><tr><td width=10%><img src=/logo.gif></td><td width=90% align=center><h2>Поиск сессий абонента</h2></td></tr></table>\n";
print "<hr>\n";
print_prompt();
do_work();
print_tail();
read_protocol();
print end_html;
# вывод формы с полями
sub print_prompt {
print start_form;
print "<p><table><tr><td><em>Дата (ДД.ММ.ГГГГ)</em></td>";
print "<td>".textfield('date')."</td></tr>";
print "<tr><td><em>IP 1</em></td>";
print "<td>".textfield('src_ip')."</td></tr>";
print "<tr><td><em>IP 2</em></td>";
print "<td>".textfield('dst_ip')."</td></tr></table>";
#print "<td><ifarme name=userdata width=468 height=60 align=left>sss</iframe></td></tr></table>";
# print "<p>",reset;
print submit('Action','Выполнить');
print end_form;
print "</p><hr>\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 "<font color=red size=5>Введите корректный IP адрес</font>";
exit;
}
if ($date eq "" || $date == 0)
{
print "<font color=red size=5>Необходимо корректно ввести дату</font>";
exit;
}
if ($dst eq "" && $src eq "")
{
print "<font color=red size=5>Необходимо ввести IP адрес</font>";
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 в архиве не найдены производится поиск за последние сутки<br>";
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 "<h3>Список TCP/IP сессий c адреса ".param(src_ip)." за ".$date."</h3>";
print "<table width=100%><tr bgcolor=#78ceff><td align=center>Дата</td><td align=center>Абонент</td><td align=center>IP клиента</td><td align=center>IP сервера</td><td align=center>Трафик вх/исх</td><td>Протокол</td><td align=center>Информация</td></tr>";
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 "<tr bgcolor=$bgcolor><td width=10%><font size=2>$date_time</td>";
print "<td width=20%><font size=2><a href=/cgi-bin/usersearch?ip=".$user_ip."&day=".$d."&month=".$m."&year=".$y."&t=".$t." target=userdata>$client</td>";
print "<td width=10%><font size=2>$client_ip</td><td width=10%><font size=2>$server_ip</td><td width=10%><font size=2>$up_down</td><td width=20%><font size=2>$protocol</td><td><font size=2>$info_string</td></tr>\n";
$i++;
}
print "</table>";
}
sub print_tail {
print "<hr><div align=center> &copy 2015, OOO \"Терион\"</div>";
}
# читаем файл с описанием протокола
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];
}
}