Страница 1 из 4

trafd

Добавлено: 2006-03-15 12:59:48
Abigor
заюзал ваши скрипты вот из этой статьи
http://www.lissyara.su/?id=1017

сам trafd ставил тож по вашей статье
http://www.lissyara.su/?id=1010
все встало и заработало, даж скрипт с первого раза запустился =) что порадовало =)

попробывал вашу веб морду, и тут встала проблема

он по чему-то отображает не все ip хотя в базе все ip сети есть хотя сумму по ним верно считает

Добавлено: 2006-03-15 13:15:01
Alex Keda

Код: Выделить всё

$lan_mask = "192.168."; // маска по которой выбираются IP для подсчёта
тут значения верные?

Вообще сделай так после

Код: Выделить всё

// Строим табличку по тем кого достали
// вытаскиваем рейтинг страниц из БД
добавь строку

Код: Выделить всё

echo $sql . "\n\n";
и запрос покажи. А может сам чё увидишь...

Добавлено: 2006-03-15 13:15:33
Alex Keda
И не надо Вы`кать, пожалуйста. Ладно? :)

Добавлено: 2006-03-15 13:20:55
Abigor

Код: Выделить всё

$lan_mask = "10.1.1."; // маска по которой выбираются IP для подсчёта
вот так у меня =)

добавил

Код: Выделить всё

echo $sql . "\n\n";
вывелось
  • Resource id #3
чесно, мне это ни чего не сказало,так как я полный ноль в php
И не надо Вы`кать, пожалуйста. Ладно? Smile
извени, привычка, родители так научили, обращаться к незнакомым людям, и к старшим тож

Добавлено: 2006-03-15 13:59:32
Alex Keda
Abigor писал(а):
  • Resource id #3
чесно, мне это ни чего не сказало,так как я полный ноль в php
Добавил не там. Надо сразу после составления запроса, а не после того как он выполнился...

Добавлено: 2006-03-15 14:13:17
Abigor
туплю, попробывал в разных местах поставить, все равно ртвет одни. то есть тодже, после прошествия некорого времени появился еще один ip =)

Добавлено: 2006-03-15 14:19:03
Alex Keda
Значит не там пробовал :)

===
А они в инет-то ходят?
Траффику мало пока :)

Добавлено: 2006-04-28 12:08:26
Dromok
А в чем может быть закавыка при использовании web-морды (она один в один из статьи, соответственно со своими параметрами сети), вот такое сообщение выдается:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /usr/local/www/loc/admin.php on line 310

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /usr/local/www/loc/admin.php on line 325
Всего было траффика за этот месяц: 0 мегабайт
Всего было траффика за прошлый месяц: 0 мегабайт

Добавлено: 2006-04-28 12:50:33
Alex Keda
ну он же ругается - значит кверя к MySQL не вернула результат.
Что-то неправильно нарихтовал... интерфейсы или IP...
====
посомтри сам запрос (сделай echo $sql после формирования сторки запроса.) - и поробуй его скормить phpMyAdmin например... будет видно, какая ошибка...

Добавлено: 2006-04-28 13:28:10
Dromok
Да все правильно, несколько раз проверил. на echo $sql; ответ один - Resource id #3 куда только его ни вставлял. :-) Может быть из-за того, что у меня trafd только на внутреннем интерфейсе висит? Его надо еще и на внешний вешать? Раньше сделал по статье на http://www.tmeter.ru/misc/trafd/ вот теперь хочу переделать.

Добавлено: 2006-04-28 13:37:10
Alex Keda

Код: Выделить всё

$sql = mysql_query("SELECT to_IP, SUM(bytes) AS `bytes` FROM `" . $IF_internal_servera . "_" . date(Y,time()) . "` WHERE `date` LIKE '" . $curr_month . "-%' AND from_IP != '" . $ip_out_servera . "'  AND to_IP != '" . $ip_out_servera . "' AND `to_IP` != '" . $ip_internal_servera . "' AND `from_IP` != '" . $ip_internal_servera . "' AND `to_IP` LIKE '" . $lan_mask . "%' GROUP BY `to_IP` ORDER BY `bytes` DESC");
вот после этих строк и надо вставлять. примерно так у тебя получится:

Код: Выделить всё

$sql = mysql_query("SELECT to_IP, SUM(bytes) AS `bytes` FROM `" . $IF_internal_servera . "_" . date(Y,time()) . "` WHERE `date` LIKE '" . $curr_month . "-%' AND from_IP != '" . $ip_out_servera . "'  AND to_IP != '" . $ip_out_servera . "' AND `to_IP` != '" . $ip_internal_servera . "' AND `from_IP` != '" . $ip_internal_servera . "' AND `to_IP` LIKE '" . $lan_mask . "%' GROUP BY `to_IP` ORDER BY `bytes` DESC");

echo "Запрос = " . $sql . "<br>\n";
и так для всех запросов.
смотришь сами запросы, пробуешь их выполнить...
то, что ошибка у тя - стопудово, у меня-то всё пашет :)

Добавлено: 2006-04-28 14:00:28
Dromok
Вот такая страница получается

Изображение

Сейчас трафика на нем мало, сервак только настраиваю, и вся работа пока только по одному интерфейсу.

Добавлено: 2006-04-28 14:04:00
Alex Keda
lissyara писал(а):

Код: Выделить всё

$sql = mysql_query("SELECT to_IP, SUM(bytes) AS `bytes` FROM `" . $IF_internal_servera . "_" . date(Y,time()) . "` WHERE `date` LIKE '" . $curr_month . "-%' AND from_IP != '" . $ip_out_servera . "'  AND to_IP != '" . $ip_out_servera . "' AND `to_IP` != '" . $ip_internal_servera . "' AND `from_IP` != '" . $ip_internal_servera . "' AND `to_IP` LIKE '" . $lan_mask . "%' GROUP BY `to_IP` ORDER BY `bytes` DESC");
вот после этих строк и надо вставлять. примерно так у тебя получится:

Код: Выделить всё

$sql = mysql_query("SELECT to_IP, SUM(bytes) AS `bytes` FROM `" . $IF_internal_servera . "_" . date(Y,time()) . "` WHERE `date` LIKE '" . $curr_month . "-%' AND from_IP != '" . $ip_out_servera . "'  AND to_IP != '" . $ip_out_servera . "' AND `to_IP` != '" . $ip_internal_servera . "' AND `from_IP` != '" . $ip_internal_servera . "' AND `to_IP` LIKE '" . $lan_mask . "%' GROUP BY `to_IP` ORDER BY `bytes` DESC");

echo "Запрос = " . $sql . "<br>\n";
и так для всех запросов.
смотришь сами запросы, пробуешь их выполнить...
то, что ошибка у тя - стопудово, у меня-то всё пашет :)
значит не там поставил. я ж пример привёл....

Добавлено: 2006-04-28 14:13:54
Dromok
Вот те крест, все по примеру сделал! :-)
то, что ошибка у тя - стопудово, у меня-то всё пашет
Да я это и сам прекрасно понимаю, понять не могу, где рыть.

А trafd на обоих интерфейсах висеть должен?

Добавлено: 2006-04-28 19:06:38
Alex Keda
Dromok писал(а):Вот те крест, все по примеру сделал! :-)
то, что ошибка у тя - стопудово, у меня-то всё пашет
Да я это и сам прекрасно понимаю, понять не могу, где рыть.

А trafd на обоих интерфейсах висеть должен?
не поминай имя Божие всуе! :)))
не по примеру. у тебя функция mysql_query уже выполнилась, до того как ты echo делаешь. потому и ссылка на ресурс.
трафд - на тех на которых запустил.

Добавлено: 2006-05-02 9:19:00
Dromok
Вот так сделал, результат на скриншоте выше (после строк с ошибкой "Запрос = " и все.

Код: Выделить всё

<?php

// IP хостов, интерфейсы,

$ip_out_servera = "XX.XXX.165.113"; // внешний IP сервака

$ip_internal_servera = "192.168.0.4"; // внутренний IP сервака

$IF_out_servera = "xl0"; // название внешнего интерфейса сервака

$IF_internal_servera = "ed0"; // название внутреннего интерфейса сервака

$lan_mask = "192.168."; // маска по которой выбираются IP для подсчёта

//Пароли для подключения к MySQL

$db_host = "localhost";

$db_user = "trafd";

$db_passwd = "trafd";

$db_db = "trafd";

//Пытаемся приконнектится к БД

if(!mysql_connect($db_host,$db_user,$db_passwd))

{

echo "<br><br><BIG><CENTER>

Не могу присоединиться к MySQL-серверу!</CENTER></BIG>";

exit;

}

//Выбираем базу данных

mysql_select_db($db_db);

// определяем текущий месяц, и прошлый месяц - для вывода статистики

$curr_month = date(Y,time()) . "-" . date(m,time());

$old_month = date(Y,time()) . "-" . date('m',strtotime("-1 month"));

// строим HTML страничку: 

?>

<HEAD>

<title>Страница статистики</title>

<meta http-equiv="Content-Type" 

content="text/html; charset=koi8-r">

<STYLE type="text/css">

#main_table .hilightoff {BACKGROUND: white}

#main_table .hilighton {BACKGROUND: #ccbbff}

#cheresstrochnaya_table .hilightoff {BACKGROUND: #88ff88}

#cheresstrochnaya_table .hilighton {BACKGROUND: #ccbbff}

</STYLE>

<BODY>

<BIG><CENTER>СТАТИСТИКА ИНТЕРНЕТА</CENTER></BIG><br><br>

<TABLE border="0" cellspacing="0" cellpadding="0" width="100%">

<TBODY>

    <TR>

        <TD width="50%" align="center" valign="top">

<TABLE border="1" cellspacing="0" cellpadding="0" 

width="80%" id="main_table">

<TBODY>

    <TR>

        <TD height="20" align="center" colspan="3">

        <BIG><CENTER>статистика за текущий месяц 

        <?php echo $curr_month; ?></CENTER></BIG></TD>

    </TR>

    <TR>

        <TD height="20" width="15%" align="center">

        <b>IP - адрес</b></TD>

        <TD height="20" width="55%" align="center">

        <b>пользователь</b></TD>

        <TD height="20" width="30%" align="center">

        <b>сколько скачано мегабайт</b></TD>

    </TR>

<?php

// вытаскиваем статистику по пользователям из БД

$sql = mysql_query("SELECT to_IP, SUM(bytes) AS `bytes` FROM 

`" . $IF_internal_servera . "_" . date(Y,time()) . "` WHERE `date` 

LIKE '" . $curr_month . "-%' AND from_IP != '" . $ip_out_servera . "'  

AND to_IP != '" . $ip_out_servera . "' AND 

`to_IP` != '" . $ip_internal_servera . "' 

AND `from_IP` != '" . $ip_internal_servera . "' AND `to_IP` 

LIKE '" . $lan_mask . "%' GROUP BY `to_IP` ORDER BY `bytes` DESC");

echo "Запрос = " . $sql . "<br>\n"; ============================= вставка

// Строим табличку по тем кого достали

// вытаскиваем рейтинг страниц из БД

while ($d = mysql_fetch_assoc($sql)) {

    // собственно тут вывод результатов.

    $bytes = $d['bytes'] /1048576;

    $bytes = round($bytes, 2);

    if($d['to_IP'] == '192.168.0.111'){$user_name = 'Петров Ф. А.';}

    if($d['to_IP'] == '192.168.0.17'){$user_name = 'Сидоров Н. А.';}

    if($d['to_IP'] == '192.168.0.13'){$user_name = 'Иванов А.Л.';}

    ?>

    <tr class=hilightoff onmouseover="className='hilighton';" 

    onmouseout="className='hilightoff';">

        <td style="border-bottom: 1px solid #707680;" 

        width="" align="left"><?php echo $d['to_IP']; ?></td>

        <td style="border-bottom: 1px solid #707680;" 

        width="" align="left"><?php echo $user_name; ?></td>

        <td style="border-bottom: 1px solid #707680;" 

        width="" align="center"><?php echo $bytes; ?></td>

    </tr>

<?php

unset ($user_name);

}

?>

</TBODY>

</TABLE>

</TD>

<TD width="50%" align="center" valign="top">

<TABLE border="1" cellspacing="0" cellpadding="0" 

width="80%" id="main_table">

<TBODY>

    <TR>

        <TD height="20" align="center" colspan="3">

        <BIG><CENTER>статистика за прошлый месяц 

        <?php echo $old_month; ?></CENTER></BIG></TD>

    </TR>

    <TR>

        <TD height="20" width="25%" align="center">

        <b>IP - адрес</b></TD>

        <TD height="20" width="55%" align="center">

        <b>пользователь</b></TD>

        <TD height="20" width="30%" align="center">

        <b>сколько мегабайт</b></TD>

    </TR>

<?php

// вытаскиваем статистику по пользователям из БД

$sql = mysql_query("SELECT to_IP, SUM(bytes) AS `bytes` FROM 

`" . $IF_internal_servera . "_" . date(Y,time()) . "` WHERE `date` 

LIKE '" . $old_month . "-%' AND from_IP != '" . $ip_out_servera . "' AND

to_IP != '" . $ip_out_servera . "' AND `to_IP` != '" . $ip_internal_servera . "' 

AND `from_IP` != '" . $ip_internal_servera . "' AND `to_IP` LIKE 

'" . $lan_mask . "%' GROUP BY `to_IP` ORDER BY `bytes` DESC");

echo "Запрос = " . $sql . "<br>\n"; ========================= вставка

// Строим табличку по тем кого достали

// вытаскиваем рейтинг страниц из БД

while ($d = mysql_fetch_assoc($sql)) {

    // собственно тут вывод результатов.

    $bytes = $d['bytes'] /1048576;

    $bytes = round($bytes, 2);

    if($d['to_IP'] == '192.168.0.111'){$user_name = 'Петров Ф. А.';}

    if($d['to_IP'] == '192.168.0.17'){$user_name = 'Сидоров Н. А.';}

    if($d['to_IP'] == '192.168.0.13'){$user_name = 'Иванов А.Л.';}

    ?>

    <tr class=hilightoff onmouseover="className='hilighton';"

     onmouseout="className='hilightoff';">

        <td style="border-bottom: 1px solid #707680;" 

        width="" align="left"><?php echo $d['to_IP']; ?></td>

        <td style="border-bottom: 1px solid #707680;" 

        width="" align="left"><?php echo $user_name; ?></td>

        <td style="border-bottom: 1px solid #707680;" 

        width="" align="center"><?php echo $bytes; ?></td>

    </tr>

<?php

unset ($user_name);

}

?>


</TBODY>

</TABLE>


</TD>

</TR>

</TBODY>

</TABLE>

<br><br>


<?php

// считаем траффик этого месяца

$traffic_curr_month = mysql_fetch_array(mysql_query("SELECT SUM(bytes) AS `bytes` 

FROM `" . $IF_out_servera . "_" . date(Y,time()) . "` 

WHERE `to_IP` ='" . $ip_out_servera . "' AND `date` 

LIKE '" . $curr_month . "-%'")); =================== вот на эту строку ругается

echo "Запрос = " . $traffic_curr_month . "<br>\n"; ======================== вставка

$traffic_curr_meg = $traffic_curr_month[bytes] / 1048576;

$traffic_curr_meg = round($traffic_curr_meg, 2);

// считаем траффик прошлого месяца

$traffic_old_month = mysql_fetch_array(mysql_query("SELECT SUM(bytes) AS `bytes` 

FROM `" . $IF_out_servera . "_" . date(Y,time()) . "` WHERE 

`to_IP` ='" . $ip_out_servera . "' AND `date` 

LIKE '" . $old_month . "-%'")); =================== вот на эту строку ругается

echo "Запрос = " . $traffic_old_month . "<br>\n"; ===================== вставка

$traffic_old_meg = $traffic_old_month[bytes] / 1048576;

$traffic_old_meg = round($traffic_old_meg, 2);

?>

Всего было траффика за&nbsp; &nbsp; этот &nbsp; &nbsp; 

месяц: &nbsp; <?php echo $traffic_curr_meg; ?> мегабайт<br>

Всего было траффика за прошлый месяц: 

<?php echo $traffic_old_meg; ?> мегабайт<br>

</FORM>

</BODY>

</HTML>


<?php ?>

Добавлено: 2006-05-02 9:49:21
Alex Keda
блин :) это я дурак - там сразу mysql_query выпоняется..
===
раздели запрос, и постороение запроса..
т.е. у тя щас так:

Код: Выделить всё

$sql = mysql_query("SELECT to_IP, SUM(bytes) AS `bytes` FROM 
`" . $IF_internal_servera . "_" . date(Y,time()) . "` WHERE `date` 
LIKE '" . $curr_month . "-%' AND from_IP != '" . $ip_out_servera . "'  
AND to_IP != '" . $ip_out_servera . "' AND 
`to_IP` != '" . $ip_internal_servera . "' 
AND `from_IP` != '" . $ip_internal_servera . "' AND `to_IP` 
LIKE '" . $lan_mask . "%' GROUP BY `to_IP` ORDER BY `bytes` DESC"); 
echo "Запрос = " . $sql . "<br>\n"; 
а ты переделай запросы так:

Код: Выделить всё

$sql = "SELECT to_IP, SUM(bytes) AS `bytes` FROM 
`" . $IF_internal_servera . "_" . date(Y,time()) . "` WHERE `date` 
LIKE '" . $curr_month . "-%' AND from_IP != '" . $ip_out_servera . "'  
AND to_IP != '" . $ip_out_servera . "' AND 
`to_IP` != '" . $ip_internal_servera . "' 
AND `from_IP` != '" . $ip_internal_servera . "' AND `to_IP` 
LIKE '" . $lan_mask . "%' GROUP BY `to_IP` ORDER BY `bytes` DESC"; 
echo "Запрос = " . $sql . "<br>\n";
$sql = mysql_query("$sql"); 

Добавлено: 2006-05-02 10:17:18
Dromok
Короче, разделил вот так:

Код: Выделить всё

// считаем траффик этого месяца

$sql = "SELECT SUM(bytes) AS `bytes` 

FROM `" . $IF_out_servera . "_" . date(Y,time()) . "` 

WHERE `to_IP` ='" . $ip_out_servera . "' AND `date` 

LIKE '" . $curr_month . "-%'";

echo "Запрос = " . $sql . "<br>\n";

$sql = mysql_query("$sql");

$traffic_curr_month = mysql_fetch_array("$sql");

$traffic_curr_meg = $traffic_curr_month[bytes] / 1048576;

$traffic_curr_meg = round($traffic_curr_meg, 2);
Выдало такую строку:

Код: Выделить всё

Запрос = SELECT SUM(bytes) AS `bytes` FROM `xl0_2006` WHERE `to_IP` ='XX.XXX.165.113' AND `date` LIKE '2006-05-%'
как понял, пытается забрать статистику, собранную на внешнем интерфейсе, а т.к. trafd висит только на внутреннем, то соответственно и в mysql нет таблицы xl0_2006, отсюда и ошибка. Верно?

Добавлено: 2006-05-02 10:38:40
Alex Keda
ага. а чё на внешнем-то не считаешь? 3 мега памяти зажал? :)))

Добавлено: 2006-05-02 10:42:43
Dromok
ага. а чё на внешнем-то не считаешь? 3 мега памяти зажал? ))
:-) Да смысла не видел. На нем ведь после NAT`а только общий считает.

Добавлено: 2006-05-02 10:43:54
Alex Keda
ага... а если придёт десяток писем по 20 мег - будешь буянить прову - откуда лишний траффик? :)

Добавлено: 2006-05-02 10:48:24
Dromok
Это точно. Но пока почта на внешнем хостере. Вот буду по твоей статье Exim поднимать, тогда точно понадобится.

Добавлено: 2006-05-03 10:30:01
Aldaron
Привтетсвую! Очень полезная статейка про trafd+mysql, спасибо!
стоял ipfm, но возникла необходимость кроме подсчета трафика иметь еще и логи, кто куда лазил... Как бы эта система вполне подходит под мои нужды, но у нас в компании более 100 человек, все активно пользуются инетом... За час уже более 3000 записей в БД было добавлено...
Скрипт немного переделал и сделал типа Одна таблица - Один месяц. Интересно мускул вытянет такое или нет :) Шлюзик я бы не скзаал что прям для этого предназначен...

В общем прошу теоретического совета, что посоветуете именно для хранения логов всех запросов пользоваталей? Это вопрос номер 1.
Теперь дальше. То ли как то криво поставился trafd, но не нравится мне одна его фича... И скриптом, и вручную когда сбрасываю логи в бинарики, и из бинариков в текст, он не всегда на это реагирует. Т.е. например запустил скрипт, долго думает(секунд 10), вуаля, в базе 400 новых записей. Запускаю через пару минут - ничего. Еще раз - ничего. Еще раз - опять задумался и еще немного добавил.
Может криво объясняю, но суть такова... И в cron запихивать это бессмысленно, кто его знает - сработает или нет... Ваше мнение, уважаемая публика, в чем косяк?

Добавлено: 2006-05-03 10:54:09
Aldaron
И еще в догонку... Просто мысли так скажем...
По конкретным пользователям статистику делать муторно, т.к. много человек и IP бывает меняются.
Если допустим завести отдельную таблицу с перебором всех IP нашей сети, скриптом вытаскивать сумму трафика по каждому IP, пихать в ту базу... Допустим делать это раз в неделю, и завершаться эта таблица будет каждый месяц. Т.о. можно будет без гимора делать выборки типа ТОП-10 юзеров инета, и при необходимости проверять с какими хостами он работал.
Ваши комментарии? Может, кто посоветует более грамотный способ?

Кстати, насколько можно верить trafd в плане правильности подсчета трафика? В ipfm я замечал некоторые несостыковки...

Добавлено: 2006-05-03 10:55:34
Alex Keda
с кем нестыковки? с провом? они всегда будут :)