Пополнение счета и включение интернет

Технические вопросы по UTM 5.0
gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Пополнение счета и включение интернет

Сообщение gil »

Товарищи, подскажите, пожалуйста.
Столкнулись с проблемой.

Перенесли пользователей с другого биллинга..
Тем, кто в минусе, выключили интернет..
Срабатывает правило файрвола (pfctl -t blocked -T add UIP)..
Пользователь бежит за картой оплаты..
Ложит деньги.. Блокировка снимается, а интернет не включается..
Это - нормально??
Просто не моуг понять, в какую сторону копнуть..

Есть ли разница между тем, что вызвало выключение интернета (в админке выделил всех с минусом, и нажал выключить интернет) и что его после включает (автоматика после пополнения счета)??

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

В UTM пополнение баланса и включение интернета - два разных действия. Включать надо руками.

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

JAO писал(а):В UTM пополнение баланса и включение интернета - два разных действия. Включать надо руками.
ого.. а разработчики довольны этим??
а если у меня конец деньгам = конец и внутренней сети по этому правилу файрвола?? каждый раз руками тыкать??

подскажите тогда, как реализовать, чтоб на пополнение баланса срабатывало "Включить интернет"??
ручками в базу лезть??

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

видимо, ничего лучше, чем добавить в cron

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

(echo 'UPDATE `UTM5`.`accounts` SET `accounts`.`int_status` = 1 WHERE `accounts`.`balance` > 0 AND `accounts`.`is_blocked` = 0;' | mysql -u root -pMYPASS UTM5) && killall -HUP utm5_core
нет и не будет??

Аватара пользователя
Ata-man
Сообщения: 427
Зарегистрирован: Пт янв 21, 2005 10:04
Откуда: Екатеринбург

Сообщение Ata-man »

Для этих целей можно использовать urfaclient на php viewtopic.php?t=6402, но делать костыли в любом случае придется.

P.S.
HUP`ать ядро каждый раз - не есть хорошо. Лучше воспользоваться внешними скриптами, а биллинг оставить в покое :)

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

Ata-man писал(а):Для этих целей можно использовать urfaclient на php viewtopic.php?t=6402, но делать костыли в любом случае придется.

P.S.
HUP`ать ядро каждый раз - не есть хорошо. Лучше воспользоваться внешними скриптами, а биллинг оставить в покое :)
спасибо, добрый человек..
теперь всё понятно..
полноценный биллинг получить можно только за (21+45)К, а не за 21К..
грустно, грустно..

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

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

у меня ситуация с "пользователя разблокировало, интернет не включило" бывает крайне редко. Пополнением через карты сгенерированные биллингом не используем. пополнение через ОСМП и после разблокировки все становится хорошо

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

mikkey finn писал(а):у меня ситуация с "пользователя разблокировало, интернет не включило" бывает крайне редко. Пополнением через карты сгенерированные биллингом не используем. пополнение через ОСМП и после разблокировки все становится хорошо
а вот с карточками какая-то странность.. ничего понять не могу..

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

Собственно, решил проблему с помощью MySQL и urfaclient-1.0b4 на php..
Итак, решение:

В директорию /netup/utm5/addons/auto_inet/ положил следующие файлы от urfaclient на php: packet.php, socket.php, user_functions.php.
Так же положил самописный скрипт auto_inet.php следующего содержания:

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

<?php
// Подключаем необходимые файлы
require_once&#40;'user_functions.php'&#41;;
require_once&#40;'mysql.php'&#41;;

// Устанавливаем хост и порт для UTM, хост, пользователя, пароль и имя таблицы БД UTM5
$urfa_host	= "192.168.1.6";
$urfa_port	= 11758;
$db_host	= "localhost";
$db_user	= "USER_FOR_UTM5_DATABASE";
$db_pass	= "PASSWORD_FOR_UTM5_DATABASE";
$db_name	= "UTM5";

// Соединяемся с базой данных
if &#40;!$mdb = new sql_db&#40;$db_host, $db_user, $db_pass, $db_name&#41;&#41; die&#40;"Can't connect to database\n"&#41;;

// Получаем пару "логин", "пароль" для абонентов, состояние блокировки для которых 0 &#40;т.е., не заблокированы&#41;,
// а интернет все же выключен.
$sql_query =
    "SELECT `u`.`login` AS `login`, `u`.`password` AS `password` ".
    "FROM `&#123;$db_name&#125;`.`users` AS `u`, `&#123;$db_name&#125;`.`accounts` AS `a`, `&#123;$db_name&#125;`.`users_accounts` AS `ua` ".
    "WHERE `u`.`id` = `ua`.`uid` AND `a`.`id` = `ua`.`account_id` AND `a`.`is_blocked` = 0 ".
    "AND `a`.`int_status` = 0 AND `u`.`is_deleted` = 0 AND `a`.`is_deleted` = 0 AND `ua`.`is_deleted` = 0;";

if &#40;!$mdb->sql_query&#40;$sql_query&#41;&#41; &#123;
    echo "Can't execute query!\n";
    if &#40;!$mdb->sql_close&#40;&#41;&#41; die&#40;"Can't close connection to MySQL\n"&#41;;
    exit;
&#125;

// Если таких пользователей нет, то просто выходим
if &#40;$mdb->sql_numrows&#40;&#41; <= 0&#41; exit;

$accounts = $mdb->sql_fetchrowset&#40;&#41;;

// Для каждой пары "логин", "пароль" выполняем последовательность действий&#58;
// Соединение, вход, изменение статуса интернета, закрытие соединения
foreach &#40;$accounts as $account&#41; &#123;
    if &#40;!urfa_connect&#40;$urfa_host, $urfa_port&#41;&#41; die&#40;"Error connecting to UTM\n"&#41;;
    if &#40;!urfa_login&#40;$account&#91;'login'&#93;, $account&#91;'password'&#93;&#41;&#41; die&#40;"Can't login as '&#123;$account&#91;'login'&#93;&#125;'&#58;'&#123;$account&#91;'password'&#93;&#125;'\n"&#41;;
    
    rpcf_user5_change_int_status&#40;0&#41;;
    
    if &#40;!urfa_close&#40;&#41;&#41; die&#40;"Can't close connection to UTM\n"&#41;;
&#125;

// Закрываем соединение с БД UTM5
if &#40;!$mdb->sql_close&#40;&#41;&#41; die&#40;"Can't close connection to MySQL\n"&#41;;
?>
и так же положил файлик mysql.php (постоянно его использую) следующего содержания:

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

<?php
class sql_db
&#123;
	var $db_connect_id;
	var $query_result;
	var $row = array&#40;&#41;;
	var $rowset = array&#40;&#41;;
	var $num_queries = 0;

	function sql_db&#40;$sqlserver, $sqluser, $sqlpassword, $database, $persistency = true&#41;
	&#123;

		$this->persistency = $persistency;
		$this->user = $sqluser;
		$this->password = $sqlpassword;
		$this->server = $sqlserver;
		$this->dbname = $database;

		if&#40;$this->persistency&#41;
		&#123;
			$this->db_connect_id = @mysql_pconnect&#40;$this->server, $this->user, $this->password&#41;;
		&#125;
		else
		&#123;
			$this->db_connect_id = @mysql_connect&#40;$this->server, $this->user, $this->password&#41;;
		&#125;
		if&#40;$this->db_connect_id&#41;
		&#123;
			if&#40;$database != ""&#41;
			&#123;
				$this->dbname = $database;
				$dbselect = @mysql_select_db&#40;$this->dbname&#41;;
				if&#40;!$dbselect&#41;
				&#123;
					@mysql_close&#40;$this->db_connect_id&#41;;
					$this->db_connect_id = $dbselect;
				&#125;
			&#125;
			return $this->db_connect_id;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;

	function sql_close&#40;&#41;
	&#123;
		if&#40;$this->db_connect_id&#41;
		&#123;
			if&#40;$this->query_result&#41;
			&#123;
				@mysql_free_result&#40;$this->query_result&#41;;
			&#125;
			$result = @mysql_close&#40;$this->db_connect_id&#41;;
			return $result;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;

	function sql_query&#40;$query = "", $transaction = FALSE&#41;
	&#123;
		// Remove any pre-existing queries
		unset&#40;$this->query_result&#41;;
		if&#40;$query != ""&#41;
                &#123;

			$this->query_result = @mysql_query&#40;$query, $this->db_connect_id&#41;;

		&#125;
		if&#40;$this->query_result&#41;
		&#123;
			unset&#40;$this->row&#91;$this->query_result&#93;&#41;;
			unset&#40;$this->rowset&#91;$this->query_result&#93;&#41;;
			return $this->query_result;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;

	function sql_numrows&#40;$query_id = 0&#41;
	&#123;
		if&#40;!$query_id&#41;
		&#123;
			$query_id = $this->query_result;
		&#125;
		if&#40;$query_id&#41;
		&#123;
			$result = @mysql_num_rows&#40;$query_id&#41;;
			return $result;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;
	function sql_affectedrows&#40;&#41;
	&#123;
		if&#40;$this->db_connect_id&#41;
		&#123;
			$result = @mysql_affected_rows&#40;$this->db_connect_id&#41;;
			return $result;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;
	function sql_numfields&#40;$query_id = 0&#41;
	&#123;
		if&#40;!$query_id&#41;
		&#123;
			$query_id = $this->query_result;
		&#125;
		if&#40;$query_id&#41;
		&#123;
			$result = @mysql_num_fields&#40;$query_id&#41;;
			return $result;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;
	function sql_fieldname&#40;$offset, $query_id = 0&#41;
	&#123;
		if&#40;!$query_id&#41;
		&#123;
			$query_id = $this->query_result;
		&#125;
		if&#40;$query_id&#41;
		&#123;
			$result = @mysql_field_name&#40;$query_id, $offset&#41;;
			return $result;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;
	function sql_fieldtype&#40;$offset, $query_id = 0&#41;
	&#123;
		if&#40;!$query_id&#41;
		&#123;
			$query_id = $this->query_result;
		&#125;
		if&#40;$query_id&#41;
		&#123;
			$result = @mysql_field_type&#40;$query_id, $offset&#41;;
			return $result;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;
	function sql_fetchrow&#40;$query_id = 0&#41;
	&#123;
		if&#40;!$query_id&#41;
		&#123;
			$query_id = $this->query_result;
		&#125;
		if&#40;$query_id&#41;
		&#123;
			$this->row&#91;$query_id&#93; = @mysql_fetch_array&#40;$query_id&#41;;
			return $this->row&#91;$query_id&#93;;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;
	function sql_fetchrowset&#40;$query_id = 0&#41;
	&#123;
		if&#40;!$query_id&#41;
		&#123;
			$query_id = $this->query_result;
		&#125;
		if&#40;$query_id&#41;
		&#123;
			unset&#40;$this->rowset&#91;$query_id&#93;&#41;;
			unset&#40;$this->row&#91;$query_id&#93;&#41;;
			while&#40;$this->rowset&#91;$query_id&#93; = @mysql_fetch_array&#40;$query_id&#41;&#41;
			&#123;
				$result&#91;&#93; = $this->rowset&#91;$query_id&#93;;
			&#125;
			return $result;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;
	function sql_fetchfield&#40;$field, $rownum = -1, $query_id = 0&#41;
	&#123;
		if&#40;!$query_id&#41;
		&#123;
			$query_id = $this->query_result;
		&#125;
		if&#40;$query_id&#41;
		&#123;
			if&#40;$rownum > -1&#41;
			&#123;
				$result = @mysql_result&#40;$query_id, $rownum, $field&#41;;
			&#125;
			else
			&#123;
				if&#40;empty&#40;$this->row&#91;$query_id&#93;&#41; && empty&#40;$this->rowset&#91;$query_id&#93;&#41;&#41;
				&#123;
					if&#40;$this->sql_fetchrow&#40;&#41;&#41;
					&#123;
						$result = $this->row&#91;$query_id&#93;&#91;$field&#93;;
					&#125;
				&#125;
				else
				&#123;
					if&#40;$this->rowset&#91;$query_id&#93;&#41;
					&#123;
						$result = $this->rowset&#91;$query_id&#93;&#91;$field&#93;;
					&#125;
					else if&#40;$this->row&#91;$query_id&#93;&#41;
					&#123;
						$result = $this->row&#91;$query_id&#93;&#91;$field&#93;;
					&#125;
				&#125;
			&#125;
			return $result;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;
	function sql_rowseek&#40;$rownum, $query_id = 0&#41;&#123;
		if&#40;!$query_id&#41;
		&#123;
			$query_id = $this->query_result;
		&#125;
		if&#40;$query_id&#41;
		&#123;
			$result = @mysql_data_seek&#40;$query_id, $rownum&#41;;
			return $result;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;
	function sql_nextid&#40;&#41;&#123;
		if&#40;$this->db_connect_id&#41;
		&#123;
			$result = @mysql_insert_id&#40;$this->db_connect_id&#41;;
			return $result;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;
	function sql_freeresult&#40;$query_id = 0&#41;&#123;
		if&#40;!$query_id&#41;
		&#123;
			$query_id = $this->query_result;
		&#125;

		if &#40; $query_id &#41;
		&#123;
			unset&#40;$this->row&#91;$query_id&#93;&#41;;
			unset&#40;$this->rowset&#91;$query_id&#93;&#41;;

			@mysql_free_result&#40;$query_id&#41;;

			return true;
		&#125;
		else
		&#123;
			return false;
		&#125;
	&#125;
	function sql_error&#40;$query_id = 0&#41;
	&#123;
		$result&#91;"message"&#93; = @mysql_error&#40;$this->db_connect_id&#41;;
		$result&#91;"code"&#93; = @mysql_errno&#40;$this->db_connect_id&#41;;

		return $result;
	&#125;

&#125;
?>
Естественно, /usr/local/bin/php /netup/utm5/addons/auto_inet/auto_inet.php добавил в cron с частотой в 5 минут (думаю, мне 5 минут хватит на проверку, т.к. пользователей меньше 500, и проблема может бывать только у троих раз в пять минут)..

Вот такой костыль, уже и не знаю, какой по счету..

Pei0t
Сообщения: 258
Зарегистрирован: Чт дек 13, 2007 20:48

Сообщение Pei0t »

gil, проверил, всё работает, спасибо!

Puzan_aga
Сообщения: 105
Зарегистрирован: Чт сен 11, 2008 10:43

Сообщение Puzan_aga »

у меня не работает

Fatal error: Call to undefined function urfa_connect() in /usr/local/www/stat_2009/auto_inet/auto_inet.php on line 39

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

urfa-php какой версии? лежит там же?

Puzan_aga
Сообщения: 105
Зарегистрирован: Чт сен 11, 2008 10:43

Сообщение Puzan_aga »

gil писал(а):urfa-php какой версии? лежит там же?
Скачал с http://wiki.flintnet.ru/doku.php?id=urfaclient_php

Лежит там же где и файл.

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

у меня версия может быть другая самой библиотеки.
посмотрите, в новой как коннект к ядру делается.

или могу свою старую выложить, если требуется.

Puzan_aga
Сообщения: 105
Зарегистрирован: Чт сен 11, 2008 10:43

Сообщение Puzan_aga »

gil писал(а):у меня версия может быть другая самой библиотеки.
посмотрите, в новой как коннект к ядру делается.

или могу свою старую выложить, если требуется.
буду очень признателен если выложиш

Ответить