'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'
);
/* установим имя таблицы откуда считываются данные */
$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__));
}
/* получим номер отображаемой страницы */
$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);
/* Определим пользователя по которому запрашивается статистика */
if (isset($_GET['user']) && is_numeric($_GET['user'])) {
$temp = mysql_real_escape_string($_GET['user']);
define('USER', $temp);
define('USER_NAME', long2ip($temp));
} else {
define('USER', $remote_addr);
define('USER_NAME', long2ip($remote_addr));
}
/*
* Получим данные о трафике по клиенту за заданный период.
*/
/* Получим даты между которыми нужно получать данные */
$beginDate = 0;
$endDate = 0;
$minDateStorage = 0;
mktime_period_date($beginDate, $endDate, $minDateStorage);
/* получим идентификаторы протокола 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 dstIp as dst, inet_ntoa(dstIp) 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) . "' && srcIp = '" . USER . "' group by dst order by " .
$queryTailSort[SORT_CMP];
/* функция вставки данных в массив с данными о трафике */
function insert_data(&$array, &$val)
{
$i = $val['dst'];
$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 < 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 .= "&& srcIp = '" . USER . "' 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();
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);
/*
* Сформируем линки для картинок топов.
*/
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 $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: Хост " . USER_NAME .
" - $prog_name $prog_version (" . ACC_NAME . ")", 'reverse_ip');
/* отобразим название продукта */
print_head();
/* отобразим графики содержащие статистику */
echo '
' . "\n";
echo '';
print_login();
echo " |
\n";
echo "$title |
\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 '' .
'' .
'Главная > ';
if (SESS_TYPE === 'admin') {
echo '$strPeriod > ";
}
echo 'Хост ' . USER_NAME . " |
\n";
/* разбиение на страницы */
$pageStr = make_string_link_page('./index.php?content=' . CONTENT . '&user=' . USER .
'&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 ' | ' .
'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 $server => $traf) {
$count++;
$sumUdpOut += $traf['outUdp'];
$sumUdpIn += $traf['inUdp'];
$sumTcpOut += $traf['outTcp'];
$sumTcpIn += $traf['inTcp'];
$sumAllOut += $traf['out'];
$sumAllIn += $traf['in'];
$linkServer = '" .
make_span($traf['ip'], 'ajax-reverse_ip') . '';
echo '';
print_data($count, "data0");
print_data($linkServer, "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();
?>