'Outgoing traffic (udp)',
'udpIn' => 'Incoming traffic (udp)',
'tcpOut' => 'Outgoing traffic (tcp)',
'tcpIn' => 'Incoming traffic (tcp)',
'allOut' => 'Outgoing traffic (total)',
'allIn' => 'Incoming traffic (total)',
'server' => 'undefined'
);
/* Определим флаг сортировки. */
if (isset($_GET['sort']))
$temp = in_array($_GET['sort'], $avlSortCmp) ? $_GET['sort'] : 'allIn';
else
$temp = 'allIn';
define('SORT_CMP', $temp);
/* Определим запрашиваемый месяц */
define('PERIOD', get_period());
/* Определим запрашиваемый день месяца */
define('PERIOD_DAY', get_period_day());
/* Сформируем даты, между которыми будет формироваться статистика. */
define('BEGIN_DATE', get_begin_date(PERIOD, PERIOD_DAY));
define('END_DATE', get_end_date(BEGIN_DATE, PERIOD_DAY));
/* Определим пользователя по которому запрашивается статистика. */
if (isset($_GET['user'])) {
$temp = mysql_real_escape_string($_GET['user']);
define('USER', $temp);
define('USER_NAME', long2ip(USER));
} else {
message_die("Undefined variable 'user'.");
}
/* количество запросов к базе */
$queryCount = 0;
function my_mysql_query($query)
{
global $queryCount;
$queryCount++;
$result = mysql_query($query) or
message_die("Query failed: " . mysql_error());
return $result;
}
/* получим статистику клиента за период */
$dataTraf = array();
$patternsQueryTraf = array('/%USER%/', '/%BEGIN_DATE%/', '/%END_DATE%/');
/*
* Запрос устанавливает переменную '@proto' используемую в дальнейших запросах
* для идентификации протокола, по которому идет запрос.
* Внимание, после вызова команды musql_close, данная переменная
* больше не доступна.
*/
$querySetProto = 'select @proto := id from proto where name = "%PROTO%"';
/*
* Запрос восзвращает список посещаемых серверов клиентом и количество
* полученного трафика от него по заданному протоколу и за заданный период.
*/
$queryTraf =
'select
out.dstIp as server,
out.trafOut as trafOut,
in.trafIn as trafIn
from
(
select dstIp, sum(psize) as trafOut
from traffic
where (pId = @proto) && (srcPort = 0) && (srcIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")
group by dstIp
) as `out` join
(
select srcIp, sum(psize) as trafIn
from traffic
where (pId = @proto) && (dstPort = 0) && (dstIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")
group by srcIp
) as `in` on out.dstIp = in.srcIp
union all
select
out.dstIp as server,
out.trafOut as trafOut,
ifnull(in.trafIn,0) as trafIn
from
(
select dstIp, sum(psize) as trafOut
from traffic
where (pId = @proto) && (srcPort = 0) && (srcIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")
group by dstIp
) as `out` left outer join
(
select srcIp, sum(psize) as trafIn
from traffic
where (pId = @proto) && (dstPort = 0) && (dstIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")
group by srcIp
) as `in` on out.dstIp = in.srcIp
where in.srcIp is null
union all
select
in.srcIp as server,
ifnull(out.trafOut,0) as trafOut,
in.trafIn as trafIn
from
(
select dstIp, sum(psize) as trafOut
from traffic
where (pId = @proto) && (srcPort = 0) && (srcIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")
group by dstIp
) as `out` right outer join
(
select srcIp, sum(psize) as trafIn
from traffic
where (pId = @proto) && (dstPort = 0) && (dstIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")
group by srcIp
) as `in` on out.dstIp = in.srcIp
where out.dstIp is null';
/* установим в MySQL переменную @proto для протокола UDP */
$queryTemp = preg_replace('/%PROTO%/', 'udp', $querySetProto);
$result = my_mysql_query($queryTemp);
mysql_free_result($result);
/* Формируем статистику запрошеных адресов по протоколу UDP. */
$replacements = array(USER, BEGIN_DATE, END_DATE);
$queryTemp = preg_replace($patternsQueryTraf, $replacements, $queryTraf);
$result = my_mysql_query($queryTemp);
while ($line = mysql_fetch_assoc($result)) {
$index = $line['server'];
$dataTraf[$index]['udpOut'] = $line['trafOut'];
$dataTraf[$index]['udpIn'] = $line['trafIn'];
}
mysql_free_result($result);
/* установим в MySQL переменную @proto для протокола TCP */
$queryTemp = preg_replace('/%PROTO%/', 'tcp', $querySetProto);
$result = my_mysql_query($queryTemp);
mysql_free_result($result);
/* Формируем статистику запрошенных адресов по протоколу TCP. */
$replacements = array(USER, BEGIN_DATE, END_DATE);
$queryTemp = preg_replace($patternsQueryTraf, $replacements, $queryTraf);
$result = my_mysql_query($queryTemp);
while ($line = mysql_fetch_assoc($result)) {
$index = $line['server'];
$dataTraf[$index]['tcpOut'] = $line['trafOut'];
$dataTraf[$index]['tcpIn'] = $line['trafIn'];
}
mysql_free_result($result);
/* Получим статистику за период суммарного трафика */
$patternsQueryPeriod = array("/%USER%/", "/%BEGIN_DATE%/", "/%END_DATE%/");
/* сформируем массив данных для построения графика */
$dateBeginArray = array();
$dateEndArray = array();
list($year, $month, $day) = split('-', BEGIN_DATE);
$initDate = mktime(0, 0, 0, $month, $day, $year);
list($year, $month, $day) = split('-', END_DATE);
$endDate = mktime(0, 0, 0, $month, $day, $year);
while ($initDate < $endDate) {
$tempDate = date("Y-m-d H:i:s", $initDate);
$dateBeginArray[] = $tempDate;
list($date, $time) = split(' ', $tempDate);
list($year, $month, $day) = split('-', $date);
list($h, $m, $s) = split(':', $time);
$initDate = PERIOD_DAY ?
mktime($h + 1, 0, 0, $month, $day, $year) :
mktime(0, 0, 0, $month, $day + 1, $year);
$dateEndArray[] = date("Y-m-d H:i:s", $initDate);
}
/* Запрос возвращает количество прошедшего трафика за заданный период. */
$queryPeriod = '
select
ifnull(out.psizeSum,0) as outTraf,
ifnull(in.psizeSum,0) as inTraf
from
(
select sum(psize) as psizeSum
from traffic
where (srcPort = 0) && (srcIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")
) as `out` join
(
select sum(psize) as psizeSum
from traffic
where (dstPort = 0) && (dstIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")
) as `in`';
$imgDataOut = array();
$imgDataIn = array();
for ($i = 0; isset($dateBeginArray[$i]); $i++) {
$replacements = array(USER, $dateBeginArray[$i], $dateEndArray[$i]);
$queryTemp = preg_replace($patternsQueryPeriod,
$replacements, $queryPeriod);
$result = my_mysql_query($queryTemp);
$line = mysql_fetch_assoc($result);
$imgDataOut[] = $line['outTraf'];
$imgDataIn[] = $line['inTraf'];
mysql_free_result($result);
}
/* сформируем линк для графика суммарного трафика */
$imgUser = './graph.php?graph=statgraph&leg=' .
urlencode('Sent') . '|' . urlencode('Received') .
'&xt=' . urlencode(PERIOD_DAY ? 'Hours' : 'Days') .
'&data=' . implode(',', $imgDataOut) . '|' . implode(',', $imgDataIn);
/* Заполним пустые поля в массиве трафика и подсчитаем полный трафик. */
foreach ($dataTraf as $server => $traf) {
if (!isset($traf['udpOut'])) {
$dataTraf[$server]['udpOut'] = 0;
}
if (!isset($traf['udpIn'])) {
$dataTraf[$server]['udpIn'] = 0;
}
if (!isset($traf['tcpOut'])) {
$dataTraf[$server]['tcpOut'] = 0;
}
if (!isset($traf['tcpIn'])) {
$dataTraf[$server]['tcpIn'] = 0;
}
$dataTraf[$server]['allOut'] =
$dataTraf[$server]['udpOut'] + $dataTraf[$server]['tcpOut'];
$dataTraf[$server]['allIn'] =
$dataTraf[$server]['udpIn'] + $dataTraf[$server]['tcpIn'];
}
/*
* Функция сортировки данных статистики.
* Перед сортировкой должны быть определены глобальные
* переменные:
* dataTrafCopy - содержит копию сортируемого масива
* sortCmp - ключ в ассоциативном массиве по которому идет сортировка
*/
$dataTrafCopy = $dataTraf;
function sort_cmp($a, $b)
{
if (strcmp(SORT_CMP, 'server')) {
global $dataTrafCopy;
global $sortCmp;
$v1 = $dataTrafCopy[$a][$sortCmp];
$v2 = $dataTrafCopy[$b][$sortCmp];
if ($v1 == $v2)
return 0;
return ($v1 > $v2) ? -1 : 1;
} else {
return strcasecmp(long2ip($a), long2ip($b));
}
}
/*
* Сформируем данные для картинки отображающей топ трафика.
* Внимание, данные можно формировать только после сортировки
* данных о трафике.
*/
define('PIE_SLICE', 5);
function make_top_image($title)
{
global $dataTraf;
global $sortCmp;
$topLabel = array();
$topData = array();
$dataTemp = $dataTraf;
$i = 0;
uksort($dataTemp, 'sort_cmp');
if (strcmp($sortCmp, 'server')) {
foreach ($dataTemp as $client => $traf) {
if (!$traf[$sortCmp])
break;
$i++;
if ($i < PIE_SLICE) {
$topLabel[] = long2ip($client);
$topData[] = $traf[$sortCmp];
} else if ($i == PIE_SLICE) {
$topLabel[PIE_SLICE - 1] = urlencode('other');
$topData[PIE_SLICE - 1] = $traf[$sortCmp];
} else {
$topData[PIE_SLICE - 1] += $traf[$sortCmp];
}
}
}
/* Сформируем линк для картинки топа трафика */
$imgTop = './graph.php?graph=topgraph';
if (isset($topData[0])) {
$imgTop .= '&title=' . urlencode($title) . '&leg=' .
implode('|', $topLabel) . '&data=' . implode(',', $topData);
}
return $imgTop;
}
switch (SORT_CMP) {
case 'udpOut':
case 'udpIn':
$sortCmpOut = 'udpOut';
$sortCmpIn = 'udpIn';
break;
case 'tcpOut':
case 'tcpIn':
$sortCmpOut = 'tcpOut';
$sortCmpIn = 'tcpIn';
break;
case 'allOut':
case 'allIn':
$sortCmpOut = 'allOut';
$sortCmpIn = 'allIn';
break;
default:
$sortCmpOut = $sortCmpIn = 'server';
}
$sortCmp = $sortCmpOut;
$imgTopOut = make_top_image($arrImgTopTitle[$sortCmpOut]);
$sortCmp = $sortCmpIn;
$imgTopIn = make_top_image($arrImgTopTitle[$sortCmpIn]);
/* сортируем данные */
$sortCmp = SORT_CMP;
uksort($dataTraf, "sort_cmp");
/* формирует ссылку для сортировки данных */
function make_sort_link($val, $sort)
{
if ($sort != SORT_CMP) {
$link = '' . $val . '';
} else {
$link = $val;
}
return $link;
}
/**
* Отобразим страницу.
*/
list($year, $month) = split('-', BEGIN_DATE);
$day = PERIOD_DAY;
$title = 'Статистика за ' . make_month($year, $month, $day) .
': Хост ' . USER_NAME;
print_html_head($title, 'reverse_ip');
/* отобразим название продукта */
print_head();
/* отобразим график содержащай статистику */
echo '
' . "\n";
echo '';
print_login();
echo " |
\n";
echo 'Статистика за ' .
make_month($year, $month, $day) . " |
\n";
echo 'Хост ' . USER_NAME . " |
\n";
echo " |
\n";
echo '';
echo ' ';
echo ' |
' . "\n";
echo '';
print_imgtop($imgTopOut, 'ajax-imgtop1');
print_imgtop($imgTopIn, 'ajax-imgtop2');
echo " |
\n";
echo '
' . "\n";
print_full_line();
/* отобразим таблицу содержащую статистику */
echo '' . "\n";
echo '| ' .
'Сводные данные | |
\n";
if (SESS_TYPE === 'admin') {
echo '' .
'' .
'Статистика по месяцам > ' .
'" . make_month($year, $month, $day) .
' > Хост ' . USER_NAME . " |
\n";
} else if (SESS_TYPE === 'guest') {
echo 'Хост ' .
USER_NAME . " |
\n";
}
echo '';
$endDate = date('t', PERIOD);
for ($i = 1; $i <= $endDate; $i++) {
if ($i != PERIOD_DAY) {
echo '$i ";
} else {
echo "[$i] ";
}
}
if (PERIOD_DAY) {
echo 'все |
\n";
} else {
echo "[все]\n";
}
echo ' | ' .
'udp трафик | ' .
'tcp трафик | ' .
'суммарный трафик |
' . "\n";
echo '';
print_data("Номер", "head0", "th");
print_data('', 'head0', 'th');
print_data(make_sort_link("Сервер", "server"), "head1", "th");
print_data(make_sort_link("Отправлено", "udpOut"), "head1", "th");
print_data(make_sort_link("Получено", "udpIn"), "head1", "th");
print_data(make_sort_link("Отправлено", "tcpOut"), "head1", "th");
print_data(make_sort_link("Получено", "tcpIn"), "head1", "th");
print_data(make_sort_link("Отправлено", "allOut"), "head1", "th");
print_data(make_sort_link("Получено", "allIn"), "head1", "th");
echo '
' . "\n";
$count = 0;
$sumUdpOut = $sumUdpIn =
$sumTcpOut = $sumTcpIn =
$sumAllOut = $sumAllIn = 0;
foreach ($dataTraf as $server => $traf) {
$count++;
$sumUdpOut += $traf['udpOut'];
$sumUdpIn += $traf['udpIn'];
$sumTcpOut += $traf['tcpOut'];
$sumTcpIn += $traf['tcpIn'];
$sumAllOut += $traf['allOut'];
$sumAllIn += $traf['allIn'];
$hostName = long2ip($server);
$linkServer = '' .
make_span($hostName, 'ajax-reverse_ip') . '';
$linkTime = '
';
echo '';
print_data($count, "data0");
print_data($linkTime, 'data0');
print_data($linkServer, "data1");
print_data(val_trun($traf['udpOut']), "data2");
print_data(val_trun($traf['udpIn']), "data2");
print_data(val_trun($traf['tcpOut']), "data2");
print_data(val_trun($traf['tcpIn']), "data2");
print_data(val_trun($traf['allOut']), "data2");
print_data(val_trun($traf['allIn']), "data2");
echo '
' . "\n";
}
echo '';
echo ' | ';
print_data("Итого:", "head4", "th");
print_data(val_trun($sumUdpOut), "head3");
print_data(val_trun($sumUdpIn), "head3");
print_data(val_trun($sumTcpOut), "head3");
print_data(val_trun($sumTcpIn), "head3");
print_data(val_trun($sumAllOut), "head3");
print_data(val_trun($sumAllIn), "head3");
echo '
' . "\n";
echo '
' . "\n";
print_full_line();
/* отобразим информацию о программе */
print_info($queryCount);
print_html_tail();
?>