Появилось требование запускать скрипт сбора статистики из трафд как можно чащще, и тут я обратил внимание что скрипт Лиссяры, написаный на шелле, работает долговато...
решил переписать...
все запросы к мускулу, и даже в некоторых местах коменты да и собстно идея начисто спёрты у Лиссяры
Код: Выделить всё
#!/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);
}
?>
За найденные ошибки еще большая благодарность!