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); /* Определим пользователя по которому запрашивается статистика */ if (isset($_GET['user']) && is_numeric($_GET['user'])) { $temp = mysql_real_escape_string($_GET['user']); define('USER', $temp); define('USER_NAME', long2ip($temp)); } else { message_die("Undefined variable 'user'. " . make_line(__FILE__, __LINE__)); } /* Определим удаленный сервер по которому запрашивается статистика */ if (isset($_GET['server']) && is_numeric($_GET['user'])) { $temp = mysql_real_escape_string($_GET['server']); define('SERVER', $temp); define('SERVER_NAME', long2ip($temp)); } else { message_die("Undefined variable 'server'. " . make_line(__FILE__, __LINE__)); } /* * Получим данные о трафике клиента к данному серверу. */ /* Определим даты между которыми нужно получать данные */ $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); /* получим идентификаторы протоколов */ $idProto = array(); $nameProto = array(); $query = "select name, id from proto"; $result = my_mysql_query($query); while ($line = mysql_fetch_assoc($result)) { $idProto[$line['name']] = $line['id']; $nameProto[$line['id']] = $line['name']; } mysql_free_result($result); /* * Получим данные о трафике. */ /* правила для сортировки результата */ $queryTailSort = array( 'text' => '`port`', 'out' => '`out` desc', 'in' => '`in` desc' ); $queryGetTraf = "select sql_calc_found_rows dstPort as port, pId as proto, 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 . "' && dstIp = '" . SERVER . "' group by proto, port order by " . $queryTailSort[SORT_CMP]; /* функция вставки данных в массив с данными о трафике */ function insert_data(&$array, &$val) { $array[] = $val; } $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) " . "&& srcIp = '" . USER . "' && dstIp = '" . SERVER . "' 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); /* формирует ссылку для линков сортировки данных */ function make_sort_link($val, $sort) { global $year, $page, $perPage; if ($sort != SORT_CMP) { $link = ' $portStr EOF; return $str; } /** * Отобразим страницу. */ /* Строковое представление отбражаемого периода */ $temp = getdate($beginDate); $strPeriod = PERIOD_DAY ? make_month($temp['year'], $temp['mon']) : "${temp['year']} год"; /* заголовок страницы */ $title = "Статистика за $strPeriod"; print_html_head("$title: Хост " . USER_NAME . ', Сервер ' . SERVER_NAME . " - $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

Хост ' . USER_NAME . ', Сервер ' . make_span(SERVER_NAME, 'ajax-reverse_ip') . "

'; echo 'traffic statistics'; echo '
' . "\n"; print_full_line(); /* * Отобразим таблицу содержащую статистику. */ echo '
' . "\n"; /* навигация по статистике */ echo '\n"; /* разбиение на страницы */ $pageStr = make_string_link_page('./index.php?content=' . CONTENT . '&user=' . USER . '&server=' . SERVER . "&period=$year&period_day=" . PERIOD_DAY . '&sort=' . SORT_CMP, $page, $perPage, $numRows); echo ''; print_data($pageStr, 'navigation', 'td', 4); echo "\n"; /* выбор месяца */ echo '\n"; /* таблица с данными */ echo ''; print_data("Номер", "head0", "th"); print_data(make_sort_link("Протокол", "text"), "head1", "th"); print_data(make_sort_link("Отправлено", "out"), "head1", "th"); print_data(make_sort_link("Получено", "in"), "head1", "th"); echo '' . "\n"; $sumAllOut = $sumAllIn = 0; for ($i = 0, $count = $page * $perPage + 1; isset($dataTraf[$i]); $i++, $count++) { $linkFlags = 0; list($port, $proto, $out, $in) = array($dataTraf[$i]['port'], $dataTraf[$i]['proto'], $dataTraf[$i]['out'], $dataTraf[$i]['in']); $sumAllOut += $out; $sumAllIn += $in; /* * Поле 'Протокол' имеет следующие форматы: * udp:53 (domain) * tcp:80 (http) * icmp */ $strBuff = $nameProto[$proto]; if ($port) $strBuff .= ":$port"; if ($port && ($proto == $idProto['tcp'] || $proto == $idProto['udp'])) { $serviceName = getservbyport($port, $nameProto[$proto]); if ($serviceName) $strBuff .= " ($serviceName)"; } if ($proto == $idProto['tcp']) { if ($port == 21) $strBuff = make_service_link('ftp', SERVER_NAME, $strBuff); else if ($port == 80) $strBuff = make_service_link('http', SERVER_NAME, $strBuff); else if ($port == 443) $strBuff = make_service_link('https', SERVER_NAME, $strBuff); } echo ''; print_data($count, 'data0'); print_data($strBuff, 'data1'); print_data(val_trun($out), 'data2'); print_data(val_trun($in), 'data2'); echo "\n"; } echo ''; echo ''; print_data("Итого:", "head4", "th"); 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(); ?>