События Добавление, Изменение, удалени.

Технические вопросы по UTM 5.0
Ответить
Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

События Добавление, Изменение, удалени.

Сообщение Kayfolom »

В попытке использовать запуск скриптов по событиям потерпел крах.
Скрипт на добавление и изменение выполнялся почти постоянно с непредсказуемыми интервалами.
Странно. Повесил на событие добавление и изменение скрипт.
Одминку никто не трогает. Друними сбособами тоже (урфа к примеру) ядро не тревожим. В отчете изменения пользователе чисто за этот период. Но скрипт вызывается, причем регулярно:
04.03.2009 15:07:44 start - 04.03.2009 15:07:44 stop
04.03.2009 15:08:28 start - 04.03.2009 15:08:29 stop
04.03.2009 15:11:32 start - 04.03.2009 15:11:32 stop
04.03.2009 15:11:32 start - 04.03.2009 15:11:32 stop
04.03.2009 15:19:14 start - 04.03.2009 15:19:14 stop
04.03.2009 15:19:14 start - 04.03.2009 15:19:14 stop
04.03.2009 15:24:18 start - 04.03.2009 15:24:18 stop
04.03.2009 15:24:18 start - 04.03.2009 15:24:19 stop
04.03.2009 15:30:20 start - 04.03.2009 15:30:20 stop
04.03.2009 15:32:05 start - 04.03.2009 15:32:05 stop
04.03.2009 15:35:31 start - 04.03.2009 15:35:31 stop
04.03.2009 15:41:19 start - 04.03.2009 15:41:19 stop
04.03.2009 15:43:56 start - 04.03.2009 15:43:56 stop
04.03.2009 15:45:11 start - 04.03.2009 15:45:11 stop

Удалось выяснить следующее:
Включение Интернета (через админку, урфу, личный кабинет) интерпретируется как событие Изменение пользователя. Причем выключение игнорируется.
Хотя скорее всего (ИМХО) разработчики просто забыли убрать кусок кода на обработку включения/выключениея инета.

Забыл добавить - Сборка 5.2.1-005

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

Сообщение Kayfolom »

Убедился в полной неработоспособности встроенных событий билинга.
Сделал свой костыль, может кому пригодится...
Пришлось в user_log добавить поле event_passed тип int default 0, перед использованием сделал UPDATE user_log SET event_passed = 1 (чтобы старые события не лопатить).
Запускаю по крону раз в минуту, можно и чаще.
Можно отслеживать все события и по ним запускать внешние скрипты. Сделал только 3, как билинге.
В пхп не силен, если увидите ошибки - поправьте меня.

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

<?php
	$db_host='127.0.0.1&#58;3306';
	$db_base='UTM5';
	$db_user='юзер';
	$db_password='пасс';

	$user_add_exec = "";
	$user_edit_exec = "php /netup/utm5/bin/jabber_user_refresh.php";
	$user_delete_exec = "";

/*  События которые можно отслеживать &#58;
	add IP group
	add service to tariff
	add tariff
	delete account
	delete service from tariff
	edit account
	edit tariff
	link tariff to account
	remove tariff
	unlink tariff from account
	user_add
	user_delete
	user_edit
	
	Содержимое $row, можно передавать в качестве параметра 
	$row&#91;'id'&#93; => 39211
	$row&#91;'user_id'&#93; => 2
	$row&#91;'date'&#93; => 1236864097
	$row&#91;'who'&#93; => -4
	$row&#91;'what'&#93; => edit account
	$row&#91;'comment'&#93; => account <2>&#58; credit changed from 5.000000 to 0.000000.
*/

	$db_connect=mysql_connect&#40;$db_host,$db_user,$db_password&#41; or die &#40;"Connect failed"&#41;;
	mysql_select_db&#40;$db_base,$db_connect&#41;;
	$query="Select id, user_id,`date`, who, what, `comment` From user_log Where event_passed = '0'";
	$result=@mysql_query&#40;$query&#41;;
	while &#40;$row=mysql_fetch_array&#40;$result&#41;&#41; &#123;
		switch &#40;$row&#91;'what'&#93;&#41; &#123;
		case "user_add"&#58;
			exec&#40;$user_add_exec." ".$row&#91;'user_id'&#93;&#41;;
			break;
		case "user_edit"&#58;
//			exec&#40;$user_edit_exec." ".$row&#91;'user_id'&#93;&#41;;
			exec&#40;$user_edit_exec&#41;;
			break;
		case "user_delete"&#58;
			exec&#40;$user_delete_exec." ".$row&#91;'user_id'&#93;&#41;;
			break;
		&#125;
	&#125;
	$query="UPDATE user_log SET event_passed = 1 WHERE event_passed = '0'";
	@mysql_query&#40;$query&#41;;
?>

mikkey finn
Сообщения: 1612
Зарегистрирован: Пт ноя 10, 2006 15:23

Сообщение mikkey finn »

апдейт лучше переделать в том плане, чтоб апдейтить по id записи, иначе можно потерять необработанные записи, появившиеся за время отработки скрипта(да он быстр, но может оказаться недостаточно быстр)

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

Сообщение Kayfolom »

mikkey finn писал(а):апдейт лучше переделать в том плане, чтоб апдейтить по id записи, иначе можно потерять необработанные записи, появившиеся за время отработки скрипта(да он быстр, но может оказаться недостаточно быстр)
Да, думал над этим, но лениво было цикл писать ;)
Хотя тут два варианта: перенести апдейт сразу после селекта и надеятся на сверхскорость ;) Второй вариант - обрабатывать ВСЕ события, дабы не оставались записи с event_passed = '0', иначе с каждым разом скрипт будет выполняться все труднее и труднее.

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

Сообщение Kayfolom »

Вот вариант с надеждой на сверх скорость ;) Еще добавил логирование и выполнение нескольких скриптов на событие (их правда бы тоже в массив да в цикле выполнять, но сегодня уже лениво)

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

<?php
	$db_host='127.0.0.1&#58;3306';
	$db_base='UTM5';
	$db_user='логин';
	$db_password='пасс';

	$user_add_exec = "";
	$user_edit_exec01 = "php /netup/utm5/bin/jabber_user_refresh.php";
	$user_edit_exec02 = "/netup/utm5/bin/utm2arp_dhcp.sh";	 
	$user_delete_exec = "";

	$log_file = "/netup/utm5/log/events.log";

/*  События которые можно отслеживать &#58;
	add IP group
	add service to tariff
	add tariff
	delete account
	delete service from tariff
	edit account
	edit tariff
	link tariff to account
	remove tariff
	unlink tariff from account
	user_add
	user_delete
	user_edit
	
	Содержимое $row, можно передавать в качестве параметра 
	$row&#91;'id'&#93; => 39211
	$row&#91;'user_id'&#93; => 2
	$row&#91;'date'&#93; => 1236864097
	$row&#91;'who'&#93; => -4
	$row&#91;'what'&#93; => edit account
	$row&#91;'comment'&#93; => account <2>&#58; credit changed from 5.000000 to 0.000000.
*/
	$file_handle = fopen&#40;$log_file,"a+"&#41;;
	fwrite&#40;$file_handle, date&#40;"d.m.Y H&#58;i&#58;s"&#41;.' start'." - "&#41;;

	$db_connect=mysql_connect&#40;$db_host,$db_user,$db_password&#41; or die &#40;"Connect failed"&#41;;
	mysql_select_db&#40;$db_base,$db_connect&#41;;
	$query="Select id, user_id,`date`, who, what, `comment` From user_log Where event_passed = '0'";
	$result=@mysql_query&#40;$query&#41;;

	$query="UPDATE user_log SET event_passed = 1 WHERE event_passed = '0'";
	@mysql_query&#40;$query&#41;;

	while &#40;$row=mysql_fetch_array&#40;$result&#41;&#41; &#123;
		switch &#40;$row&#91;'what'&#93;&#41; &#123;
		case "user_add"&#58;
//			exec&#40;$user_add_exec." ".$row&#91;'user_id'&#93;&#41;;
			break;
		case "user_edit"&#58;
			exec&#40;$user_edit_exec01&#41;;
			exec&#40;$user_edit_exec02&#41;;
			fwrite&#40;$file_handle, $user_edit_exec01." - "&#41;;
			fwrite&#40;$file_handle, $user_edit_exec02." - "&#41;;
			break;
		case "user_delete"&#58;
//			print_r&#40;$row&#41;;
//			exec&#40;$user_delete_exec." ".$row&#91;'user_id'&#93;&#41;;
			break;
		&#125;
	&#125;
	fwrite&#40;$file_handle, date&#40;"d.m.Y H&#58;i&#58;s"&#41;.' stop'."\r\n"&#41;;
	fclose&#40;$file_handle&#41;;
?>

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

Сообщение Kayfolom »

Удивительно, но работает отлично. Сутки - полет нормальный.
По логам мускуля и мунина, никакой белее-менее значимой нагрузки не появилось, да и не могло появитья.
Похоже в билинге теперь есть события, да еще столько разных, прямо простор для творчества ;)
Погоняю скрипт еще с периодичностью в 10 сек - для пущего реалтайма, хотя так часто наверное не нужно.

Тут подумал что на users_log можно повесить trigger на insert чтоб он вывешивал семафор в какой нибудь табличке, но пока наверно это излишество.

Ответить