= "%BEGIN_DATE%" && date < "%END_DATE%") group by dstPort ) as `out` join ( select srcPort, sum(psize) as trafIn from traffic where (pId = @proto) && (dstPort = 0) && (dstIp = %USER%) && (srcIp = %SERVER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") group by srcPort ) as `in` on out.dstPort = in.srcPort union all select out.dstPort as port, out.trafOut as trafOut, ifnull(in.trafIn,0) as trafIn from ( select dstPort, sum(psize) as trafOut from traffic where (pId = @proto) && (srcPort = 0) && (srcIp = %USER%) && (dstIp = %SERVER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") group by dstPort ) as `out` left outer join ( select srcPort, sum(psize) as trafIn from traffic where (pId = @proto) && (dstPort = 0) && (dstIp = %USER%) && (srcIp = %SERVER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") group by srcPort ) as `in` on out.dstPort = in.srcPort where in.srcPort is null union all select in.srcPort as port, ifnull(out.trafOut,0) as trafOut, in.trafIn as trafIn from ( select dstPort, sum(psize) as trafOut from traffic where (pId = @proto) && (srcPort = 0) && (srcIp = %USER%) && (dstIp = %SERVER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") group by dstPort ) as `out` right outer join ( select srcPort, sum(psize) as trafIn from traffic where (pId = @proto) && (dstPort = 0) && (dstIp = %USER%) && (srcIp = %SERVER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") group by srcPort ) as `in` on out.dstPort = in.srcPort where out.dstPort is null'; /* установим в MySQL переменную @proto для протокола UDP */ $queryTemp = preg_replace('/%PROTO%/', 'udp', $querySetProto); $result = my_mysql_query($queryTemp); mysql_free_result($result); /* Формируем статистику запрошеных портов по протоколу UDP. */ $replacements = array(USER, SERVER, BEGIN_DATE, END_DATE); $queryTemp = preg_replace($patternsQueryTraf, $replacements, $queryTraf); $result = my_mysql_query($queryTemp); while ($line = mysql_fetch_assoc($result)) { $index = $line['port'] . ':udp'; $dataTraf[$index]['allOut'] = $line['trafOut']; $dataTraf[$index]['allIn'] = $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, SERVER, BEGIN_DATE, END_DATE); $queryTemp = preg_replace($patternsQueryTraf, $replacements, $queryTraf); $result = my_mysql_query($queryTemp); while ($line = mysql_fetch_assoc($result)) { $index = $line['port'] . ':tcp'; $dataTraf[$index]['allOut'] = $line['trafOut']; $dataTraf[$index]['allIn'] = $line['trafIn']; } mysql_free_result($result); /* Получим статистику за период сумарного трафика */ $patternsQueryPeriod = array("/%USER%/", "/%SERVER%/", "/%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%) && (dstIp = %SERVER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") ) as `out` join ( select sum(psize) as psizeSum from traffic where (dstPort = 0) && (dstIp = %USER%) && (srcIp = %SERVER%) && (date >= "%BEGIN_DATE%" && date < "%END_DATE%") ) as `in`'; $imgDataOut = array(); $imgDataIn = array(); for ($i = 0; isset($dateBeginArray[$i]); $i++) { $replacements = array(USER, SERVER, $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); } /* сформируем линк для графика суммарного трафика */ $imgServer = './graph.php?graph=statgraph&leg=' . urlencode('Sent') . '|' . urlencode('Received') . '&xt=' . urlencode(PERIOD_DAY ? 'Hours' : 'Days') . '&data=' . implode(',', $imgDataOut) . '|' . implode(',', $imgDataIn); /* Функция сортировки данных */ $dataTrafCopy = $dataTraf; function sort_cmp($a, $b) { if (strcmp(SORT_CMP, 'port')) { global $dataTrafCopy; $v1 = $dataTrafCopy[$a][SORT_CMP]; $v2 = $dataTrafCopy[$b][SORT_CMP]; if ($v1 == $v2) return 0; return ($v1 > $v2) ? -1 : 1; } else { return strcmp($a, $b); } } uksort($dataTraf, "sort_cmp"); /* формирует ссылку для сортировки данных */ function make_sort_link($val, $sort) { if ($sort != SORT_CMP) { $link = '' . $val . ''; } else { $link = $val; } return $link; } function make_link($type, $server, $portStr) { $str = << // $portStr EOF; return $str; } /** * Отобразим страницу. */ list($year, $month) = split('-', BEGIN_DATE); $day = PERIOD_DAY; $title = 'Статистика за ' . make_month($year, $month, $day) . ': Хост ' . USER_NAME . ', Сервер ' . SERVER_NAME; print_html_head($title, 'reverse_ip'); /* отобразим название продукта */ print_head(); /* отобразим график содержащай статистику */ echo '
' . "\n"; echo '\n"; echo '\n"; echo '\n"; echo "\n"; echo '' . "\n"; echo '
'; print_login(); echo "

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

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

'; echo ''; 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 ''; print_data("Номер", "head0", "th"); print_data(make_sort_link("Порт", "port"), "head1", "th"); print_data(make_sort_link("Отправлено", "allOut"), "head1", "th"); print_data(make_sort_link("Получено", "allIn"), "head1", "th"); echo '' . "\n"; $count = 0; $sumOut = $sumIn = 0; foreach ($dataTraf as $port => $traf) { $count++; $sumOut += $traf['allOut']; $sumIn += $traf['allIn']; list($portNumb, $servName) = split(':', $port); $portName = getservbyport($portNumb, $servName); if ($portName) { $portStr = "$servName:$portName ($portNumb)"; } else { $portStr = "$servName:$portNumb"; } if ($portNumb == 80 && !strcmp($servName, 'tcp')) { $portStr = make_link('http', SERVER_NAME, $portStr); } else if ($portNumb == 21 && !strcmp($servName, 'tcp')) { $portStr = make_link('ftp', SERVER_NAME, $portStr); } else if ($portNumb == 443 && !strcmp($servName, 'tcp')) { $portStr = make_link('https', SERVER_NAME, $portStr); } echo ''; print_data($count, "data0"); print_data($portStr, "data1"); 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($sumOut), "head3"); print_data(val_trun($sumIn), "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 'все
' . "\n"; print_full_line(); /* отобразим информацию о программе */ print_info($queryCount); print_html_tail(); ?>