'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 '\n"; echo "\n"; echo '\n"; echo "\n"; echo '' . "\n"; echo '\n"; echo '
'; print_login(); echo "

$title

Хост ' . USER_NAME . "

'; 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 . '&user=' . USER . '&period_day=' . PERIOD_DAY . '&sort=' . SORT_CMP, $page, $perPage, $numRows); echo ''; print_data($pageStr, 'navigation', 'td', 8); echo "\n"; /* выбор дня месяца */ $t = $minDateStorage; echo '\n"; /* таблица с данными */ echo '' . '' . '' . '' . "\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 '
'; 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 "
udp трафикtcp трафиксуммарный трафик
' . "\n"; print_full_line(); /* отобразим информацию о программе */ print_info(); print_html_tail(); ?>