Утилита (скрипт) для импортирование пользователей в utm

Технические вопросы по UTM 5.0
Ответить
Тимофей
Сообщения: 8
Зарегистрирован: Пт янв 11, 2008 16:04

Утилита (скрипт) для импортирование пользователей в utm

Сообщение Тимофей »

Видел где-то скрипт который предназначен для импорта юзеров в базу utm из любой доругой (требуется правка скрипта) . Есть ли такой скрипт для utm 5.2.1-005?

Аватара пользователя
XoRe
Сообщения: 458
Зарегистрирован: Ср янв 10, 2007 16:04

Сообщение XoRe »

Угу.
viewtopic.php?t=4129
Требуется правка скрипта)

Тимофей
Сообщения: 8
Зарегистрирован: Пт янв 11, 2008 16:04

Сообщение Тимофей »

"Для осуществления переноса данных об учетных записях пользователей, тарифах, списаниях служит
утилита to_utm.pl. Утилита написана на языке Perl и поставляется в исходном коде. Благодаря этому имеется
возможность перенести данные практически из любой системы, исправив код скрипта согласно структуре базы
данных, из которой осуществляется перенос. "

как я понял должен быть официальный скрипт to_utm.pl

Аватара пользователя
XoRe
Сообщения: 458
Зарегистрирован: Ср янв 10, 2007 16:04

Сообщение XoRe »

Тогда:
search.php
И поискать слово "to_utm" )
Как я понял, её надо искать в дистрибутивах версии примерно 5.1.10.

Если вам нужен точный ответ на ваш вопрос, то нет.
Такой утилиты нет под utm 5.2.1-005.
И под utm 5.2.1-004 её нету.
Похоже её убрали из дистрибутива, начиная с версииutm 5.2.1.

Arti
Сообщения: 266
Зарегистрирован: Пн окт 01, 2007 02:44

Сообщение Arti »

Немного "причёсанный" вариант того же скрипта. Переносил из Кинз'а в utm5-2.1.005.

Предполагается что у пользователя два IP один в LAN, другой который будет назначен на пользовательскую сторону при создании туннеля.

Тариф состоит из одной услуги передачи трафика и двух периодических: абонентской платы и плата за аренду реальника если таковой есть.

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

#!/usr/local/bin/perl

use Switch;
use DBD::mysql;
use DBI();
use Time::Local;
use Socket;


#Преобразование адреса
sub IP_TO_N {
	my ($Ip) = @_;
	$Ip = unpack("N",inet_aton($Ip));
	$Ip = $Ip > 2147483647 ? ($Ip - 0xFFFFFFFF - 1):$Ip; 
	return $Ip;
}

# "Разворачиваем" и выполняем запрос, возвращаем autoinc
sub DO_QUERY {
	my ($Cfg, $Query, $Href) = @_;
	my ($Field, $Values, $Into, $Sth, $AutoInc);

	while (($Field, $Value) = each (%$Href)) {
		$Into .= "$Field, ";
		$Values .= "'$Value', ";
	}

	$Into =~ s/, $//;
	$Values =~ s/, $//; 
	$Query = "$Query ($Into) VALUES ($Values);";

#	print $Query."\n\n";
	$$Cfg{'Utm5Db'}->do($Query);
	
	$Sth = $$Cfg{'Utm5Db'}->prepare("SELECT last_insert_id();");
	$Sth->execute();
	$AutoInc =  ($Sth->fetchrow_array)[0];
	$Sth->finish;
	
	return $AutoInc;
}

#Создание лицевого счета
sub ADD_ACCOUNT {
	my ( $Cfg, $UsrInfo ) = @_ ;
	my ( %Acnt ) = () ;
	$Acnt{'balance'} =			$$UsrInfo{'balance'};
	$Acnt{'account_name'} =			'auto create account';
	$Acnt{'credit'} =			'0';
	$Acnt{'flags'} =			'3';
	$Acnt{'discount_period_id'} =		'0';
	$Acnt{'dealer_account_id'} =		'0';
	$Acnt{'comission_coef'} =		'0';
	$Acnt{'default_comission_value'} =	'0';
	$Acnt{'is_dealer'} =			'0';
	$Acnt{'int_status'} =			'0';
	$Acnt{'block_recalc_abon'} =		'0';
	$Acnt{'block_recalc_prepaid'} =		'0';

	$AcntId = DO_QUERY ( $Cfg, "INSERT INTO accounts", \%Acnt );

	return $AcntId;
}

#Cоздание пользователя (созданый лицевой счет записываем сразу как основной)
sub ADD_USER {
	my ($Cfg, $AcntId, $UsrInfo) = @_;
	my (%UsrAdd, $Query, $UsrId);

	$UsrAdd{'login'} =			$$UsrInfo{'login'};
	$UsrAdd{'password'} =			$$UsrInfo{'password'};
	$UsrAdd{'basic_account'} =		$AcntId;
	$UsrAdd{'is_blocked'} =			'0';
	$UsrAdd{'discount_period_id'} =		'0';
	$UsrAdd{'create_date'} =		$$Cfg{'UnixTimeStamp'};
	$UsrAdd{'last_change_date'} =		$$Cfg{'UnixTimeStamp'};
	$UsrAdd{'who_create'} =			$$Cfg{'SysUsrId'};
	$UsrAdd{'who_change'} =			$$Cfg{'SysUsrId'};
	$UsrAdd{'is_juridical'} =		'0';
	$UsrAdd{'full_name'} =			$$UsrInfo{'full_name'};
	$UsrAdd{'juridical_address'} =		'';
	$UsrAdd{'actual_address'} =		$$UsrInfo{'actual_address'};
	$UsrAdd{'flat_number'} =		$$UsrInfo{'flat_number'};
	$UsrAdd{'entrance'} =			'';
	$UsrAdd{'floor'} =			'';
	$UsrAdd{'district'} =			'';
	$UsrAdd{'building'} =			$$UsrInfo{'building'};
	$UsrAdd{'passport'} =			'';
	$UsrAdd{'work_telephone'} =		'';
	$UsrAdd{'home_telephone'} =		'';
	$UsrAdd{'mobile_telephone'} =		$$UsrInfo{'mobile_telephone'};
	$UsrAdd{'web_page'} =			'';
	$UsrAdd{'icq_number'} =			'';
	$UsrAdd{'tax_number'} =			'';
	$UsrAdd{'kpp_number'} =			'';
	$UsrAdd{'email'} =			'';
	$UsrAdd{'bank_id'} =			'0';
	$UsrAdd{'bank_account'} =		'';
	$UsrAdd{'comments'} =			$$UsrInfo{'comments'};
	$UsrAdd{'house_id'} =			'0';
	$UsrAdd{'is_send_invoice'} =		'0';
	$UsrAdd{'advance_payment'} =		'0';
	$UsrAdd{'personal_manager'} =		'';
	$UsrAdd{'connect_date'} =		$$UsrInfo{'created'};

	$UsrId = DO_QUERY ($Cfg, "INSERT INTO users", \%UsrAdd);

	#Добавляем лицевой счет в список лицевых счетов
	$Query = "INSERT into users_accounts (uid, account_id) VALUES ($UsrId, $AcntId)";
#	print $Query."\n";
	$UTM5_DB->do($Query);

	return $UsrId;
}

#Привязка к лицевому счету тарифного плана
sub LINK_TARIFF_TO_ACCOUNT {
	my ( $Cfg, $AcntId, $Tariff ) = @_;
	my ( %TpAdd, $TarifLinkId);

	$TpAdd{'account_id'} 	=	$AcntId;
	$TpAdd{'tariff_id'} 	=	$$Tariff{'Id'};
	$TpAdd{'next_tariff_id'} =	$$Tariff{'Id'};
	$TpAdd{'discount_period_id'} =	$$Cfg{'DiscPerId'};
	$TpAdd{'link_date'} 	=	$$Cfg{'UnixTimeStamp'};

	$TarifLinkId = DO_QUERY ($Cfg, "INSERT INTO account_tariff_link", \%TpAdd);

	return $TarifLinkId ;
}

#Добавление сервисной связки в список связок
sub ADD_SVR_LNK_TO_LIST {
	my ( $Cfg, $SvrId, $UsrId, $AcntId, $TarLinkId) = @_;
	my ( %SvrLink, $SvrLinkId);

	$SvrLink{'user_id'}  	=	$UsrId;
	$SvrLink{'account_id'}	=	$AcntId;
	$SvrLink{'service_id'} 	=	$SvrId;
	$SvrLink{'tariff_link_id'} =	$TarLinkId;

	$SvrLinkId = DO_QUERY ($Cfg, "INSERT INTO service_links", \%SvrLink);

	return $SvrLinkId; 
}

#Добавление связки периодической услуги
sub ADD_PERIOD_SVR_LNK{
	my ( $Cfg, $SvrLnkId) = @_;
	my ( %PrdSvrLink);
	$PrdSvrLink{'id'}			=	$SvrLnkId;
	$PrdSvrLink{'discount_period_id'} 	=	$$Cfg{'DiscPerId'};
	$PrdSvrLink{'discounted_in_curr_period'} =	'0';
	$PrdSvrLink{'start_date'}		=	$$Cfg{'UnixTimeStamp'};
	$PrdSvrLink{'is_planned'}		=	'0';
	$PrdSvrLink{'expire_date'}		=	$$Cfg{'ExpireDate'};
	$PrdSvrLink{'need_del'}			=	'0';
	$PrdSvrLink{'unprepay_period'}		=	'0';
	#Значение ниже указывает за какой период не списывать средства за 
	#переодическую услугу с начала расчетного периода (секунды). Эквивалентно галке
	#"не списывать абонентскую плату" при подключении периодической услуги
	$PrdSvrLink{'unabon_period'} 		=	$$Cfg {'UnixTimeStamp'} - $$Cfg{'DiscBegin'} ;
	$PrdSvrLink {'is_invoice_set'}		=	'0';
	DO_QUERY ($Cfg, "INSERT INTO periodic_service_links", \%PrdSvrLink);
}

#Создание IP группы
sub CREATE_IP_GOUPS {
	my ( $Cfg, $Usr) = @_;
	my ( $IpGroupID, $Query, %IpAdd, $Ip);
	
	$Query = "SELECT max(ip_group_id) from ip_groups;";
	$UTM5_Sth = $UTM5_DB->prepare($Query);
	$UTM5_Sth->execute();
	$IpGroupID = ($UTM5_Sth->fetchrow_array)[0];
	$IpGroupID++;
	$UTM5_Sth->finish;

	#VPN
	$IpAdd{'ip_group_id'} =		$IpGroupID;
	$IpAdd{'ip'}	 =		IP_TO_N($$Usr {'vpnip'});
	$IpAdd{'mask'} =		'-1';
	$IpAdd{'uname'} =		$$Usr {'vpnlogin'};
	$IpAdd{'upass'} =		$$Usr {'vpnpswd'};
	#$IpAdd{'mac'} =		'';
	#$IpAdd {'allowed_cid'}=	'';
	$IpAdd{'create_date'}= 		$$Cfg {'UnixTimeStamp'};;
	$IpAdd{'ip_type'} =		'0';
	$IpAdd{'router_id'} =		'0';

	DO_QUERY ($Cfg, "INSERT INTO ip_groups", \%IpAdd);

	#LAN
	$IpAdd{'ip'}	 =		IP_TO_N($$Usr {'lanip'});
	$IpAdd{'ip_type'} =		'1';
	delete $IpAdd{'uname'};
	delete $IpAdd{'upass'};

	DO_QUERY ($Cfg, "INSERT INTO ip_groups", \%IpAdd);

	return $IpGroupID;
}

# downloaded
sub ADD_DNLD {
	my ($Cfg, $Usr) = @_;
	my (%Dnl, $DnlId);

	$Query = "SELECT max(downloaded_id) from downloaded;";
	$UTM5_Sth = $UTM5_DB->prepare($Query);
	$UTM5_Sth->execute();
	$DnlId = ($UTM5_Sth->fetchrow_array)[0];
	$DnlId++;
	$UTM5_Sth->finish;

	$Dnl{'tclass_id'} = 		'0';
	$Dnl{'downloaded_id'} = 	$DnlId;
	DO_QUERY ($Cfg, "INSERT INTO downloaded", \%Dnl);

	if ( $$Usr{'CustomPrepay'} != 0 ) {
		$Dnl{'tclass_id'} = 	200;		#200 - класс трафика (например входящий Iternet)
		$Dnl{'downloaded_id'} = $DnlId;
		$Dnl{'custom_prepay'} = $$Usr{'CustomPrepay'};
		DO_QUERY ($Cfg, "INSERT INTO downloaded", \%Dnl);
	}

	return $DnlId;
}

#Связка услуги пердачи трафика
sub  ADD_IPTRAFF_SVR_LNK {
	my ( $Cfg, $SvrLnkId, $IpGrpID, $DnlId) = @_;
	my ( %IpTrafLnk );

	$IpTrafLnk{'id'} =		$SvrLnkId;
	$IpTrafLnk{'ip_group_id'} =	$IpGrpID;
	$IpTrafLnk{'downloaded_id'} =	$DnlId;
	$IpTrafLnk{'flags'} =		0;

	DO_QUERY ($Cfg,"INSERT INTO iptraffic_service_links", \%IpTrafLnk);
}

#Добавления пользователя и привязки тарифного плана
sub CREATE_USER {
	my ($Config, $UserInfo, $Tariff) = @_;
	my ($AccountId, $UserId, $TarifLinkId, $ServiceLnkId);

	#Создание лицевого счета
	$AccountId = ADD_ACCOUNT ($Config, $UserInfo);

	#Cоздание пользователя
	$UserId = ADD_USER ($Config, $AccountId, $UserInfo);

	#Привязка к лицевому счету тарифного плана
	$TarifLinkId = LINK_TARIFF_TO_ACCOUNT ($Config, $AcntId, $Tariff);

	#Создание сервесной связки переодической соcтовляющей услуги пердачи трафика
	$ServiceLnkId = ADD_SVR_LNK_TO_LIST ($Config, $$Tariff{'IpTraf'}, $UserId, $AccountId, $TarifLinkId);
	ADD_PERIOD_SVR_LNK ($Config, $ServiceLnkId );

	#Создание IP группы
	$IpGroupID = CREATE_IP_GOUPS ($Config, $UserInfo);

	# downloaded
	$DownloadId = ADD_DNLD( $Config,  $UserInfo );

	#Связка услуги пердачи трафика
	ADD_IPTRAFF_SVR_LNK ($Config, $ServiceLnkId, $IpGroupID, $DownloadId);

	#Обонетская плата
	$ServiceLnkId = ADD_SVR_LNK_TO_LIST ($Config, $$Tariff{'Sharge'}, $UserId, $AccountId, $TarifLinkId);
	ADD_PERIOD_SVR_LNK ( $Config, $ServiceLnkId );

	#Выделенный IP
	#Т.е определяем кому подключать эту услугу буковки надо заменить на циферки :)
	if ($$UserInfo{'vpnip'} =~ /^A\.B\.C[DE]\.\d{1,3}/){
		$ServiceLnkId = ADD_SVR_LNK_TO_LIST ($Config, $$Tariff{'RealIp'}, $UserId, $AccountId, $TarifLinkId);
		ADD_PERIOD_SVR_LNK ( $Config, $SvrLnkId );
	}

	print(CrtUsrLog "$UserId\t$AccountId\t$$UserInfo{'balance'}\t$$UserInfo{'lanip'}\t$$UserInfo{'vpnip'}\n");
}

#################################################################################################################################################
#################################################################################################################################################

sub DO_SELECT {
	my ($Result, $Query) = @_;
	my ($Tmp);

	$FROM_Sth=$FROM_DB->prepare($Query);
	$FROM_Sth->execute();
	$Tmp = $FROM_Sth->fetchrow_hashref;
	%$Result = %$Tmp;
	$FROM_Sth->finish;
}

sub TARIFF_DETECT {
	my ($UsrInf, $Tariff) = @_;

#Здесь устанавливается  соответствие между
#тарифами старой билинговой системой и UTM .

#Предполагается что тариф состоит из одной услуги
#передачи трафика одной абонентской платы и еще
#одной услуги - "выделенный внешний IP", которая
#подключена у части пользователей, здесь же вычисляем
#предоплаченный трафик, который будет добавлен к _уже_
#_начисленному_ в _полном_объёме_ предоплаченному трафику
#за месяц.

#реализация функции TARIFF_DETECT не показана


	$$Tariff{'Id'} = 1;		#ID тарифного плана
	$$Tariff{'Sharge'} = 4 		#Абонентка
	$$Tariff{'RealIp'} = 5; 	#выделенный внешний IP
	$$Tariff{'IpTraf'} = 6;		#передача трафика

	$$UsrInf{'CustomPrepay'} = 0;	#предоплаченный трафик

}



#Глобальные настройки
	$GLOBAL_CONFIG{'Utm5Db'} =	'';
	$GLOBAL_CONFIG{'SysUsrId'}  =	-1;
	$GLOBAL_CONFIG{'DiscPerId'} =	34;		#ID текущего расчетного периода
	$GLOBAL_CONFIG{'DiscBegin'} = 	NNNNNNNNNNN;	#время начала текущего расчетного периода
	$GLOBAL_CONFIG{'ExpireDate'} =	2130523200;
	$GLOBAL_CONFIG{'UnixTimeStamp'} = '';
	
	$FROM_DB_HOST="A.B.С.D";			#откуда берем инфу
	$FROM_DB_NAME="billing";
	$FROM_DB_USR="XXXXXXXXXXXXXXXXX";
	$FROM_DB_PASWD="YYYYYYYYYYYYYYY";

	$UTM5_DB_HOST="E.F.G.H";			#MySQL c UTM
	$UTM5_DB_NAME="UTM5";
	$UTM5_DB_USR="XXXXXXXXXXXX";
	$UTM5_DB_PASWD="YYYYYYYYYY";



	$FROM_DB = DBI->connect("DBI:mysql:$FROM_DB_NAME:$FROM_DB_HOST", $FROM_DB_USR, $FROM_DB_PASWD);
	$GLOBAL_CONFIG{'Utm5Db'} = $UTM5_DB = DBI->connect("DBI:mysql:$UTM5_DB_NAME:$UTM5_DB_HOST", $UTM5_DB_USR, $UTM5_DB_PASWD);
	open (CrtUsrLog,"> CrtUsr.log");

	$GLOBAL_CONFIG{'Utm5Db'}->do("SET NAMES cp1251");

	$UTM5_Sth = $GLOBAL_CONFIG{'Utm5Db'}->prepare("select UNIX_TIMESTAMP()");
	$UTM5_Sth->execute();
	$GLOBAL_CONFIG{'UnixTimeStamp'} = ($UTM5_Sth->fetchrow_array) [0];
	$UTM5_Sth->finish;

#
#Пример реализации переноса пользователей из блинга Кинз'а
#

	#пример запроса
	$Query = "select id from clients WHERE ip  LIKE \"192.168.%\" AND ip NOT LIKE \"192.168.100.%\" ORDER BY id;";
	
	print "$Query\n";
	$FROM_Sth=$FROM_DB->prepare($Query);
	$FROM_Sth->execute();
	while ($UsrId = $FROM_Sth->fetchrow_array ) {
		push @UsrIdList, $UsrId;
	}
	$FROM_Sth->finish;


	foreach $UsrId  (@UsrIdList){
		%UserInfo = ();	
		%NetPrice = ();
		%Tariff = ();

		$Query = "SELECT firstname,lastname,
		street, house AS building, flat AS flat_number, phone AS mobile_telephone, description AS comments,
		ip AS lanip, login, decode(password,'123') AS password,
		vpnip, vpnlogin, decode(vpnpassword,'123') AS vpnpswd,
		monthly_traffic, prepaid_traff, prepaid_traff_bonus, shaper,
		monthly_pay, cur_balance AS balance, UNIX_TIMESTAMP(created) AS created
		from clients WHERE id=${UsrId};";
#		print  "$Query\n";
		DO_SELECT (\%UserInfo, $Query);

		$Query = "select in_price from net_price WHERE userid=${UsrId} and net_id=0 ORDER BY modified DESC LIMIT 1;";
		DO_SELECT (\%NetPrice, $Query);
	
		$UserInfo{'full_name'} = "$UserInfo{'lastname'} $UserInfo{'firstname'}";
		$UserInfo{'actual_address'} = "улица $UserInfo{'street'} дом $UserInfo{'building'} квартира $UserInfo{'flat_number'}";
		$UserInfo{'comments'} = "$UserInfo{'comments'} трафик: бонус $UserInfo{'prepaid_traff_bonus'}; предоплаченный $UserInfo{'prepaid_traff'}; за месяц $UserInfo{'monthly_traffic'}";

		#Дифолтный тариф на который будет посажен пользователь, если функция TARIFF_DETECT
		#не сможет определить тариф.
		$Tariff{'Id'} = 17; $Tariff{'Sharge'} = 52; $Tariff{'RealIp'} = 53; $Tariff{'IpTraf'} = 54; $Tariff{'PrepayTraff'} = '';

		TARIFF_DETECT (\%UserInfo, \%Tariff);


		CREATE_USER (\%GLOBAL_CONFIG, \%UserInfo, \%Tariff);

	}

	$FROM_DB->disconnect;
	$GLOBAL_CONFIG{'Utm5Db'}>disconnect;
	close(CrtUsrLog);


mavka
Сообщения: 84
Зарегистрирован: Вт ноя 13, 2007 20:13

Сообщение mavka »

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

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

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

Потому что денег стОит

mavka
Сообщения: 84
Зарегистрирован: Вт ноя 13, 2007 20:13

Сообщение mavka »

разве? вроде ж начиная с какойто версии он поставляется с ядром
в крайнем случае у меня есть утилита utm5_urfaclient

mavka
Сообщения: 84
Зарегистрирован: Вт ноя 13, 2007 20:13

Сообщение mavka »

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

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

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

оно при запуске проверяет наличие лицензии на себя в БД, при отсутствии лицензии работать отказывается. Отдельной строкой в прайсе оно не просто так.

Ответить