Mysql + trafd, скрипт

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
sakura
проходил мимо
Сообщения: 3
Зарегистрирован: 2008-06-06 20:06:52

Mysql + trafd, скрипт

Непрочитанное сообщение sakura » 2008-06-06 21:21:37

Всем привет, как говорится это мое первое сообщение на этом форуме так что если будете пинать, то не сильно :)

Появилось требование запускать скрипт сбора статистики из трафд как можно чащще, и тут я обратил внимание что скрипт Лиссяры, написаный на шелле, работает долговато...
решил переписать...
все запросы к мускулу, и даже в некоторых местах коменты да и собстно идея начисто спёрты у Лиссяры

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


#!/usr/local/bin/php
<?
/* Data segodnia i v4era + vremia okruglennoe do sekund*/
$today_string = date("Y-m-d");
$yesterday =  mktime(0, 0, 0, date("m"), date("d") - 1, date("Y"));
$yesterday_string = strftime("%Y-%m-%d", $yesterday);
$month = date("m");
$year = date("Y");
$exact_time = date("H:i:00");

/* Infa dlia podkliu4enia k MYSQL */
$mysql_host = 'localhost';
$mysql_user = 'trafd';
$mysql_pass = 'ужасно_сложный_пароль';
$mysql_db_name = 'trafd';

// Direktoria kuda mi mojem slivati failegi, no ne budem :)
$NewDir = "/var/traffic/".$year."/".$month;
echo shell_exec("mkdir -p $NewDir");
echo $NewDir."\n";

// Zdesi ukazivaem interfeisi slushaemie trafd, mojno brati iz rc.conf, no eto potom ;)
$trafd_interfaces = array("bge1");
print_r($trafd_interfaces);  //Just to test interfaces array
$sql_link = mysql_connect($mysql_host, $mysql_user, $mysql_pass) or die("Unable to connect MYSQL Server"); // Tzepliaemsia k MYSQL serveru

for($i = 0; $i < count($trafd_interfaces); $i++)
    {
    echo $trafd_interfaces[$i]."\n";
    echo shell_exec("/usr/local/bin/trafsave $trafd_interfaces[$i]"); // Sohraniaem statistiku po tekus4emu interfeisu
    echo shell_exec("/usr/local/bin/traflog -i $trafd_interfaces[$i] -a -n -s > /tmp/summary.$trafd_interfaces[$i] 2>/dev/null"); // Preobrazuem logi iz dvoi4nogo v udobo4itaemii
    echo shell_exec("cat /dev/null > /usr/local/var/trafd/trafd.$trafd_interfaces[$i]"); // Ot4is4aem dvoi4nii log
    mysql_select_db($mysql_db_name, $sql_link);

    // Zapros dlia sozdania vremennoi BD
    $sql_create_tmp_table = "CREATE TABLE `traffic_tmp`
                        (`date` DATE NOT NULL,
                        `time` TIME NOT NULL,
                        `from_IP` CHAR(16) NOT NULL,
                        `port_from_IP` CHAR(8) NOT NULL,
                        `to_IP` CHAR(16) NOT NULL,
                        `port_to_IP` CHAR(8) NOT NULL,
                        `protocol` ENUM('icmp','tcp','udp') NOT NULL,
                        `bytes` int(16) NOT NULL,
                        `all_bytes` int(16) NOT NULL)
                        TYPE=MyISAM COMMENT='tmp_table'";
    $sql_create_tmp_table_result = mysql_query($sql_create_tmp_table); // Sobstno sozdanie BD
    $sql_clear_tmp_table = "DELETE FROM `traffic_tmp`";                 // Zapros i
    $sql_clear_tmp_table_result = mysql_query($sql_clear_tmp_table );   // ot4istka vremennoi BD pered vneseniem svejei infi...

    $variable_to_parse = file("/tmp/summary.$trafd_interfaces[$i]");    // S4itivaem infu iz faila polu4ennogo kommandoi "traflog" i zakidivaem kajduiu ee stroku v massiv
    for($n = 0; $n < count($variable_to_parse); $n++ )                  // Teperi probegaem po kajdomu elementu massiva, sozdannogo vishe, i delaem iz kajdoi stroki massiv
        {                                                               // Dlia parsinga
//      echo $variable_to_parse[$n + 4];
        $database_string = explode(" ", $variable_to_parse[$n + 4]);    // Sozdaem massiv! "+4" nujno dlia togo 4tobi izbavitsia ot zagolovka tablitzi
//      print_r($database_string);                                              //debug String
        $database_string = array_unique($database_string);              // Udaliaem odnorodnie stroki iz massiva (probeli, polu4ivshiesia iz explode)
        foreach($database_string as $key => $value )                    // Tut udaliaem ostavshiisia probel (on je unikalen :))
            {
            if(strlen($value) == 0)
                {
                unset($database_string[$key]);
                }
            }                                                           // Udalili poslednii probel
        $database_string = array_values($database_string);
        //print_r($database_string);                                            //debug String
        // Zalivaem infu vo vremennuiu tablitzu
        $sql_insert_into_temp_table = "INSERT INTO `traffic_tmp` (`date`, `time`, `from_IP`, `port_from_IP`, `to_IP`, `port_to_IP`, `protocol`, `bytes`, `all_bytes`)
        values ('$today_string', '$exact_time', '$database_string[0]', '$database_string[1]', '$database_string[2]', '$database_string[3]', '$database_string[4]', '$database_stri
//      echo $sql_insert_into_temp_table."\n";
        $sql_delete_empty_rows_from_temp_table = "DELETE FROM `traffic_tmp` where `from_IP`=''"; // 4istim esli polu4ilisi pustie zapisi v BD

        $sql_insert_into_temp_table_result = mysql_query($sql_insert_into_temp_table); // Vvalivaem vsio dobro iz trafd vo vremennuiu tablitzu
        $sql_delete_empty_rows_from_temp_table_result = mysql_query($sql_delete_empty_rows_from_temp_table);  // Udaliaem pustie polia

        }
    // Sozdaiem postoiannuiu tablitzu
    $sql_create_permanent_table_query = "CREATE TABLE `$trafd_interfaces[$i]_$year`
                                (`unic_id` INT(16) NOT NULL AUTO_INCREMENT,
                                `date` DATE NOT NULL,
                                `time` TIME NOT NULL,
                                `from_IP` CHAR(16) NOT NULL,
                                `port_from_IP` CHAR(8) NOT NULL,
                                `to_IP` CHAR(16) NOT NULL,
                                `port_to_IP` CHAR(8) NOT NULL,
                                `protocol` ENUM('icmp','tcp','udp') NOT NULL,
                                `bytes` int(16) NOT NULL,
                                `all_bytes` int(16) NOT NULL, PRIMARY KEY (`unic_id`), KEY `date`(`date`))
                                TYPE=MyISAM COMMENT='Database 2 store traffic stats'";

    $sql_create_permanent_table_query_result = mysql_query($sql_create_permanent_table_query);
    // Perekidivaem infu iz temp tablitzi v postoiannuiu, pri etom obiedeniaiutsia vse, gde ne sovpadaet toliko 4islo bait
    $sql_insert_data_into_permanent_table = "INSERT INTO `$trafd_interfaces[$i]_$year` (`date`, `time`, `from_IP`, `port_from_IP`, `to_IP`,     `port_to_IP`, `protocol`, `bytes`,
                                        SELECT `date`, `time`, `from_IP`, `port_from_IP`,
                                        `to_IP`, `port_to_IP`, `protocol`, sum(`bytes`) as `bytes`,
                                        sum(`all_bytes`) as `all_bytes` FROM
                                        `traffic_tmp` GROUP BY `date`, `time`, `from_IP`, `port_from_IP`,
                                        `to_IP`, `port_to_IP`, `protocol`";
    //echo $sql_insert_data_into_permanent_table."++++++++++++++++++++++++\n";
    $sql_insert_data_into_permanent_table_result = mysql_query($sql_insert_data_into_permanent_table);
    }
?>


Заранее благодарю за объективную критику :)
За найденные ошибки еще большая благодарность! :P

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
krilya
мл. сержант
Сообщения: 106
Зарегистрирован: 2008-03-11 4:42:29
Откуда: Комсомольск-на-Амуре

Re: Mysql + trafd, скрипт

Непрочитанное сообщение krilya » 2008-06-07 2:29:49

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


#!/usr/local/bin/php
<?

.......

for($i = 0; $i < count($trafd_interfaces); $i++)
    {

    ........

    // Zapros dlia sozdania vremennoi BD
    $sql_create_tmp_table = "CREATE TABLE `traffic_tmp`
                        (`date` DATE NOT NULL,
                        `time` TIME NOT NULL,
                        `from_IP` CHAR(16) NOT NULL,
                        `port_from_IP` CHAR(8) NOT NULL,
                        `to_IP` CHAR(16) NOT NULL,
                        `port_to_IP` CHAR(8) NOT NULL,
                        `protocol` ENUM('icmp','tcp','udp') NOT NULL,
                        `bytes` int(16) NOT NULL,
                        `all_bytes` int(16) NOT NULL)
                        TYPE=MyISAM COMMENT='tmp_table'";
    $sql_create_tmp_table_result = mysql_query($sql_create_tmp_table); // Sobstno sozdanie BD
   .......

    }
?>
нафик создавать временную таблицу в цикле если после цикла вы ее не удаляете? ;)

p.s. по правде сказать что sql-запросы создания таблиц нужно вобще вынести в отдельный файл

Аватара пользователя
krilya
мл. сержант
Сообщения: 106
Зарегистрирован: 2008-03-11 4:42:29
Откуда: Комсомольск-на-Амуре

Re: Mysql + trafd, скрипт

Непрочитанное сообщение krilya » 2008-06-07 7:32:51

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

$sql_insert_into_temp_table = "INSERT INTO `traffic_tmp` (`date`, `time`, `from_IP`, `port_from_IP`, `to_IP`, `port_to_IP`, `protocol`, `bytes`, `all_bytes`)
                                          values ('$today_string', '$exact_time', '$database_string[0]', '$database_string[1]', '$database_string[2]', '$database_string[3]', '$database_string[4]', '$database_stri)"; //???????[/b]
у вас этот запрос "обрезался" при копировании
и выложите файлик "summary.bge1" , а то не понятно что там парсится

вот чуток подрихтовал

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

<?php
    $today_string = date("Y-m-d");
    $yesterday =  mktime(0, 0, 0, date("m"), date("d") - 1, date("Y"));
    $yesterday_string = strftime("%Y-%m-%d", $yesterday);
    $month = date("m");
    $year = date("Y");
    $exact_time = date("H:i:00");

    $mysql_host = 'localhost';
    $mysql_user = 'root';
    $mysql_pass = '';
    $mysql_db_name = 'trafd';

    $sql_create_tmp_table = "CREATE TABLE IF NOT EXISTS `traffic_tmp` (
                                `date` DATE NOT NULL,
                                `time` TIME NOT NULL,
                                `from_IP` CHAR(16) NOT NULL,
                                `port_from_IP` CHAR(8) NOT NULL,
                                `to_IP` CHAR(16) NOT NULL,
                                `port_to_IP` CHAR(8) NOT NULL,
                                `protocol` ENUM('icmp','tcp','udp') NOT NULL,
                                `bytes` int(16) NOT NULL,
                                `all_bytes` int(16) NOT NULL
                            )ENGINE=MyISAM COMMENT='tmp_table'";

    $sql_create_permanent_table_query = "CREATE TABLE IF NOT EXISTS `:1` ( 
                                            `unic_id` INT(16) NOT NULL AUTO_INCREMENT,
                                            `date` DATE NOT NULL,
                                            `time` TIME NOT NULL,
                                            `from_IP` CHAR(16) NOT NULL,
                                            `port_from_IP` CHAR(8) NOT NULL,
                                            `to_IP` CHAR(16) NOT NULL,
                                            `port_to_IP` CHAR(8) NOT NULL,
                                            `protocol` ENUM('icmp','tcp','udp') NOT NULL,
                                            `bytes` int(16) NOT NULL,
                                            `all_bytes` int(16) NOT NULL, PRIMARY KEY (`unic_id`), KEY `date`(`date`)
                                        ) ENGINE=MyISAM COMMENT='Database 2 store traffic stats'";

    $sql_insert_data_into_permanent_table = "INSERT INTO `:1` (`date`,`time`,`from_IP`,`port_from_IP`,`to_IP`,`port_to_IP`,`protocol`,`bytes`,
                                            SELECT `date`,`time`,`from_IP`,`port_from_IP`,`to_IP`,`port_to_IP`,`protocol`,sum(`bytes`) as `bytes`,sum(`all_bytes`) as `all_bytes`
                                            FROM `traffic_tmp` GROUP BY `date`,`time`,`from_IP`,`port_from_IP`,`to_IP`,`port_to_IP`,`protocol`";

    $sql_delete_empty_rows_from_temp_table = "DELETE FROM `traffic_tmp` where `from_IP`=''"; 

    $sql_clear_tmp_table = "DELETE FROM `traffic_tmp`";                 

    $NewDir = "/var/traffic/".$year."/".$month;
    echo shell_exec("mkdir -p $NewDir");
    echo $NewDir."\n";
    
    $trafd_interfaces = array("bge1");
    $sql_link = mysql_connect($mysql_host, $mysql_user, $mysql_pass) or die("Unable to connect MYSQL Server"); 
    mysql_select_db($mysql_db_name, $sql_link);
    mysql_query($sql_create_tmp_table);
    
    for($i = 0; $i < count($trafd_interfaces); $i++) {
        echo 'trafd_interfaces ' . $i . ' ' . $trafd_interfaces[$i] . '<br>';
        echo shell_exec("/usr/local/bin/trafsave $trafd_interfaces[$i]");
        echo shell_exec("/usr/local/bin/traflog -i $trafd_interfaces[$i] -a -n -s > /tmp/summary.$trafd_interfaces[$i] 2>/dev/null");
        echo shell_exec("cat /dev/null > /usr/local/var/trafd/trafd.$trafd_interfaces[$i]");

        mysql_query($sql_clear_tmp_table );   

        $variable_to_parse = file("/tmp/summary.$trafd_interfaces[$i]"); 
    
        for($n = 0; $n < count($variable_to_parse); $n++ ) {             
            $database_string = explode(" ", $variable_to_parse[$n + 4]);  
            $database_string = array_unique($database_string);  
            
            foreach($database_string as $key => $value ) {      
                if(strlen($value) == 0) {
                    unset($database_string[$key]);
                }
            }                                                   
        
            $database_string = array_values($database_string);
            $sql_insert_into_temp_table = "INSERT INTO `traffic_tmp` (`date`, `time`, `from_IP`, `port_from_IP`, `to_IP`, `port_to_IP`, `protocol`, `bytes`, `all_bytes`)
                                          values ('$today_string', '$exact_time', '$database_string[0]', '$database_string[1]', '$database_string[2]', '$database_string[3]', '$database_string[4]', '$database_stri)"; //???????
            mysql_query($sql_insert_into_temp_table); 
            mysql_query($sql_delete_empty_rows_from_temp_table);
        }
    

        $permanent_table_name=$trafd_interfaces[$i] . '_' . $year;
        $sql_create_permanent_table_query=str_replace(":1",mysql_real_escape_string($permanent_table_name),$sql_create_permanent_table_query); 
        mysql_query($sql_create_permanent_table_query);
        $sql_insert_data_into_permanent_table = str_replace(":1",mysql_real_escape_string($permanent_table_name),$sql_insert_data_into_permanent_table); 
        mysql_query($sql_insert_data_into_permanent_table);
    }
?>



Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35266
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Mysql + trafd, скрипт

Непрочитанное сообщение Alex Keda » 2008-06-07 9:40:05

перл логичней - он в системе точно есть.
в отличие от php
Убей их всех! Бог потом рассортирует...

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: Mysql + trafd, скрипт

Непрочитанное сообщение manefesto » 2008-06-07 10:44:07

lissyara писал(а):перл логичней - он в системе точно есть.
в отличие от php
логичней ??? он же тебе не нравится вроде
я такой яростный шо аж пиздеЦ
Изображение

Аватара пользователя
krilya
мл. сержант
Сообщения: 106
Зарегистрирован: 2008-03-11 4:42:29
Откуда: Комсомольск-на-Амуре

Re: Mysql + trafd, скрипт

Непрочитанное сообщение krilya » 2008-06-07 12:17:12

lissyara писал(а):перл логичней - он в системе точно есть.
в отличие от php
я например перл вообще не перевариваю ;)

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35266
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Mysql + trafd, скрипт

Непрочитанное сообщение Alex Keda » 2008-06-07 12:23:10

я тоже.
однако писать системные скрипты на php...
изврат...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
krilya
мл. сержант
Сообщения: 106
Зарегистрирован: 2008-03-11 4:42:29
Откуда: Комсомольск-на-Амуре

Re: Mysql + trafd, скрипт

Непрочитанное сообщение krilya » 2008-06-07 12:36:45

ну если я могу написать скрипт на пхп за 5 минут, а аналогичный на перл за пару часов, то я бы не сказал что это изврат...
если утрировать, то почему бы тогда не писать на shell ведь он точно есть в системе..

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35266
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Mysql + trafd, скрипт

Непрочитанное сообщение Alex Keda » 2008-06-07 12:37:43

заметим, оригинал на шелл =)
======
я на нём и стараюсь писать.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
krilya
мл. сержант
Сообщения: 106
Зарегистрирован: 2008-03-11 4:42:29
Откуда: Комсомольск-на-Амуре

Re: Mysql + trafd, скрипт

Непрочитанное сообщение krilya » 2008-06-07 12:52:14

вообще не понимаю зачем флейм, чувак попросил скрипт покритиковать я покритиковал ;)

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35266
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Mysql + trafd, скрипт

Непрочитанное сообщение Alex Keda » 2008-06-07 12:54:12

я тоже =)
Убей их всех! Бог потом рассортирует...

sakura
проходил мимо
Сообщения: 3
Зарегистрирован: 2008-06-06 20:06:52

Re: Mysql + trafd, скрипт

Непрочитанное сообщение sakura » 2008-06-07 23:26:23

Всем спасиба! :)
По воводу того, что скрипт на пхп... он так значительно быстрый работает! знал бы си... работал бы еще быстрее! Но я си не знаю :)
Перл не люблю! Наверное потому что тоже не знаю :)

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35266
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Mysql + trafd, скрипт

Непрочитанное сообщение Alex Keda » 2008-06-08 23:43:04

ты куда-то торопишься?
Убей их всех! Бог потом рассортирует...