'Outgoing traffic (udp)',
'inUdp' => 'Incoming traffic (udp)',
'outTcp' => 'Outgoing traffic (tcp)',
'inTcp' => 'Incoming traffic (tcp)',
'out' => 'Outgoing traffic (total)',
'in' => 'Incoming traffic (total)',
'text' => 'undefined'
);
/* определим таблицу из которой необходимо считывать трафик */
if (isset($_GET['period']) && is_numeric($_GET['period'])) {
$tabName = mysql_real_escape_string($_GET['period']);
$result = my_mysql_query("select year from list_traffic where year = '$tabName'");
$line = mysql_fetch_assoc($result);
mysql_free_result($result);
if ($line) {
$tabName = 'traffic_' . $line['year'];
$year = $line['year'];
} else {
message_die("No such statistics for the year '$tabName'. " . make_line(__FILE__, __LINE__));
}
} else {
message_die("Undefined variable 'period'. " . make_line(__FILE__, __LINE__));
}
/* количество месяцев в году */
define('STORAGE_CURRENT_TRAF', 12);
/* определим месяц по которому запрашиваются данные */
if (isset($_GET['period_day']) && is_numeric($_GET['period_day'])) {
$temp = $_GET['period_day'];
if ($temp < 0 || $temp > STORAGE_CURRENT_TRAF)
$temp = 0;
define('PERIOD_DAY', $temp);
} else {
define('PERIOD_DAY', 0);
}
/* получим номер отображаемой страницы */
$page = get_page();
/* получим число строк на одну страницу */
$perPage = get_per_page();
/* Определим флаг сортировки. */
if (isset($_GET['sort']))
$temp = in_array($_GET['sort'], $avlSortCmp) ? $_GET['sort'] : 'in';
else
$temp = 'in';
define('SORT_CMP', $temp);
/*
* Получим данные о трафике по клиентам за заданный период.
*/
/* Определим даты между которыми нужно получать данные */
$beginDate = mktime(0, 0, 0, PERIOD_DAY ? PERIOD_DAY : 1, 1, $year);
$endDate = mktime(0, 0, 0, PERIOD_DAY ? PERIOD_DAY + 1 : 13, 1, $year);
/* получим идентификаторы протокола TCP и UDP */
$idProto = array();
$query = "select name, id from proto where name = 'tcp' || name = 'udp'";
$result = my_mysql_query($query);
while ($line = mysql_fetch_assoc($result))
$idProto[$line['name']] = $line['id'];
mysql_free_result($result);
/*
* Получим данные о трафике.
*/
/* правила для сортировки результата */
$queryTailSort = array(
'text' => '`ip`',
'outUdp' => '`outUdp` desc',
'inUdp' => '`inUdp` desc',
'outTcp' => '`outTcp` desc',
'inTcp' => '`inTcp` desc',
'out' => '`out` desc',
'in' => '`in` desc'
);
$queryGetTraf = "select sql_calc_found_rows srcIp as src, inet_ntoa(srcIp) as ip,
sum(if(pId = ${idProto['tcp']}, inBytes, 0)) as inTcp, sum(if(pId = ${idProto['tcp']}, outBytes, 0)) as outTcp,
sum(if(pId = ${idProto['udp']}, inBytes, 0)) as inUdp, sum(if(pId = ${idProto['udp']}, outBytes, 0)) as outUdp,
sum(inBytes) as `in`, sum(outBytes) as `out` from $tabName where date >= '" . date('Y-m-d', $beginDate) .
"' && date < '" . date('Y-m-d', $endDate) . "' group by src order by " . $queryTailSort[SORT_CMP];
/* функция вставки данных в массив с данными о трафике */
function insert_data(&$array, &$val)
{
$i = $val['src'];
$array[$i]['ip'] = $val['ip'];
$array[$i]['inTcp'] = $val['inTcp'];
$array[$i]['outTcp'] = $val['outTcp'];
$array[$i]['inUdp'] = $val['inUdp'];
$array[$i]['outUdp'] = $val['outUdp'];
$array[$i]['in'] = $val['in'];
$array[$i]['out'] = $val['out'];
}
$numRows = 0;
$dataTraf = data_traf_fill('insert_data', $queryGetTraf, $perPage, $page, $numRows);
/*
* Сформируем линк для картинки суммарного трафика.
*/
$dateArray = array();
$imgDataOut = array();
$imgDataIn = array();
for ($i = 0; $i < STORAGE_CURRENT_TRAF; $i++) {
$dateArray[$i] = date('Y-m-d', mktime(0, 0, 0, 1 + $i, 1, $year));
$imgDataOut[$i] = $imgDataIn[$i] = 0;
}
/* сформируем запрос который возвратит количество трафика за заданные периоды */
$query = 'select case ';
for ($i = 0; isset($dateArray[$i]); $i++) {
$tmpDate = $dateArray[$i];
$query .= "when date >= '$tmpDate' && date < adddate('$tmpDate', interval 1 month) then $i ";
}
$query .= "end as `period`, sum(inBytes) as `in`, sum(outBytes) as `out` from $tabName " .
"where date >= '${dateArray[0]}' && date < adddate('${dateArray[0]}', interval 1 year) " .
"group by `period` order by `period`";
/* получим данные о трафике */
$result = my_mysql_query($query);
while ($line = mysql_fetch_assoc($result)) {
$i = $line['period'];
$imgDataIn[$i] = $line['in'];
$imgDataOut[$i] = $line['out'];
}
mysql_free_result($result);
/* сформируем масив дней месяцев */
$xLabel = array();
for ($i = 1; $i <= STORAGE_CURRENT_TRAF; $i++)
$xLabel[] = urlencode($MONTH_NAMES_IMG[$i]);
/* сформируем линк для графика суммарного трафика */
$imgStatistic = './graph.php?graph=statgraph&leg=' .
urlencode('Outgoing') . '|' . urlencode('Incoming') .
'&xt=' . urlencode('Month') . '&xl=' . implode('|', $xLabel) .
'&data=' . implode(',', $imgDataOut) . '|' . implode(',', $imgDataIn);
/*
* Сформируем линки для картинок топов.
*/
if (SORT_CMP !== 'text') {
/* сформируем параметры в зависимости от сортировки */
switch (SORT_CMP) {
case 'outUdp':
case 'inUdp':
$keyOut = 'outUdp';
$titleOut = $arrImgTopTitle['outUdp'];
$keyIn = 'inUdp';
$titleIn = $arrImgTopTitle['inUdp'];
break;
case 'outTcp':
case 'inTcp':
$keyOut = 'outTcp';
$titleOut = $arrImgTopTitle['outTcp'];
$keyIn = 'inTcp';
$titleIn = $arrImgTopTitle['inTcp'];
break;
case 'out':
case 'in':
$keyOut = 'out';
$titleOut = $arrImgTopTitle['out'];
$keyIn = 'in';
$titleIn = $arrImgTopTitle['in'];
break;
default:
message_die("Undefined constant 'SORT_CMP' (" . SORT_CMP . "): " .
make_line(__FILE__, __LINE__));
}
/* получим данные для картинки outTop */
$topLabel = array();
$topData = array();
$tmpData = get_subarray_on_key($dataTraf, $keyOut);
if (SORT_CMP !== $keyOut)
arsort($tmpData);
$i = 0;
foreach ($tmpData as $ip => $byte) {
if (!$byte)
break;
$i++;
if ($i < PIE_SLICE) {
$topLabel[] = urlencode($dataTraf[$ip]['ip']);
$topData[] = $byte;
} else if ($i == PIE_SLICE) {
$topLabel[PIE_SLICE - 1] = urlencode('other');
$topData[PIE_SLICE - 1] = $byte;
} else {
$topData[PIE_SLICE - 1] += $byte;
}
}
/* сформируем линк для картинки outTop */
$imgTopOut = './graph.php?graph=topgraph';
if (isset($topData[0])) {
$imgTopOut .= '&title=' . urlencode($titleOut) . '&leg=' .
implode('|', $topLabel) . '&data=' . implode(',', $topData);
}
/* получим данные для картинки inTop */
$topLabel = array();
$topData = array();
$tmpData = get_subarray_on_key($dataTraf, $keyIn);
if (SORT_CMP !== $keyIn)
arsort($tmpData);
$i = 0;
foreach ($tmpData as $ip => $byte) {
if (!$byte)
break;
$i++;
if ($i < PIE_SLICE) {
$topLabel[] = urlencode($dataTraf[$ip]['ip']);
$topData[] = $byte;
} else if ($i == PIE_SLICE) {
$topLabel[PIE_SLICE - 1] = urlencode('other');
$topData[PIE_SLICE - 1] = $byte;
} else {
$topData[PIE_SLICE - 1] += $byte;
}
}
/* сфорсируем линк для картинки inTop */
$imgTopIn = './graph.php?graph=topgraph';
if (isset($topData[0])) {
$imgTopIn .= '&title=' . urlencode($titleIn) . '&leg=' .
implode('|', $topLabel) . '&data=' . implode(',', $topData);
}
} else {
$imgTopOut = './graph.php?graph=topgraph';
$imgTopIn = './graph.php?graph=topgraph';
}
/* формирует ссылку для линков сортировки данных */
function make_sort_link($val, $sort)
{
global $year, $page, $perPage;
if ($sort != SORT_CMP) {
$link = '$val";
} else {
$link = $val;
}
return $link;
}
/**
* Отобразим страницу.
*/
/* Строковое представление отбражаемого периода */
$temp = getdate($beginDate);
$strPeriod = PERIOD_DAY ? make_month($temp['year'], $temp['mon']) : "${temp['year']} год";
/* заголовок страницы */
$title = "Статистика за $strPeriod";
print_html_head("$title - $prog_name $prog_version (" . ACC_NAME . ")");
/* отобразим название продукта */
print_head();
/* отобразим графики содержащие статистику */
echo '
' . "\n";
echo '';
print_login();
echo " |
\n";
echo "$title |
\n";
echo " |
\n";
echo '';
echo '';
echo ' |
' . "\n";
echo '';
echo "";
echo "";
echo " |
\n";
echo '
' . "\n";
print_full_line();
/*
* Отобразим таблицу содержащую статистику.
*/
echo '' . "\n";
/* дополнительная статистика */
echo '| ' .
'Топ-лист серверов | |
\n";
/* навигация по статистики */
echo '' .
'' . 'Главная > ' .
"$year год > ";
if (PERIOD_DAY)
echo $MONTH_NAMES['full'][PERIOD_DAY];
else
echo "Суммарно";
echo " |
\n";
/* разбиение на страницы */
$pageStr = make_string_link_page('./index.php?content=' . CONTENT .
"&period=$year&period_day=" . PERIOD_DAY . '&sort=' . SORT_CMP,
$page, $perPage, $numRows);
echo '';
print_data($pageStr, 'navigation', 'td', 8);
echo "
\n";
/* выбор месяца */
echo '';
for ($i = 1; $i <= STORAGE_CURRENT_TRAF; $i++) {
if ($i != PERIOD_DAY) {
echo '" . $MONTH_NAMES['short'][$i] . ' ';
} else {
echo '[' . $MONTH_NAMES['short'][$i] . '] ';
}
}
if (PERIOD_DAY) {
echo 'все";
} else {
echo "[все]";
}
echo " |
\n";
/* таблица с данными */
echo ' | ' .
'udp трафик | ' .
'tcp трафик | ' .
'суммарный трафик |
' . "\n";
echo '';
print_data("Номер", "head0", "th");
print_data(make_sort_link("Хост", "text"), "head1", "th");
print_data(make_sort_link("Отправлено", "outUdp"), "head1", "th");
print_data(make_sort_link("Получено", "inUdp"), "head1", "th");
print_data(make_sort_link("Отправлено", "outTcp"), "head1", "th");
print_data(make_sort_link("Получено", "inTcp"), "head1", "th");
print_data(make_sort_link("Отправлено", "out"), "head1", "th");
print_data(make_sort_link("Получено", "in"), "head1", "th");
echo '
' . "\n";
$count = $page * $perPage;
$sumUdpOut = $sumUdpIn =
$sumTcpOut = $sumTcpIn =
$sumAllOut = $sumAllIn = 0;
foreach ($dataTraf as $src => $traf) {
$count++;
$sumUdpOut += $traf['outUdp'];
$sumUdpIn += $traf['inUdp'];
$sumTcpOut += $traf['outTcp'];
$sumTcpIn += $traf['inTcp'];
$sumAllOut += $traf['out'];
$sumAllIn += $traf['in'];
$linkUser = '${traf['ip']}";
echo '';
print_data($count, "data0");
print_data($linkUser, "data1");
print_data(val_trun($traf['outUdp']), "data2");
print_data(val_trun($traf['inUdp']), "data2");
print_data(val_trun($traf['outTcp']), "data2");
print_data(val_trun($traf['inTcp']), "data2");
print_data(val_trun($traf['out']), "data2");
print_data(val_trun($traf['in']), "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 '';
print_data($pageStr, 'navigation', 'td', 8);
echo "
\n";
echo '
' . "\n";
print_full_line();
/* отобразим информацию о программе */
print_info();
print_html_tail();
?>