'Outgoing traffic',
'in' => 'Incoming traffic'
);
/* установим имя таблицы откуда считываются данные */
$tabName = 'traffic_cur';
/* получим количество дней хранения трафика */
$query = "select value from config where name = 'storage_current_traf'";
$result = my_mysql_query($query);
$line = mysql_fetch_assoc($result);
mysql_free_result($result);
if ($line) {
if (ctype_digit($line['value'])) {
/* количество суток которое хранится трафик */
define('STORAGE_CURRENT_TRAF', $line['value']);
/* Определим запрашиваемый день статистики */
define('PERIOD_DAY', get_period_day(STORAGE_CURRENT_TRAF));
/*
* Если задан конкретный день по статистике, то 'PERIOD'
* уже равен не дням а количеству часов в сутках (24 часа).
*/
define('PERIOD', (PERIOD_DAY) ? 24 : STORAGE_CURRENT_TRAF);
} else {
message_die("Not valid variable 'value' = '${line['value']}': " . make_line(__FILE__, __LINE__));
}
} else {
message_die("Undefined variable 'value'. " . make_line(__FILE__, __LINE__));
}
/* получим номер отображаемой страницы переданной через GET */
$page = get_page();
/* получим число строк на одну страницу переданные через GET */
$perPage = get_per_page();
/* определим флаг сортировки */
if (isset($_GET['sort']))
$temp = in_array($_GET['sort'], $avlSortCmp) ? $_GET['sort'] : 'out';
else
$temp = 'out';
define('SORT_CMP', $temp);
/*
* Получим данные о трафике по серверам за заданный период.
*/
/* Получим даты между которыми нужно получать данные */
$beginDate = 0;
$endDate = 0;
$minDateStorage = 0;
mktime_period_date($beginDate, $endDate, $minDateStorage);
/*
* Получим данные о трафике по удаленным сервера.
*/
/* правила для сортировки результата */
$queryTailSort = array(
'out' => '`in` desc',
'in' => '`out` desc'
);
$queryGetTraf = "select sql_calc_found_rows inet_ntoa(dstIp) as dst, 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 dstIp order by " . $queryTailSort[SORT_CMP];
/* функция вставки данных в массив с данными о трафике */
function insert_data(&$array, &$val)
{
$i = $val['dst'];
$array[$i]['in'] = $val['in'];
$array[$i]['out'] = $val['out'];
}
$numRows = 0;
$dataTraf = data_traf_fill('insert_data', $queryGetTraf, $perPage, $page, $numRows);
/* получим список клиентов которые запрашивали данные сервера */
function my_ip2long($ip)
{
return sprintf("%u", ip2long($ip));
}
if (count($dataTraf)) {
$query = "select inet_ntoa(dstIp) as dst, srcIp as src, inet_ntoa(srcIp) as ip from $tabName
where date >= '" . date('Y-m-d', $beginDate) . "' && date < '" . date('Y-m-d', $endDate) . "' &&
dstIp in (" . implode(',', array_map('my_ip2long', array_keys($dataTraf))) . ') group by dstIp, srcIp';
$result = my_mysql_query($query);
while ($line = mysql_fetch_assoc($result)) {
$i = $line['dst'];
$dataTraf[$i]['src'][] = $line['src'];
$dataTraf[$i]['ip'][] = $line['ip'];
}
mysql_free_result($result);
}
/*
* Сформируем линк для картинки суммарного трафика.
*/
$dateArray = array();
$imgDataOut = array();
$imgDataIn = array();
for ($i = 0; $i < PERIOD; $i++) {
$dateArray[$i] = PERIOD_DAY ?
date('Y-m-d H:i:s', mktime(date('H', $beginDate) + $i, 0, 0,
date('m', $beginDate), date('d', $beginDate), date('Y', $beginDate))) :
date('Y-m-d', mktime(0, 0, 0, date('m', $beginDate), date('d', $beginDate) + $i, date('Y', $beginDate)));
$imgDataOut[$i] = $imgDataIn[$i] = 0;
}
/* сформируем запрос который возвратит количество трафика за заданные периоды */
$query = 'select case ';
for ($i = 0; isset($dateArray[$i]); $i++) {
$tmpDate = $dateArray[$i];
$query .= (PERIOD_DAY) ?
"when date >= '$tmpDate' && date < adddate('$tmpDate', interval 1 hour) then $i " :
"when date >= '$tmpDate' && date < adddate('$tmpDate', interval 1 day) then $i ";
}
$query .= "end as `period`, sum(inBytes) as `in`, sum(outBytes) as `out` from $tabName ";
$query .= (PERIOD_DAY) ?
"where date >= '${dateArray[0]}' && date < adddate('${dateArray[0]}', interval 1 day) " :
"where date >= '${dateArray[0]}' && date < adddate('${dateArray[0]}', interval " . PERIOD . ' day) ';
$query .= "group by `period` order by `period`";
/* получим данные о трафике */
$result = my_mysql_query($query);
while ($line = mysql_fetch_assoc($result)) {
$i = $line['period'];
$imgDataIn[$i] = $line['out'];
$imgDataOut[$i] = $line['in'];
}
mysql_free_result($result);
/* сформируем масив дней месяцев */
$xLabel = array();
if (PERIOD_DAY) {
for ($i = 1; $i <= PERIOD; $i++)
$xLabel[] = $i;
} else {
$t = $minDateStorage;
for ($i = 0; $i < PERIOD; $i++)
$xLabel[] = date('j', mktime(0, 0, 0, date('m', $t), date('d', $t) + $i, date('Y', $t)));
}
/* сформируем линк для графика суммарного трафика */
$imgStatistic = './graph.php?graph=statgraph&leg=' .
urlencode('Outgoing') . '|' . urlencode('Incoming') .
'&xt=' . urlencode(PERIOD_DAY ? 'Hours' : 'Days') .
'&xl=' . implode('|', $xLabel) .
'&data=' . implode(',', $imgDataOut) . '|' . implode(',', $imgDataIn);
/*
* Сформируем линки для картинок топов.
*/
/* формируем данные для outTop */
$topLabel = array();
$topData = array();
$tmpData = get_subarray_on_key($dataTraf, 'in');
if (SORT_CMP !== 'out')
arsort($tmpData);
$i = 0;
foreach ($tmpData as $ip => $byte) {
if (!$byte)
break;
$i++;
if ($i < PIE_SLICE) {
$topLabel[] = urlencode($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($arrImgTopTitle['out']) . '&leg=' .
implode('|', $topLabel) . '&data=' . implode(',', $topData);
}
/* формируем данные для inTop */
$topLabel = array();
$topData = array();
$tmpData = get_subarray_on_key($dataTraf, 'out');
if (SORT_CMP !== 'in')
arsort($tmpData);
$i = 0;
foreach ($tmpData as $ip => $byte) {
if (!$byte)
break;
$i++;
if ($i < PIE_SLICE) {
$topLabel[] = urlencode($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($arrImgTopTitle['in']) . '&leg=' .
implode('|', $topLabel) . '&data=' . implode(',', $topData);
}
/* формирует ссылки для сортировки данных */
function make_sort_link($val, $sort)
{
global $page, $perPage;
if ($sort != SORT_CMP) {
$link = '$val";
} else {
$link = $val;
}
return $link;
}
/**
* Отобразим страницу.
*/
/* Строковое представление отбражаемого периода */
$temp = getdate($beginDate);
$strPeriod = make_month($temp['year'], $temp['mon'], $temp['mday']);
if (!PERIOD_DAY) {
$temp = getdate(mktime(0, 0, 0, date('m', $endDate), date('d', $endDate) - 1, date('Y', $endDate)));
$strPeriod .= ' - ' . make_month($temp['year'], $temp['mon'], $temp['mday']);
}
/* заголовок страницы */
$title = "Топ-лист серверов за $strPeriod";
print_html_head("$title - $prog_name $prog_version (" . ACC_NAME . ")", 'reverse_ip');
/* отобразим название продукта */
print_head();
/* отобразим графики содержащие статистику */
echo "
\n";
echo '';
print_login();
echo " |
\n";
echo "$title |
\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 '' .
'Главная > ' .
'$strPeriod > Топ-лист серверов |
\n";
/* разбиение на страницы */
$pageStr = make_string_link_page('./index.php?content=' . CONTENT .
"&period_day=" . PERIOD_DAY . '&sort=' . SORT_CMP,
$page, $perPage, $numRows);
echo '';
print_data($pageStr, 'navigation', 'td', 8);
echo "
\n";
/* выбор месяца */
$t = $minDateStorage;
echo '';
for ($i = 1; $i <= STORAGE_CURRENT_TRAF; $i++) {
$tempDate = mktime(0, 0, 0, date('m', $t), date('d', $t) + ($i - 1), date('Y', $t));
if ($i != PERIOD_DAY) {
echo '" . date('j', $tempDate) . ' ';
} else {
echo '[' . date('j', $tempDate) . '] ';
}
}
if (PERIOD_DAY) {
echo 'все";
} else {
echo "[все]";
}
echo " |
\n";
/* таблица с данными */
echo '';
print_data('Номер', 'head0', 'th');
print_data('Сервер', 'head0', 'th');
print_data('Хосты', 'head0', 'th');
print_data(make_sort_link('Отправлено', 'out'), 'head1', 'th');
print_data(make_sort_link('Получено', 'in'), 'head1', 'th');
echo "
\n";
$count = $page * $perPage;
$sumAllOut = $sumAllIn = 0;
foreach ($dataTraf as $server => $val) {
$count++;
$sumAllOut += $val['in'];
$sumAllIn += $val['out'];
$lstUsers = '';
for ($i = 0; isset($val['src'][$i]); $i++) {
$src = $val['src'][$i];
$ip = $val['ip'][$i];
$lstUsers .= "$ip";
$lstUsers .= (($i + 1) % 5) ? ', ' : ',
';
}
$lstUsers = preg_replace('/,(\s|
)$/', '', $lstUsers);
echo '';
print_data($count, 'data0');
print_data(make_span($server, 'ajax-reverse_ip'), 'data1');
print_data($lstUsers, 'data1');
print_data(val_trun($val['in']), 'data2');
print_data(val_trun($val['out']), 'data2');
echo "
\n";
}
echo '';
print_data('', 'page');
print_data("Итого:", "head4", "th", 2);
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();
?>