174 lines
6.7 KiB
Plaintext
174 lines
6.7 KiB
Plaintext
|
#!/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> © 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];
|
|||
|
}
|
|||
|
}
|