'Outgoing traffic (udp)', 'udpIn' => 'Incoming traffic (udp)', 'tcpOut' => 'Outgoing traffic (tcp)', 'tcpIn' => 'Incoming traffic (tcp)', 'allOut' => 'Outgoing traffic (total)', 'allIn' => 'Incoming traffic (total)', 'server' => 'undefined' ); /* Определим флаг сортировки. */ if (isset($_GET['sort'])) $temp = in_array($_GET['sort'], $avlSortCmp) ? $_GET['sort'] : 'allIn'; else $temp = 'allIn'; define('SORT_CMP', $temp); /* Определим запрашиваемый месяц */ define('PERIOD', get_period()); /* Определим запрашиваемый день месяца */ define('PERIOD_DAY', get_period_day()); /* Сформируем даты, между которыми будет формироваться статистика. */ define('BEGIN_DATE', get_begin_date(PERIOD, PERIOD_DAY)); define('END_DATE', get_end_date(BEGIN_DATE, PERIOD_DAY)); /* Определим пользователя по которому запрашивается статистика. */ if (isset($_GET['user'])) { $temp = mysql_real_escape_string($_GET['user']); define('USER', $temp); define('USER_NAME', long2ip(USER)); } else { message_die("Undefined variable 'user'."); } /* количество запросов к базе */ $queryCount = 0; function my_mysql_query($query) { global $queryCount; $queryCount++; $result = mysql_query($query) or message_die("Query failed: " . mysql_error()); return $result; } /* получим статистику клиента за период */ $dataTraf = array(); $patternsQueryTraf = array('/%USER%/', '/%BEGIN_DATE%/', '/%END_DATE%/'); /* * Запрос устанавливает переменную '@proto' используемую в дальнейших запросах * для идентификации протокола, по которому идет запрос. * Внимание, после вызова команды musql_close, данная переменная * больше не доступна. */ $querySetProto = 'select @proto := id from proto where name = "%PROTO%"'; /* * Запрос восзвращает список посещаемых серверов клиентом и количество * полученного трафика от него по заданному протоколу и за заданный период. */ $queryTraf = 'select out.dstIp as server, out.trafOut as trafOut, in.trafIn as trafIn from ( select dstIp, sum(psize) as trafOut from traffic where (pId = @proto) && (srcPort = 0) && (srcIp = %USER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") group by dstIp ) as `out` join ( select srcIp, sum(psize) as trafIn from traffic where (pId = @proto) && (dstPort = 0) && (dstIp = %USER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") group by srcIp ) as `in` on out.dstIp = in.srcIp union all select out.dstIp as server, out.trafOut as trafOut, ifnull(in.trafIn,0) as trafIn from ( select dstIp, sum(psize) as trafOut from traffic where (pId = @proto) && (srcPort = 0) && (srcIp = %USER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") group by dstIp ) as `out` left outer join ( select srcIp, sum(psize) as trafIn from traffic where (pId = @proto) && (dstPort = 0) && (dstIp = %USER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") group by srcIp ) as `in` on out.dstIp = in.srcIp where in.srcIp is null union all select in.srcIp as server, ifnull(out.trafOut,0) as trafOut, in.trafIn as trafIn from ( select dstIp, sum(psize) as trafOut from traffic where (pId = @proto) && (srcPort = 0) && (srcIp = %USER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") group by dstIp ) as `out` right outer join ( select srcIp, sum(psize) as trafIn from traffic where (pId = @proto) && (dstPort = 0) && (dstIp = %USER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") group by srcIp ) as `in` on out.dstIp = in.srcIp where out.dstIp is null'; /* установим в MySQL переменную @proto для протокола UDP */ $queryTemp = preg_replace('/%PROTO%/', 'udp', $querySetProto); $result = my_mysql_query($queryTemp); mysql_free_result($result); /* Формируем статистику запрошеных адресов по протоколу UDP. */ $replacements = array(USER, BEGIN_DATE, END_DATE); $queryTemp = preg_replace($patternsQueryTraf, $replacements, $queryTraf); $result = my_mysql_query($queryTemp); while ($line = mysql_fetch_assoc($result)) { $index = $line['server']; $dataTraf[$index]['udpOut'] = $line['trafOut']; $dataTraf[$index]['udpIn'] = $line['trafIn']; } mysql_free_result($result); /* установим в MySQL переменную @proto для протокола TCP */ $queryTemp = preg_replace('/%PROTO%/', 'tcp', $querySetProto); $result = my_mysql_query($queryTemp); mysql_free_result($result); /* Формируем статистику запрошенных адресов по протоколу TCP. */ $replacements = array(USER, BEGIN_DATE, END_DATE); $queryTemp = preg_replace($patternsQueryTraf, $replacements, $queryTraf); $result = my_mysql_query($queryTemp); while ($line = mysql_fetch_assoc($result)) { $index = $line['server']; $dataTraf[$index]['tcpOut'] = $line['trafOut']; $dataTraf[$index]['tcpIn'] = $line['trafIn']; } mysql_free_result($result); /* Получим статистику за период суммарного трафика */ $patternsQueryPeriod = array("/%USER%/", "/%BEGIN_DATE%/", "/%END_DATE%/"); /* сформируем массив данных для построения графика */ $dateBeginArray = array(); $dateEndArray = array(); list($year, $month, $day) = split('-', BEGIN_DATE); $initDate = mktime(0, 0, 0, $month, $day, $year); list($year, $month, $day) = split('-', END_DATE); $endDate = mktime(0, 0, 0, $month, $day, $year); while ($initDate < $endDate) { $tempDate = date("Y-m-d H:i:s", $initDate); $dateBeginArray[] = $tempDate; list($date, $time) = split(' ', $tempDate); list($year, $month, $day) = split('-', $date); list($h, $m, $s) = split(':', $time); $initDate = PERIOD_DAY ? mktime($h + 1, 0, 0, $month, $day, $year) : mktime(0, 0, 0, $month, $day + 1, $year); $dateEndArray[] = date("Y-m-d H:i:s", $initDate); } /* Запрос возвращает количество прошедшего трафика за заданный период. */ $queryPeriod = ' select ifnull(out.psizeSum,0) as outTraf, ifnull(in.psizeSum,0) as inTraf from ( select sum(psize) as psizeSum from traffic where (srcPort = 0) && (srcIp = %USER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") ) as `out` join ( select sum(psize) as psizeSum from traffic where (dstPort = 0) && (dstIp = %USER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") ) as `in`'; $imgDataOut = array(); $imgDataIn = array(); for ($i = 0; isset($dateBeginArray[$i]); $i++) { $replacements = array(USER, $dateBeginArray[$i], $dateEndArray[$i]); $queryTemp = preg_replace($patternsQueryPeriod, $replacements, $queryPeriod); $result = my_mysql_query($queryTemp); $line = mysql_fetch_assoc($result); $imgDataOut[] = $line['outTraf']; $imgDataIn[] = $line['inTraf']; mysql_free_result($result); } /* сформируем линк для графика суммарного трафика */ $imgUser = './graph.php?graph=statgraph&leg=' . urlencode('Sent') . '|' . urlencode('Received') . '&xt=' . urlencode(PERIOD_DAY ? 'Hours' : 'Days') . '&data=' . implode(',', $imgDataOut) . '|' . implode(',', $imgDataIn); /* Заполним пустые поля в массиве трафика и подсчитаем полный трафик. */ foreach ($dataTraf as $server => $traf) { if (!isset($traf['udpOut'])) { $dataTraf[$server]['udpOut'] = 0; } if (!isset($traf['udpIn'])) { $dataTraf[$server]['udpIn'] = 0; } if (!isset($traf['tcpOut'])) { $dataTraf[$server]['tcpOut'] = 0; } if (!isset($traf['tcpIn'])) { $dataTraf[$server]['tcpIn'] = 0; } $dataTraf[$server]['allOut'] = $dataTraf[$server]['udpOut'] + $dataTraf[$server]['tcpOut']; $dataTraf[$server]['allIn'] = $dataTraf[$server]['udpIn'] + $dataTraf[$server]['tcpIn']; } /* * Функция сортировки данных статистики. * Перед сортировкой должны быть определены глобальные * переменные: * dataTrafCopy - содержит копию сортируемого масива * sortCmp - ключ в ассоциативном массиве по которому идет сортировка */ $dataTrafCopy = $dataTraf; function sort_cmp($a, $b) { if (strcmp(SORT_CMP, 'server')) { global $dataTrafCopy; global $sortCmp; $v1 = $dataTrafCopy[$a][$sortCmp]; $v2 = $dataTrafCopy[$b][$sortCmp]; if ($v1 == $v2) return 0; return ($v1 > $v2) ? -1 : 1; } else { return strcasecmp(long2ip($a), long2ip($b)); } } /* * Сформируем данные для картинки отображающей топ трафика. * Внимание, данные можно формировать только после сортировки * данных о трафике. */ define('PIE_SLICE', 5); function make_top_image($title) { global $dataTraf; global $sortCmp; $topLabel = array(); $topData = array(); $dataTemp = $dataTraf; $i = 0; uksort($dataTemp, 'sort_cmp'); if (strcmp($sortCmp, 'server')) { foreach ($dataTemp as $client => $traf) { if (!$traf[$sortCmp]) break; $i++; if ($i < PIE_SLICE) { $topLabel[] = long2ip($client); $topData[] = $traf[$sortCmp]; } else if ($i == PIE_SLICE) { $topLabel[PIE_SLICE - 1] = urlencode('other'); $topData[PIE_SLICE - 1] = $traf[$sortCmp]; } else { $topData[PIE_SLICE - 1] += $traf[$sortCmp]; } } } /* Сформируем линк для картинки топа трафика */ $imgTop = './graph.php?graph=topgraph'; if (isset($topData[0])) { $imgTop .= '&title=' . urlencode($title) . '&leg=' . implode('|', $topLabel) . '&data=' . implode(',', $topData); } return $imgTop; } switch (SORT_CMP) { case 'udpOut': case 'udpIn': $sortCmpOut = 'udpOut'; $sortCmpIn = 'udpIn'; break; case 'tcpOut': case 'tcpIn': $sortCmpOut = 'tcpOut'; $sortCmpIn = 'tcpIn'; break; case 'allOut': case 'allIn': $sortCmpOut = 'allOut'; $sortCmpIn = 'allIn'; break; default: $sortCmpOut = $sortCmpIn = 'server'; } $sortCmp = $sortCmpOut; $imgTopOut = make_top_image($arrImgTopTitle[$sortCmpOut]); $sortCmp = $sortCmpIn; $imgTopIn = make_top_image($arrImgTopTitle[$sortCmpIn]); /* сортируем данные */ $sortCmp = SORT_CMP; uksort($dataTraf, "sort_cmp"); /* формирует ссылку для сортировки данных */ function make_sort_link($val, $sort) { if ($sort != SORT_CMP) { $link = '' . $val . ''; } else { $link = $val; } return $link; } /** * Отобразим страницу. */ list($year, $month) = split('-', BEGIN_DATE); $day = PERIOD_DAY; $title = 'Статистика за ' . make_month($year, $month, $day) . ': Хост ' . USER_NAME; print_html_head($title, 'reverse_ip'); /* отобразим название продукта */ print_head(); /* отобразим график содержащай статистику */ echo '
' . "\n"; echo '\n"; echo '\n"; echo '\n"; echo "\n"; echo '' . "\n"; echo '\n"; echo '
'; print_login(); echo "

Статистика за ' . make_month($year, $month, $day) . "

Хост ' . USER_NAME . "

'; echo ''; echo '
'; print_imgtop($imgTopOut, 'ajax-imgtop1'); print_imgtop($imgTopIn, 'ajax-imgtop2'); echo "
' . "\n"; print_full_line(); /* отобразим таблицу содержащую статистику */ echo '
' . "\n"; echo '\n"; if (SESS_TYPE === 'admin') { echo '\n"; } else if (SESS_TYPE === 'guest') { echo '\n"; } echo '\n"; } else { echo "[все]\n"; } echo '' . '' . '' . '' . "\n"; echo ''; print_data("Номер", "head0", "th"); print_data('', 'head0', 'th'); print_data(make_sort_link("Сервер", "server"), "head1", "th"); print_data(make_sort_link("Отправлено", "udpOut"), "head1", "th"); print_data(make_sort_link("Получено", "udpIn"), "head1", "th"); print_data(make_sort_link("Отправлено", "tcpOut"), "head1", "th"); print_data(make_sort_link("Получено", "tcpIn"), "head1", "th"); print_data(make_sort_link("Отправлено", "allOut"), "head1", "th"); print_data(make_sort_link("Получено", "allIn"), "head1", "th"); echo '' . "\n"; $count = 0; $sumUdpOut = $sumUdpIn = $sumTcpOut = $sumTcpIn = $sumAllOut = $sumAllIn = 0; foreach ($dataTraf as $server => $traf) { $count++; $sumUdpOut += $traf['udpOut']; $sumUdpIn += $traf['udpIn']; $sumTcpOut += $traf['tcpOut']; $sumTcpIn += $traf['tcpIn']; $sumAllOut += $traf['allOut']; $sumAllIn += $traf['allIn']; $hostName = long2ip($server); $linkServer = '' . make_span($hostName, 'ajax-reverse_ip') . ''; $linkTime = ''; echo ''; print_data($count, "data0"); print_data($linkTime, 'data0'); print_data($linkServer, "data1"); print_data(val_trun($traf['udpOut']), "data2"); print_data(val_trun($traf['udpIn']), "data2"); print_data(val_trun($traf['tcpOut']), "data2"); print_data(val_trun($traf['tcpIn']), "data2"); print_data(val_trun($traf['allOut']), "data2"); print_data(val_trun($traf['allIn']), "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 '
| ' . 'Сводные данные |
'; $endDate = date('t', PERIOD); for ($i = 1; $i <= $endDate; $i++) { if ($i != PERIOD_DAY) { echo '$i "; } else { echo "[$i] "; } } if (PERIOD_DAY) { echo 'все
udp трафикtcp трафиксуммарный трафик
' . "\n"; print_full_line(); /* отобразим информацию о программе */ print_info($queryCount); print_html_tail(); ?>