'Outgoing traffic (udp)',
'udpIn' => 'Incoming traffic (udp)',
'tcpOut' => 'Outgoing traffic (tcp)',
'tcpIn' => 'Incoming traffic (tcp)',
'allOut' => 'Outgoing traffic (total)',
'allIn' => 'Incoming traffic (total)'
);
/* Определим флаг сортировки. */
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));
define('END_DATE', get_end_date(BEGIN_DATE));
/* Сформируем массив дат между которыми будет формироваться статистика */
list($y, $m, $d) = split('-', BEGIN_DATE);
$dateBegin = mktime(0, 0, 0, $m, $d, $y);
list($y, $m, $d) = split('-', END_DATE);
$dateEnd = mktime(0, 0, 0, $m, $d, $y);
$dateDayArray = array();
do {
$dateDayArray[] = date("Y-m-d", $dateBegin);
/* прибавим один день */
$dateBegin += 60 * 60 * 24;
} while ($dateBegin < $dateEnd);
/* Определим пользователя по которому запрашивается статистика. */
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;
}
/* хранят всю сводную статистику */
$dataHourTraf = array();
$sumDayData = array();
$sumHourData = array();
/*
* Запрос устанавливает переменную '@proto' используемую в дальнейших запросах
* для идентификации протокола, по которому идет запрос.
* Внимание, после вызова команды musql_close, данная переменная
* больше не доступна.
*/
$querySetProto = 'select @proto := id from proto where name = "%PROTO%"';
/*
* Запросы возвращающие количество прошедшего трафика за заданный период
* времени для разных условий сортировки.
*/
/* шаблон замены для запросов */
$ptrnDayTraf = array('/%USER%/', '/%BEGIN_DATE%/', '/%END_DATE%/');
/* запрос для 'udpOut' и 'tcpOut' */
$queryDayPeriodOut = '
select ifnull(sum(psize), 0) as psizeSum
from traffic
where (pId = @proto) && (srcPort = 0) && (srcIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")';
/* запросы для 'udpIn' и 'tcpIn' */
$queryDayPeriodIn = '
select ifnull(sum(psize), 0) as psizeSum
from traffic
where (pId = @proto) && (dstPort = 0) && (dstIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")';
/* запрос для 'allOut' */
$queryDayPeriodAllOut = '
select ifnull(sum(psize), 0) as psizeSum
from traffic
where (srcPort = 0) && (srcIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")';
/* запрос для 'allIn' */
$queryDayPeriodAllIn = '
select ifnull(sum(psize), 0) as psizeSum
from traffic
where (dstPort = 0) && (dstIp = %USER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")';
switch (SORT_CMP) {
case "udpOut":
case "tcpOut":
$queryDayPeriod = $queryDayPeriodOut;
break;
case "udpIn":
case "tcpIn":
$queryDayPeriod = $queryDayPeriodIn;
break;
case "allOut":
$queryDayPeriod = $queryDayPeriodAllOut;
break;
case "allIn":
default:
$queryDayPeriod = $queryDayPeriodAllIn;
break;
}
/* установим в MySQL переменную @proto для запросов использующих протокол */
if (!strcmp(SORT_CMP, "udpOut") || !strcmp(SORT_CMP, "udpIn")) {
$queryTemp = preg_replace('/%PROTO%/', 'udp', $querySetProto);
$result = my_mysql_query($queryTemp);
mysql_free_result($result);
} elseif (!strcmp(SORT_CMP, "tcpOut") || !strcmp(SORT_CMP, "tcpIn")) {
$queryTemp = preg_replace('/%PROTO%/', 'tcp', $querySetProto);
$result = my_mysql_query($queryTemp);
mysql_free_result($result);
}
/* Получим статистику по дням за месяц */
for ($i = 0; $i < 24; $i++)
$sumHourData[$i] = 0;
/* Получим статистику по часам за день */
for ($i = 0; isset($dateDayArray[$i]); $i++) {
list($y, $m, $d) = split('-', $dateDayArray[$i]);
$dateBegin = mktime(0, 0, 0, $m, $d, $y);
$sumDayData[$i] = 0;
for ($j = 0; $j < 24; $j++) {
$tempBegin = date("Y-m-d H:i:s", $dateBegin + $j * 60 * 60);
$tempEnd = date("Y-m-d H:i:s", $dateBegin + ($j + 1) * 60 * 60);
$replacements = array(USER, $tempBegin, $tempEnd);
$queryTemp = preg_replace($ptrnDayTraf, $replacements, $queryDayPeriod);
$result = my_mysql_query($queryTemp);
$line = mysql_fetch_row($result);
$dataHourTraf[$i][] = $line[0];
$sumDayData[$i] += $line[0];
$sumHourData[$j] += $line[0];
mysql_free_result($result);
}
}
/* сформируем линки для графиков */
$imgDay = './graph.php?graph=timegraph&title=' .
urlencode($arrImgTimeTitle[SORT_CMP]) . '&xt=' .
urlencode('Days') . '&data=' . implode(',', $sumDayData);
$imgHour = './graph.php?graph=timegraph&title=' .
urlencode($arrImgTimeTitle[SORT_CMP]) . '&xt=' .
urlencode('Hours') . '&data=' . implode(',', $sumHourData);
/* формирует ссылку для сортировки данных */
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) .
': Хост ' . USER_NAME;
print_html_head($title);
/* отобразим название продукта */
print_head();
/* отобразим график содержащий статистику */
echo "
\n";
echo '';
print_login();
echo " |
\n";
echo 'Сводная статистика за ' .
make_month($year, $month) . " |
\n";
echo 'Хост ' . USER_NAME . " |
\n";
echo " |
\n";
echo " |
\n";
echo " |
\n";
echo "
\n";
print_full_line();
/* отобразим таблицу содержащую статистику */
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 '';
print_data("", "page");
print_data("udp трафик", "head2", "th", 8);
print_data("tcp трафик", "head2", "th", 8);
print_data("суммарный трафик", "head2", "th", 8);
print_data("", "page");
echo "
\n";
echo '';
print_data("", "page");
print_data(make_sort_link("Отправлено", "udpOut"), "head1", "th", 4);
print_data(make_sort_link("Получено", "udpIn"), "head1", "th", 4);
print_data(make_sort_link("Отправлено", "tcpOut"), "head1", "th", 4);
print_data(make_sort_link("Получено", "tcpIn"), "head1", "th", 4);
print_data(make_sort_link("Отправлено", "allOut"), "head1", "th", 4);
print_data(make_sort_link("Получено", "allIn"), "head1", "th", 4);
print_data("", "page");
echo "
\n";
echo '';
print_data("Дата", "head0", "th");
for ($i = 1; $i <= 24; $i++)
print_data($i, "head0");
print_data("Всего", "head0", "th");
echo "
\n";
for ($i = 0; isset($dateDayArray[$i]); $i++) {
list($y, $m, $d) = split('-', $dateDayArray[$i]);
$linkData = '' . date("d/m/Y", mktime(0, 0, 0, $m, $d, $y)) . '';
echo '';
print_data($linkData, "data0");
for ($j = 0; $j < 24; $j++)
print_data(val_trun($dataHourTraf[$i][$j]), "data2");
print_data(val_trun($sumDayData[$i]), "head3");
echo "
\n";
}
echo '';
print_data("Итого:", "head4", "th");
$sumAll = 0;
for ($i = 0; $i < 24; $i++) {
$sumAll += $sumHourData[$i];
print_data(val_trun($sumHourData[$i]), "head3");
}
print_data(val_trun($sumAll), "head3");
echo "
\n";
echo "
\n";
print_full_line();
/* отобразим информацию о программе */
print_info($queryCount);
print_html_tail();
?>