Для 5.2-001 и выше

Форум для размещения материалов по реализации различных схем использования ПО, решению частых проблем и предупреждению частых ошибок
HellKING
Сообщения: 101
Зарегистрирован: Пн май 30, 2005 10:14

Сообщение HellKING »

Прошу перенести в документации и статьи.

Дрон
Сообщения: 10
Зарегистрирован: Чт июл 06, 2006 15:00

Сообщение Дрон »

Пожалуйста и мне. dron@lsd.net.ua

HellKING
Сообщения: 101
Зарегистрирован: Пн май 30, 2005 10:14

Сообщение HellKING »

На первых страничках есть ссылка откуда можно скачать.

matvey
Сообщения: 1
Зарегистрирован: Пт ноя 24, 2006 18:35
Откуда: Ukraine
Контактная информация:

Сообщение matvey »

matvey@luga.net.ua
Заранее спасибо

The Serial
Сообщения: 11
Зарегистрирован: Ср ноя 22, 2006 15:48

Сообщение The Serial »

Товарищи! А тема жива? Счастливые обладатели этой штуковины, вышлите пожалуйста на the....com. (no spam)
Буду безмерно благодарен :roll:

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »


vitaphin
Сообщения: 4
Зарегистрирован: Пт май 04, 2007 12:23
Откуда: Санкт-Петербург

Сообщение vitaphin »

The Serial писал(а):Товарищи! А тема жива? Счастливые обладатели этой штуковины, вышлите пожалуйста на the....com. (no spam)
Буду безмерно благодарен :roll:
а что сейчас с этой штукой???
так как сервер недоступен... :oops:

Maxon2oo
Сообщения: 7
Зарегистрирован: Пт дек 29, 2006 17:20

Сообщение Maxon2oo »

мм.. представляю как база будет расти быстро. у нас за сутки файлы (*.utm) занимают 4-5гб.

Даже если учитывать что база будет в день подрастать на 2гб, то за год = 2*365 грубо

Долго не похраниш такую деталку, а по закону 3 года нужно. :wink:

Нетуповские файлы хоть по дискам расталкать можно, а с базой проблематично это имхо.. 8)

С ужасом представляю себе базу на несколько сотен гигов и как это все тормозить будет при запросах :lol:

Хотя как вариант - хранить в базе статистику не дольше месяца (с каждым днем затирать самые старые записи). Чтобы пользователю была доступна статистика за текущий месяц (редко когда кому нужна статистика за год - а если и нужно то за денюжку) :)

friedrich
Сообщения: 159
Зарегистрирован: Вс сен 25, 2005 10:45

Сообщение friedrich »

Размер поля в таблицах списаний можно уменьшить почти в два раза, поищите тему. Сами таблицы лучше чистить раз в месяц, там подробные данные о списаниях, вряд ли они будут нужны. Детальную статистику, по идее, тоже можно разбирать и складировать в более сжатом формате... Посмотрим, может допишем приблуду сию.

antey86
Сообщения: 3
Зарегистрирован: Пн мар 23, 2009 10:00

Сообщение antey86 »

можно и мне? antey86(_)gmail.com

Аватара пользователя
detx
Сообщения: 346
Зарегистрирован: Вт мар 11, 2008 12:00
Откуда: Нижний Новгород

Сообщение detx »

admin@astracomnn.ru и мне пожалуйста???

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Чуток модифицировал сей полезный скрипт. Ускорил немного. Деталька теперь пишеться в дневные таблицы (на каждые сутки своя таблица) - ибо хранить все в одной невозможно, слишком огромная таблица получается. У кого детальки много - можно переделать пару строк для хранения каждого часа в отдельной таблице.
Таблицы скрипт создает сам, обработку папки закоментировал. Работает только при передаче параметра в командной строке. У меня запускается в скрипте raw_fd_script.

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

<?php
/*********************** COPYRIGHT **********************/
/***** UTM 5 detailed statistic packet 0.8b         *****/
/***** *.utm &#40;binary&#41; --> MySql                     *****/
/***** Developed by DRiN a/k/a DJ Neo D'Matrix      *****/
/***** Ukraine, Kiev 2006                           *****/
/********************************************************/
/***** update by Kayfolom 2009                      *****/
/***** Usage&#58; read HOWTO                            *****/
/*********************** CONFIG **********************/
	$config&#91;"mysql_host"&#93;	= "10.0.0.9";
	$config&#91;"mysql_db"&#93;	= "UTM5_detail_stat";
	$config&#91;"mysql_user"&#93;	= "UTM5_detail_stat";
	$config&#91;"mysql_pass"&#93;= "UTM5_detail_stat";
	$config&#91;"path2dbfiles"&#93;= "/netup/utm5/db";
	$config&#91;"table_stat"&#93;	= "stat";

	$config&#91;"exec_limit"&#93;	= 60*60;
	$config&#91;"ignoresystem"&#93;	= false; // If true script will ignore system trafic &#40;id == 0&#41;
	$config&#91;"log2screen"&#93;	= false;
	$config&#91;"log2file"&#93;	= "/netup/utm5/log/export_detail_stat.log";
	$config&#91;"delete_utm"&#93;	= false;
	$config&#91;"t_class_arr"&#93;	= array&#40;10, 14, 20, 24&#41;; // traffic class for a store
	$config&#91;"create_table"&#93;	= "CREATE TABLE IF NOT EXISTS `&#123;TABLE_NAME&#125;` &#40;`id` int&#40;11&#41; NOT NULL auto_increment,`timestamp` int&#40;4&#41; unsigned,`account_id` int&#40;2&#41; unsigned,`t_class` int&#40;2&#41; unsigned, `packets` int&#40;4&#41; unsigned, `bytes` int&#40;4&#41; unsigned, `src_ip` int&#40;4&#41; unsigned, `src_port` smallint&#40;2&#41; unsigned, `dst_ip` int&#40;4&#41; unsigned, `dst_port` smallint&#40;2&#41; unsigned, `proto` TINYINT&#40;1&#41; unsigned, `tos`  TINYINT&#40;1&#41; unsigned, PRIMARY KEY  &#40;`id`&#41;&#41; ENGINE=MyISAM;";
/*********************** FUNCTIONS **********************/
function getmicrotime&#40;&#41; &#123; 
    list&#40;$usec, $sec&#41; = explode&#40;" ", microtime&#40;&#41;&#41;; 
    return &#40;&#40;float&#41;$usec + &#40;float&#41;$sec&#41;; 
&#125;

function mylog&#40;$log_str&#41; &#123;
	global $config, $flog;

	$now = date&#40;"d.m.y H&#58;i&#58;s"&#41;;
	$log_str = "$now	$log_str\r\n";

	if &#40;$config&#91;"log2screen"&#93;&#41; &#123;
		echo $log_str;
	&#125;
	fwrite&#40;$flog, $log_str&#41;;
&#125;

function export_record&#40;$line&#41; &#123;
	global $config, $skip_system, $skip_null, $skip_timestamp, $skip_t_class;

	$_timestamp = $line&#91;'timestamp'&#93;;
	$_account_id = $line&#91;'account_id'&#93;;
	$_t_class = $line&#91;'t_class'&#93;;
	$_packets = $line&#91;'packets'&#93;;
	$_bytes = $line&#91;'bytes'&#93;;
	$_src_ip = $line&#91;'src_ip'&#93;; 
	$_src_port = $line&#91;'src_port'&#93;;
	$_dst_ip = $line&#91;'dst_ip'&#93;; 
	$_dst_port = $line&#91;'dst_port'&#93;;
	$_proto = $line&#91;'proto'&#93;;
	$_tos = $line&#91;'tos'&#93;;

	if &#40;&#40;$_account_id == 0&#41; and $config&#91;"ignoresystem"&#93;&#41; &#123;
		$skip_system++;	
		return&#40;2&#41;;
	&#125; /** ignore system **/

	if &#40;&#40;$_packets == 0&#41; or &#40;$_bytes == 0&#41;&#41; &#123;
		$skip_null++;
		return;
	&#125; /** no data transfer **/

	if &#40;$line&#91;'timestamp'&#93; == 0&#41; &#123;
		$skip_timestamp++;
		return;
	&#125; /** no timestamp **/

	if&#40;!in_array&#40;$_t_class, $config&#91;"t_class_arr"&#93;&#41;&#41; &#123;
		$skip_t_class++;
		return;
	&#125; /** no timestamp **/

	$query = $config&#91;"create_table"&#93;;
	$date_tmp = date&#40;"Y_m_d", $line&#91;'timestamp'&#93;&#41;;
	$query = preg_replace&#40;'/&#123;TABLE_NAME&#125;/', $date_tmp, $query&#41;;
	$result = mysql_query&#40;$query&#41;;
	$columns = "`timestamp`, `account_id`, `t_class`, `packets`, `bytes`, `src_ip`, `src_port`, `dst_ip`, `dst_port`, `proto`, `tos`";
	$values = "'$_timestamp', '$_account_id', '$_t_class', '$_packets', '$_bytes', '$_src_ip', '$_src_port', '$_dst_ip', '$_dst_port','$_proto','$_tos'";
	$query = "INSERT DELAYED INTO `&#123;$date_tmp&#125;` &#40;$columns&#41; values &#40;$values&#41;";
	$result = mysql_query&#40;$query&#41;;
	return&#40;$result&#41;;
&#125;

function export&#40;$exportfile&#41; &#123;
	global $config, $rps;

	if&#40;!is_file&#40;$exportfile&#41;&#41; &#123;
		mylog&#40;"File \"$exportfile\" not exists"&#41;;
		return;
	&#125;

	$count_records = floor&#40;filesize&#40;$exportfile&#41;/76&#41;;
	if&#40;$count_records == 0&#41; &#123;
		mylog&#40;"File \"$exportfile\" not have records to export"&#41;;
		return;
	&#125;

	mylog&#40;"\"$exportfile\" contain $count_records records"&#41;;

	if&#40;!&#40;$f = fopen&#40;$exportfile, "r"&#41;&#41;&#41; &#123;
		mylog&#40;"Can't open \"$exportfile\" for reading"&#41;;
		return;
	&#125;

	$i = 0;
	$rps = 0;
	$start_time = getmicrotime&#40;&#41;;

	for &#40;$n = 1; $n <= $count_records; $n++&#41; &#123;
		$record = sfread&#40;$f&#41;;
		$result = export_record&#40;$record&#41;;
		if &#40;$result&#41; &#123;
			if &#40;$result !== 2&#41; $i++;
		&#125; 
//		else &#123;
//			mylog&#40;"Export failed &#40;record #$n&#41;"&#41;;
//		&#125;
	&#125;
	fclose&#40;$f&#41;;
	$end_time = getmicrotime&#40;&#41;;
	$ecex_time = $end_time - $start_time;
	$rps = $i/$ecex_time;
	return $i;
&#125;

function over&#40;$halt=true&#41; &#123;
	global $flog;

	if &#40;$halt&#41; &#123;
		mylog&#40;"Export script halted by error"&#41;;
	&#125; else &#123;
		mylog&#40;"Export script finished"&#41;;
	&#125;

	mylog&#40;"\r\n"&#41;;

	fclose&#40;$flog&#41;;
	exit&#40;&#41;;
&#125;
function sfread&#40;$f&#41; &#123;
	$int_str = fread&#40;$f, 76&#41;;
	$decode_mask = "VWTF1/Csrc_ip1/Csrc_ip2/Csrc_ip3/Csrc_ip4/Cdst_ip1/Cdst_ip2/Cdst_ip3/Cdst_ip4/Vnexthop/vin_iface/vout_iface";
	$decode_mask = $decode_mask."/Vpackets/Vbytes/Vfirst/Vlast/vsrc_port/vdst_port/vtcp_flags/Cproto/Ctos/vWTF3";
	$decode_mask = $decode_mask."/vsrc_as/vdst_as/vWTF4/Vslink_id/Vaccount_id/Vsourceaddr1/Vt_class/Vtimestamp/Vnfgen_addr";
	$result = unpack&#40;$decode_mask,$int_str&#41;;
	$result&#91;'src_ip'&#93;  = $result&#91;'src_ip1'&#93; + $result&#91;'src_ip2'&#93;*256 + $result&#91;'src_ip3'&#93;*256*256 + $result&#91;'src_ip4'&#93;*256*256*256; 
	$result&#91;'dst_ip'&#93; = $result&#91;'dst_ip1'&#93; + $result&#91;'dst_ip2'&#93;*256 + $result&#91;'dst_ip3'&#93;*256*256 + $result&#91;'dst_ip4'&#93;*256*256*256; 
	return &#40;$result&#41;;
&#125;

/*********************** MAIN **********************/

$flog = fopen&#40;$config&#91;"log2file"&#93;, "a"&#41;;

mylog&#40;"Export script started"&#41;;

$con = mysql_connect&#40;$config&#91;"mysql_host"&#93;, $config&#91;"mysql_user"&#93;, $config&#91;"mysql_pass"&#93;&#41;;
if &#40;$con == false&#41; &#123;
	mylog&#40;"ERROR! MySql-->Could not connect&#58; ".mysql_error&#40;&#41;&#41;;
	over&#40;&#41;;
&#125;

$db = mysql_select_db&#40;$config&#91;"mysql_db"&#93;, $con&#41;;
if &#40;$db == false&#41; &#123;
	mylog&#40;"ERROR! MySql-->Could not select database&#58; ".mysql_error&#40;&#41;&#41;;
	over&#40;&#41;;
&#125;

set_time_limit&#40;$config&#91;"exec_limit"&#93;&#41;;
error_reporting&#40;0&#41;;

$start_time = getmicrotime&#40;&#41;;


$total_records = 0;
$rps = 0;
$max_rps = 0;
$min_rps = 2147483647;
$total_rps = 0;
$total_rps_times = 0;

if &#40;$_SERVER&#91;"argv"&#93;&#91;1&#93;&#41; &#123;
	$utmfiles&#91;&#93; = $_SERVER&#91;"argv"&#93;&#91;1&#93;;
&#125; else &#123;
    exit;
	$d = dir&#40;$config&#91;"path2dbfiles"&#93;&#41;;
	while &#40;false !== &#40;$entry = $d->read&#40;&#41;&#41;&#41; &#123;
		$fullpath = "&#123;$config&#91;path2dbfiles&#93;&#125;/$entry";
		if &#40;!is_file&#40;$fullpath&#41;&#41; continue;
		if &#40;!is_readable&#40;$fullpath&#41;&#41; continue;
		$entry_parts=split&#40;"&#91;.&#93;", $entry&#41;;
		$ext = $entry_parts&#91;count&#40;$entry_parts&#41;-1&#93;;
		if &#40;$ext != 'utm'&#41; continue;

		$utmfiles&#91;&#93; = $fullpath;
	&#125;
	$d->close&#40;&#41;;
&#125;

$count_files = count&#40;$utmfiles&#41;;
if&#40;isset&#40;$utmfiles&#41; and &#40;$count_files > 0&#41;&#41;&#123;
	mylog&#40;"There are $count_files files to export"&#41;;
&#125; else &#123;
	mylog&#40;"There are no files to export"&#41;;
	over&#40;&#41;;
&#125;

$total_skip_system = 0;
$total_skip_null = 0;
$total_skip_timestamp = 0;
$total_skip_t_class = 0;

foreach&#40;$utmfiles as $n=>$utmfile&#41; &#123;
//	if&#40;is_file&#40;$utmfile&#41;&#41; &#123;
//	    rename&#40;$utmfile, $utmfile.".run"&#41;;
//	&#125; else &#123;
//	    mylog&#40;"File \"$utmfile\" not exists &#40;may be already exported&#41;"&#41;;
//	&#125;

	$skip_system = 0;
	$skip_null = 0;
	$skip_timestamp = 0;
	$skip_t_class = 0;

//	$exported_records = export&#40;$utmfile.".run"&#41;;
	$exported_records = export&#40;$utmfile&#41;;
	if &#40;$exported_records&#41; &#123;
		$myrps = round&#40;$rps*10&#41;/10;
		$skiped = $skip_system + $skip_null + $skip_timestamp + $skip_t_class;
		mylog&#40;"From \"$utmfile\" exported $exported_records records &#40;$myrps records per second&#41;"&#41;;
		mylog&#40;"\tSkipped $skiped records &#40;system&#58; $skip_system; null&#58; $skip_null; timestamp&#58; $skip_timestamp; t_class&#58; $skip_t_class&#41;"&#41;;
		$total_records += $exported_records;
		$total_skip_system += $skip_system;
		$total_skip_null += $skip_null;
		$total_skip_timestamp += $skip_timestamp;
		$total_skip_t_class += $skip_t_class;

		if &#40;$rps > $max_rps&#41; $max_rps = $rps;
		if &#40;$rps < $min_rps&#41; $min_rps = $rps;
		$total_rps += $rps;
		$total_rps_times++;
//		if&#40;$config&#91;"delete_utm"&#93;&#41; &#123;
//			unlink&#40;$utmfile.".run"&#41;;
//		&#125; else &#123;
//			rename&#40;$utmfile.".run", $utmfile.".exported"&#41;;
//		&#125;
	&#125; else &#123;
		mylog&#40;"File \"$utmfile\" export failed"&#41;;
//		rename&#40;$utmfile.".run", $utmfile.".filed"&#41;;
	&#125;
&#125;

$end_time = getmicrotime&#40;&#41;;
$ecex_time = $end_time - $start_time;
$med_rps = $total_rps/$total_rps_times;
$glob_rps = $total_records/$ecex_time;

$max_rps = round&#40;$max_rps*10&#41;/10;
$min_rps = round&#40;$min_rps*10&#41;/10;
$med_rps = round&#40;$med_rps*10&#41;/10;
$glob_rps = round&#40;$glob_rps*10&#41;/10;
$ecex_time = round&#40;$ecex_time*100&#41;/100;

$total_skiped = $total_skip_system + $total_skip_null + $total_skip_timestamp;

mylog&#40;"Script execution time is $ecex_time seconds"&#41;;
mylog&#40;"Total exported $total_records records"&#41;;
mylog&#40;"Total skipped $total_skiped records &#40;system&#58; $total_skip_system; null&#58; $total_skip_null; timestamp&#58; $total_skip_timestamp&#41;"&#41;;
mylog&#40;"Maximum speed	&#58; $max_rps	records per second"&#41;;
mylog&#40;"Minimum speed	&#58; $min_rps	records per second"&#41;;
mylog&#40;"Medium speed	&#58; $med_rps	records per second"&#41;;
mylog&#40;"Global speed	&#58; $glob_rps	records per second"&#41;;

over&#40;false&#41;;
?>

Закрыто