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

Mysql + trafd, скрипт

Добавлено: 2008-06-06 21:21:37
sakura
Всем привет, как говорится это мое первое сообщение на этом форуме так что если будете пинать, то не сильно :)

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

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


#!/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

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

Добавлено: 2008-06-07 2:29:49
krilya

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


#!/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-запросы создания таблиц нужно вобще вынести в отдельный файл

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

Добавлено: 2008-06-07 7:32:51
krilya

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

$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);
    }
?>



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

Добавлено: 2008-06-07 9:40:05
Alex Keda
перл логичней - он в системе точно есть.
в отличие от php

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

Добавлено: 2008-06-07 10:44:07
manefesto
lissyara писал(а):перл логичней - он в системе точно есть.
в отличие от php
логичней ??? он же тебе не нравится вроде

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

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

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

Добавлено: 2008-06-07 12:23:10
Alex Keda
я тоже.
однако писать системные скрипты на php...
изврат...

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

Добавлено: 2008-06-07 12:36:45
krilya
ну если я могу написать скрипт на пхп за 5 минут, а аналогичный на перл за пару часов, то я бы не сказал что это изврат...
если утрировать, то почему бы тогда не писать на shell ведь он точно есть в системе..

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

Добавлено: 2008-06-07 12:37:43
Alex Keda
заметим, оригинал на шелл =)
======
я на нём и стараюсь писать.

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

Добавлено: 2008-06-07 12:52:14
krilya
вообще не понимаю зачем флейм, чувак попросил скрипт покритиковать я покритиковал ;)

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

Добавлено: 2008-06-07 12:54:12
Alex Keda
я тоже =)

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

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

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

Добавлено: 2008-06-08 23:43:04
Alex Keda
ты куда-то торопишься?