'Outgoing traffic', 'in' => 'Incoming traffic' ); /* определим таблицу из которой необходимо считывать трафик */ 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); } /* получим номер отображаемой страницы переданной через 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 = mktime(0, 0, 0, PERIOD_DAY ? PERIOD_DAY : 1, 1, $year); $endDate = mktime(0, 0, 0, PERIOD_DAY ? PERIOD_DAY + 1 : 13, 1, $year); /* * Получим данные о трафике по удаленным серверам. */ /* правила для сортировки результата */ $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 < 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['out']; $imgDataOut[$i] = $line['in']; } 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(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 $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 . ")", 'reverse_ip'); /* отобразим название продукта */ print_head(); /* отобразим графики содержащие статистику */ echo "
\n"; echo '\n"; echo "\n"; echo "\n"; echo '' . "\n"; echo '\n"; echo "
'; print_login(); echo "

$title

'; echo 'traffic statistics'; echo '
'; print_imgtop($imgTopOut, 'ajax-imgtop1'); print_imgtop($imgTopIn, 'ajax-imgtop2'); echo "
\n"; print_full_line(); /* * Отобразим таблицу содержащую статистику. */ echo "
\n"; /* навигация по статистике */ 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 '\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 .= "'; } $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 '
'; 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"; print_full_line(); /* отобразим информацию о программе */ print_info(); print_html_tail(); ?>