#!/usr/bin/perl
#############################################################################
#
# CGI скрипт для поиска данных абонента в биллинге на основе даты и ip адреса
#
# вызывается из скрипта search с параметрами сессии:
# IP-Адрес, День, Месяц, Год, Время
#
# например:
# cgi-bin/usersearch?ip=4.8.5.1&day=01&month=03&year=2015&t=00:09:46
#
# Автор: Сергей Калинин email: banzaj28@yandex.ru
# распространяется под лицензией GPL
# (c) 2015
#########################################################################
use CGI ':standard';
use DBI;
# Вывод заголовка
print header(-type=>'text/html', -charset=>'utf-8');
print start_html("Данные по абоненту");
#print "
| Поиск сессий абонента |
\n";
print "Данные по абоненту
";
print "
\n";
# выполняем процедуры описанные ниже
print_prompt();
do_search();
print_tail();
print end_html;
###################################################################
# Описание процедур
###################################################################
# Выводим параметры поиска на экран
sub print_prompt {
my $date = param(day);
my $month = param(month);
my $year = param(year);
my $date = join("\.", $date, $month, $year);
print "Параметры поиска
";
print "IP адрес - ".param(ip);
print "
Дата - ".$date;
print "
Время - ".param(t)."
";
}
# поиск данных в БД биллинга
sub do_search {
my $ip = param(ip);
my $day = param(day);
my $month = param(month);
my $year = param(year);
my $time = param(t);
# определяем имя таблицы с сессиями
my $table = "inet_session_log_1_".$year."".$month;
# форматируем дату для запроса
my $date = $year."-".$month."-".$day." ".$time;
# конектимся к GLPI базе.
my $dsn = 'DBI:mysql:bgbilling:192.168.1.250';
my $db_user_name = 'netflow';
my $db_password = 'Cbcntvfnbpfwbz112318';
my ($id, $password);
my $dbh = DBI->connect($dsn, $db_user_name, $db_password);
# my $table = "inet_session_log_1_".$year."".$month;
# формируем SQL запрс
my $sth = $dbh->prepare(qq{select c.title, serv.login, INET_NTOA(CONV(HEX( session.ipAddress ), 16, 10)) as ip, session.sessionStart, session.sessionStop from inet_serv_1 serv
left join $table session on serv.id = session.servid
left join contract c on c.id = serv.contractid
where serv.contractid <> '2' and INET_NTOA(CONV(HEX( session.ipAddress ), 16, 10)) = '$ip' and session.sessionStart <= '$date' AND session.sessionStop >= '$date'
});
# my $sth = $dbh->prepare(qq{select c.title, serv.login, INET_NTOA(CONV(HEX( session.ipAddress ), 16, 10)) as ip, session.sessionStart, session.sessionStop from inet_serv_1 serv
# left join $table session on serv.login = session.username
# left join contract c on c.id = serv.contractid
# where serv.contractid <> '2' and INET_NTOA(CONV(HEX( session.ipAddress ), 16, 10)) = '$ip' and session.sessionStart <= '$date' AND session.sessionStop >= '$date'
# });
# Выполняем запрос к БД
$sth->execute();
# если в предыдущем запросе ничего не найдено ищем в таблице активных сессий
if ($sth->rows == 0)
{
$sth = $dbh->prepare(qq{select c.title, i_c_1.username, INET_NTOA(CONV(HEX( i_c_1.ipAddress ), 16, 10)) as ip , session.sessionstart, session.sessionstop
from inet_connection_1 i_c_1
join inet_session_1 session on session.connectionid = i_c_1.id
join inet_serv_1 i_s_1 on i_s_1.id = i_c_1.servid
join contract c on c.id = i_s_1.contractid
where i_c_1.parentid = 0 and INET_NTOA(CONV(HEX( i_c_1.ipAddress ), 16, 10)) = '$ip' and session.sessionStart <= '$date'});
$sth->execute();
}
print "Найдено записей - ".$sth->rows."
";
# получаем данные запроса форматируем и выводим на экран
while (($title, $login, $ip, $start, $stop) = $sth->fetchrow_array())
{
print "Договор - $title
Имя пользователя - $login
IP - $ip
Cессиия - $start - $stop
";
}
$sth->finish();
# Отцепляемся от БД
$dbh->disconnect();
}
sub print_tail {
print "
© 2015, OOO \"Терион\"
";
}