parent
2bd51c65c1
commit
a6619bfb18
@ -0,0 +1,244 @@
|
|||||||
|
package NGCP::BulkProcessor::Projects::Migration::UPCAT::Check;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
## no critic
|
||||||
|
|
||||||
|
no strict 'refs';
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::billing_profiles qw();
|
||||||
|
#use NGCP::BulkProcessor::Dao::Trunk::billing::billing_mappings qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::contracts_billing_profile_network qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::contracts_billing_profile_network_schedule qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::contracts qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::contract_balances qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::contacts qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::voip_subscribers qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::ncos_levels qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::voip_numbers qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::products qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::domains qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::domain_resellers qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_domains qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_subscribers qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_aig_sequence qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_allowed_ip_groups qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_dbaliases qw();
|
||||||
|
#use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_cf_mappings qw();
|
||||||
|
#use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_cf_destination_sets qw();
|
||||||
|
#use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_cf_destinations qw();
|
||||||
|
#use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_trusted_sources qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::kamailio::voicemail_users qw();
|
||||||
|
#use NGCP::BulkProcessor::Dao::Trunk::kamailio::location qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::RestRequests::Trunk::Resellers qw();
|
||||||
|
use NGCP::BulkProcessor::RestRequests::Trunk::Domains qw();
|
||||||
|
use NGCP::BulkProcessor::RestRequests::Trunk::BillingProfiles qw();
|
||||||
|
|
||||||
|
require Exporter;
|
||||||
|
our @ISA = qw(Exporter);
|
||||||
|
our @EXPORT_OK = qw(
|
||||||
|
check_billing_db_tables
|
||||||
|
check_provisioning_db_tables
|
||||||
|
check_kamailio_db_tables
|
||||||
|
check_import_db_tables
|
||||||
|
check_rest_get_items
|
||||||
|
);
|
||||||
|
|
||||||
|
my $NOK = 'NOK';
|
||||||
|
my $OK = 'ok';
|
||||||
|
|
||||||
|
sub check_billing_db_tables {
|
||||||
|
|
||||||
|
my ($messages) = @_;
|
||||||
|
|
||||||
|
my $result = 1;
|
||||||
|
my $check_result;
|
||||||
|
my $message;
|
||||||
|
|
||||||
|
my $message_prefix = 'NGCP billing db tables - ';
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::billing_profiles');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::products');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::domains');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::domain_resellers');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::contacts');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::contracts');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::contract_balances');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
#($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::billing_mappings');
|
||||||
|
#$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::contracts_billing_profile_network');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::contracts_billing_profile_network_schedule');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::voip_subscribers');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::ncos_levels');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::billing::voip_numbers');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_import_db_tables {
|
||||||
|
|
||||||
|
my ($messages) = @_;
|
||||||
|
|
||||||
|
my $result = 1;
|
||||||
|
my $check_result;
|
||||||
|
my $message;
|
||||||
|
|
||||||
|
my $message_prefix = 'import db tables - ';
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_provisioning_db_tables {
|
||||||
|
|
||||||
|
my ($messages) = @_;
|
||||||
|
|
||||||
|
my $result = 1;
|
||||||
|
my $check_result;
|
||||||
|
my $message;
|
||||||
|
|
||||||
|
my $message_prefix = 'NGCP provisioning db tables - ';
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_domains');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_subscribers');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_aig_sequence');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_allowed_ip_groups');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_dbaliases');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
#($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_cf_mappings');
|
||||||
|
#$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
#($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_cf_destination_sets');
|
||||||
|
#$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
#($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_cf_destinations');
|
||||||
|
#$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
#($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_trusted_sources');
|
||||||
|
#$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_kamailio_db_tables {
|
||||||
|
|
||||||
|
my ($messages) = @_;
|
||||||
|
|
||||||
|
my $result = 1;
|
||||||
|
my $check_result;
|
||||||
|
my $message;
|
||||||
|
|
||||||
|
my $message_prefix = 'NGCP kamailio db tables - ';
|
||||||
|
|
||||||
|
($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::kamailio::voicemail_users');
|
||||||
|
$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
#($check_result,$message) = _check_table($message_prefix,'NGCP::BulkProcessor::Dao::Trunk::kamailio::location');
|
||||||
|
#$result &= $check_result; push(@$messages,$message);
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _check_table {
|
||||||
|
|
||||||
|
my ($message_prefix,$module) = @_;
|
||||||
|
my $result = 0;
|
||||||
|
my $message = ($message_prefix // '') . &{$module . '::gettablename'}() . ': ';
|
||||||
|
eval {
|
||||||
|
$result = &{$module . '::check_table'}();
|
||||||
|
};
|
||||||
|
if (@$ or not $result) {
|
||||||
|
return (0,$message . $NOK);
|
||||||
|
} else {
|
||||||
|
return (1,$message . $OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_rest_get_items {
|
||||||
|
|
||||||
|
my ($messages) = @_;
|
||||||
|
|
||||||
|
my $result = 1;
|
||||||
|
my $check_result;
|
||||||
|
my $message;
|
||||||
|
|
||||||
|
my $message_prefix = 'NGCP id\'s/constants - ';
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub _check_rest_get_item {
|
||||||
|
|
||||||
|
my ($message_prefix,$module,$id,$item_name_field,$get_method,$item_path_method) = @_;
|
||||||
|
my $item = undef;
|
||||||
|
$get_method //= 'get_item';
|
||||||
|
$item_path_method //= 'get_item_path';
|
||||||
|
my $message = ($message_prefix // '') . &{$module . '::' . $item_path_method}($id) . ': ';
|
||||||
|
return (0,$message . $NOK,$item) unless $id;
|
||||||
|
eval {
|
||||||
|
$item = &{$module . '::' . $get_method}($id);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (@$ or not defined $item or ('ARRAY' eq ref $item and (scalar @$item) != 1)) {
|
||||||
|
return (0,$message . $NOK,$item);
|
||||||
|
} else {
|
||||||
|
$item = $item->[0] if ('ARRAY' eq ref $item and (scalar @$item) == 1);
|
||||||
|
return (1,$message . "'" . $item->{$item_name_field} . "' " . $OK,$item);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
@ -0,0 +1,470 @@
|
|||||||
|
package NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
## no critic
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::ProjectConnectorPool qw(
|
||||||
|
get_import_db
|
||||||
|
destroy_all_dbs
|
||||||
|
);
|
||||||
|
#import_db_tableidentifier
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::SqlProcessor qw(
|
||||||
|
registertableinfo
|
||||||
|
create_targettable
|
||||||
|
checktableinfo
|
||||||
|
copy_row
|
||||||
|
|
||||||
|
insert_stmt
|
||||||
|
|
||||||
|
process_table
|
||||||
|
);
|
||||||
|
use NGCP::BulkProcessor::SqlRecord qw();
|
||||||
|
|
||||||
|
#use NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber qw();
|
||||||
|
|
||||||
|
require Exporter;
|
||||||
|
our @ISA = qw(Exporter NGCP::BulkProcessor::SqlRecord);
|
||||||
|
our @EXPORT_OK = qw(
|
||||||
|
create_table
|
||||||
|
gettablename
|
||||||
|
check_table
|
||||||
|
getinsertstatement
|
||||||
|
getupsertstatement
|
||||||
|
|
||||||
|
findby_ccacsn
|
||||||
|
countby_ccacsn
|
||||||
|
|
||||||
|
findby_domain_sipusername
|
||||||
|
findby_domain_webusername
|
||||||
|
list_domain_billingprofilename_resellernames
|
||||||
|
findby_sipusername
|
||||||
|
list_barring_resellernames
|
||||||
|
|
||||||
|
update_delta
|
||||||
|
findby_delta
|
||||||
|
countby_delta
|
||||||
|
|
||||||
|
$deleted_delta
|
||||||
|
$updated_delta
|
||||||
|
$added_delta
|
||||||
|
|
||||||
|
process_records
|
||||||
|
|
||||||
|
@fieldnames
|
||||||
|
);
|
||||||
|
# findby_ccacsn
|
||||||
|
# countby_ccacsn
|
||||||
|
|
||||||
|
# findby_domain_sipusername
|
||||||
|
# findby_domain_webusername
|
||||||
|
# list_domain_billingprofilename_resellernames
|
||||||
|
# findby_sipusername
|
||||||
|
# list_barring_resellernames
|
||||||
|
|
||||||
|
my $tablename = 'subscriber';
|
||||||
|
my $get_db = \&get_import_db;
|
||||||
|
#my $get_tablename = \&import_db_tableidentifier;
|
||||||
|
|
||||||
|
my @csv_cols = (
|
||||||
|
# fields in order of cols from .csv
|
||||||
|
"_rownum",
|
||||||
|
"_dn",
|
||||||
|
"_txt_sw_username",
|
||||||
|
"sip_password", #"Subscriber sip password",
|
||||||
|
"_len",
|
||||||
|
"_cpe_mta_mac_address",
|
||||||
|
"_cpe_model",
|
||||||
|
"_cpe_vendor",
|
||||||
|
"customer_id", #"Customer ID",
|
||||||
|
);
|
||||||
|
|
||||||
|
our @fieldnames = (
|
||||||
|
@csv_cols,
|
||||||
|
"reseller_name", #"Reseller name",
|
||||||
|
"domain", #"Sip domain name",
|
||||||
|
"billing_profile_name", #"Billing profile name",
|
||||||
|
"sip_username", #"Subscriber sip username",
|
||||||
|
"cc", #"Subscriber primary number - country code (cc)",
|
||||||
|
"ac", #"Subscriber primary number - country code (ac)",
|
||||||
|
"sn", #"Subscriber primary number - country code (sn)",
|
||||||
|
"web_username", #"Subscriber web username",
|
||||||
|
"web_password", #"Subscriber web password",
|
||||||
|
"barring",
|
||||||
|
#"allowed_ips",
|
||||||
|
#"channels",
|
||||||
|
#"voicemail",
|
||||||
|
|
||||||
|
#calculated fields at the end!
|
||||||
|
'rownum',
|
||||||
|
#'range',
|
||||||
|
#'contact_hash',
|
||||||
|
'filenum',
|
||||||
|
'filename',
|
||||||
|
);
|
||||||
|
my $expected_fieldnames = [
|
||||||
|
@fieldnames,
|
||||||
|
'delta',
|
||||||
|
];
|
||||||
|
|
||||||
|
# table creation:
|
||||||
|
my $primarykey_fieldnames = [ 'cc','ac','sn' ];
|
||||||
|
my $indexes = {
|
||||||
|
|
||||||
|
$tablename . '_domain_web_username' => [ 'domain(32)','web_username(32)' ],
|
||||||
|
$tablename . '_domain_sip_username' => [ 'domain(32)','sip_username(32)' ],
|
||||||
|
|
||||||
|
$tablename . '_rownum' => [ 'rownum(11)' ],
|
||||||
|
$tablename . '_delta' => [ 'delta(7)' ],};
|
||||||
|
#my $fixtable_statements = [];
|
||||||
|
|
||||||
|
our $deleted_delta = 'DELETED';
|
||||||
|
our $updated_delta = 'UPDATED';
|
||||||
|
our $added_delta = 'ADDED';
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
|
||||||
|
my $class = shift;
|
||||||
|
my $self = NGCP::BulkProcessor::SqlRecord->new($class,$get_db,
|
||||||
|
$tablename,$expected_fieldnames,$indexes);
|
||||||
|
|
||||||
|
copy_row($self,shift,$expected_fieldnames);
|
||||||
|
|
||||||
|
return $self;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub create_table {
|
||||||
|
|
||||||
|
my ($truncate) = @_;
|
||||||
|
|
||||||
|
my $db = &$get_db();
|
||||||
|
|
||||||
|
registertableinfo($db,__PACKAGE__,$tablename,$expected_fieldnames,$indexes,$primarykey_fieldnames);
|
||||||
|
return create_targettable($db,__PACKAGE__,$db,__PACKAGE__,$tablename,$truncate,0,undef);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub findby_delta {
|
||||||
|
|
||||||
|
my ($delta,$load_recursive) = @_;
|
||||||
|
|
||||||
|
check_table();
|
||||||
|
my $db = &$get_db();
|
||||||
|
my $table = $db->tableidentifier($tablename);
|
||||||
|
|
||||||
|
return [] unless defined $delta;
|
||||||
|
|
||||||
|
my $rows = $db->db_get_all_arrayref(
|
||||||
|
'SELECT * FROM ' .
|
||||||
|
$table .
|
||||||
|
' WHERE ' .
|
||||||
|
$db->columnidentifier('delta') . ' = ?'
|
||||||
|
,$delta);
|
||||||
|
|
||||||
|
return buildrecords_fromrows($rows,$load_recursive);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub findby_ccacsn {
|
||||||
|
|
||||||
|
my ($cc,$ac,$sn,$load_recursive) = @_;
|
||||||
|
|
||||||
|
check_table();
|
||||||
|
my $db = &$get_db();
|
||||||
|
my $table = $db->tableidentifier($tablename);
|
||||||
|
|
||||||
|
return [] unless (defined $cc or defined $ac or defined $sn);
|
||||||
|
|
||||||
|
my $rows = $db->db_get_all_arrayref(
|
||||||
|
'SELECT * FROM ' .
|
||||||
|
$table .
|
||||||
|
' WHERE ' .
|
||||||
|
$db->columnidentifier('cc') . ' = ?' .
|
||||||
|
' AND ' . $db->columnidentifier('ac') . ' = ?' .
|
||||||
|
' AND ' . $db->columnidentifier('sn') . ' = ?'
|
||||||
|
,$cc,$ac,$sn);
|
||||||
|
|
||||||
|
return buildrecords_fromrows($rows,$load_recursive)->[0];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub findby_domain_sipusername {
|
||||||
|
|
||||||
|
my ($domain,$sip_username,$load_recursive) = @_;
|
||||||
|
|
||||||
|
check_table();
|
||||||
|
my $db = &$get_db();
|
||||||
|
my $table = $db->tableidentifier($tablename);
|
||||||
|
|
||||||
|
#return [] unless (defined $cc or defined $ac or defined $sn);
|
||||||
|
|
||||||
|
my $rows = $db->db_get_all_arrayref(
|
||||||
|
$db->paginate_sort_query('SELECT * FROM ' .
|
||||||
|
$table .
|
||||||
|
' WHERE ' .
|
||||||
|
$db->columnidentifier('domain') . ' = ?' .
|
||||||
|
' AND ' . $db->columnidentifier('sip_username') . ' = ?',
|
||||||
|
undef,undef,[{
|
||||||
|
column => 'filenum',
|
||||||
|
numeric => 1,
|
||||||
|
dir => 1,
|
||||||
|
},{
|
||||||
|
column => 'rownum',
|
||||||
|
numeric => 1,
|
||||||
|
dir => 1,
|
||||||
|
}])
|
||||||
|
,$domain,$sip_username);
|
||||||
|
|
||||||
|
return buildrecords_fromrows($rows,$load_recursive);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub findby_domain_webusername {
|
||||||
|
|
||||||
|
my ($domain,$web_username,$load_recursive) = @_;
|
||||||
|
|
||||||
|
check_table();
|
||||||
|
my $db = &$get_db();
|
||||||
|
my $table = $db->tableidentifier($tablename);
|
||||||
|
|
||||||
|
#return [] unless (defined $cc or defined $ac or defined $sn);
|
||||||
|
|
||||||
|
my $rows = $db->db_get_all_arrayref(
|
||||||
|
$db->paginate_sort_query('SELECT * FROM ' .
|
||||||
|
$table .
|
||||||
|
' WHERE ' .
|
||||||
|
$db->columnidentifier('domain') . ' = ?' .
|
||||||
|
' AND ' . $db->columnidentifier('web_username') . ' = ?',
|
||||||
|
undef,undef,[{
|
||||||
|
column => 'filenum',
|
||||||
|
numeric => 1,
|
||||||
|
dir => 1,
|
||||||
|
},{
|
||||||
|
column => 'rownum',
|
||||||
|
numeric => 1,
|
||||||
|
dir => 1,
|
||||||
|
}])
|
||||||
|
,$domain,$web_username);
|
||||||
|
|
||||||
|
return buildrecords_fromrows($rows,$load_recursive);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub update_delta {
|
||||||
|
|
||||||
|
my ($cc,$ac,$sn,$delta) = @_;
|
||||||
|
|
||||||
|
check_table();
|
||||||
|
my $db = &$get_db();
|
||||||
|
my $table = $db->tableidentifier($tablename);
|
||||||
|
|
||||||
|
my $stmt = 'UPDATE ' . $table . ' SET delta = ?';
|
||||||
|
my @params = ();
|
||||||
|
push(@params,$delta);
|
||||||
|
if (defined $cc or defined $ac or defined $sn) {
|
||||||
|
$stmt .= ' WHERE ' .
|
||||||
|
$db->columnidentifier('cc') . ' = ?' .
|
||||||
|
' AND ' . $db->columnidentifier('ac') . ' = ?' .
|
||||||
|
' AND ' . $db->columnidentifier('sn') . ' = ?';
|
||||||
|
push(@params,$cc,$ac,$sn);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $db->db_do($stmt,@params);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub countby_ccacsn {
|
||||||
|
|
||||||
|
my ($cc,$ac,$sn) = @_;
|
||||||
|
|
||||||
|
check_table();
|
||||||
|
my $db = &$get_db();
|
||||||
|
my $table = $db->tableidentifier($tablename);
|
||||||
|
|
||||||
|
my $stmt = 'SELECT COUNT(*) FROM ' . $table;
|
||||||
|
my @params = ();
|
||||||
|
if (defined $cc or defined $ac or defined $sn) {
|
||||||
|
$stmt .= ' WHERE ' .
|
||||||
|
$db->columnidentifier('cc') . ' = ?' .
|
||||||
|
' AND ' . $db->columnidentifier('ac') . ' = ?' .
|
||||||
|
' AND ' . $db->columnidentifier('sn') . ' = ?';
|
||||||
|
push(@params,$cc,$ac,$sn);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $db->db_get_value($stmt,@params);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub countby_delta {
|
||||||
|
|
||||||
|
my ($deltas) = @_;
|
||||||
|
|
||||||
|
check_table();
|
||||||
|
my $db = &$get_db();
|
||||||
|
my $table = $db->tableidentifier($tablename);
|
||||||
|
|
||||||
|
my $stmt = 'SELECT COUNT(*) FROM ' . $table . ' WHERE 1=1';
|
||||||
|
my @params = ();
|
||||||
|
if (defined $deltas and 'HASH' eq ref $deltas) {
|
||||||
|
foreach my $in (keys %$deltas) {
|
||||||
|
my @values = (defined $deltas->{$in} and 'ARRAY' eq ref $deltas->{$in} ? @{$deltas->{$in}} : ($deltas->{$in}));
|
||||||
|
$stmt .= ' AND ' . $db->columnidentifier('delta') . ' ' . $in . ' (' . substr(',?' x scalar @values,1) . ')';
|
||||||
|
push(@params,@values);
|
||||||
|
}
|
||||||
|
} elsif (defined $deltas and length($deltas) > 0) {
|
||||||
|
$stmt .= ' AND ' . $db->columnidentifier('delta') . ' = ?';
|
||||||
|
push(@params,$deltas);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $db->db_get_value($stmt,@params);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub list_domain_billingprofilename_resellernames {
|
||||||
|
|
||||||
|
check_table();
|
||||||
|
my $db = &$get_db();
|
||||||
|
my $table = $db->tableidentifier($tablename);
|
||||||
|
|
||||||
|
my @cols = map { $db->columnidentifier($_); } qw/domain billing_profile_name reseller_name/;
|
||||||
|
my $stmt = 'SELECT ' . join(',',@cols) . ' FROM ' . $table . ' GROUP BY ' . join(',',@cols);
|
||||||
|
my @params = ();
|
||||||
|
|
||||||
|
return $db->db_get_all_arrayref($stmt,@params);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub list_barring_resellernames {
|
||||||
|
|
||||||
|
check_table();
|
||||||
|
my $db = &$get_db();
|
||||||
|
my $table = $db->tableidentifier($tablename);
|
||||||
|
|
||||||
|
my @cols = map { $db->columnidentifier($_); } qw/barring reseller_name/;
|
||||||
|
my $stmt = 'SELECT ' . join(',',@cols) . ' FROM ' . $table . ' GROUP BY ' . join(',',@cols);
|
||||||
|
my @params = ();
|
||||||
|
|
||||||
|
return $db->db_get_all_arrayref($stmt,@params);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub buildrecords_fromrows {
|
||||||
|
|
||||||
|
my ($rows,$load_recursive) = @_;
|
||||||
|
|
||||||
|
my @records = ();
|
||||||
|
my $record;
|
||||||
|
|
||||||
|
if (defined $rows and ref $rows eq 'ARRAY') {
|
||||||
|
foreach my $row (@$rows) {
|
||||||
|
$record = __PACKAGE__->new($row);
|
||||||
|
|
||||||
|
# transformations go here ...
|
||||||
|
|
||||||
|
push @records,$record;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return \@records;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub process_records {
|
||||||
|
|
||||||
|
my %params = @_;
|
||||||
|
my ($process_code,
|
||||||
|
$static_context,
|
||||||
|
$init_process_context_code,
|
||||||
|
$uninit_process_context_code,
|
||||||
|
$multithreading,
|
||||||
|
$numofthreads) = @params{qw/
|
||||||
|
process_code
|
||||||
|
static_context
|
||||||
|
init_process_context_code
|
||||||
|
uninit_process_context_code
|
||||||
|
multithreading
|
||||||
|
numofthreads
|
||||||
|
/};
|
||||||
|
|
||||||
|
check_table();
|
||||||
|
my $db = &$get_db();
|
||||||
|
my $table = $db->tableidentifier($tablename);
|
||||||
|
|
||||||
|
my @cols = map { $db->columnidentifier($_); } qw/domain sip_username/;
|
||||||
|
|
||||||
|
return process_table(
|
||||||
|
get_db => $get_db,
|
||||||
|
class => __PACKAGE__,
|
||||||
|
process_code => sub {
|
||||||
|
my ($context,$rowblock,$row_offset) = @_;
|
||||||
|
return &$process_code($context,$rowblock,$row_offset);
|
||||||
|
},
|
||||||
|
static_context => $static_context,
|
||||||
|
init_process_context_code => $init_process_context_code,
|
||||||
|
uninit_process_context_code => $uninit_process_context_code,
|
||||||
|
destroy_reader_dbs_code => \&destroy_all_dbs,
|
||||||
|
multithreading => $multithreading,
|
||||||
|
tableprocessing_threads => $numofthreads,
|
||||||
|
#'select' => 'SELECT ' . join(',',@cols) . ' FROM ' . $table . ' GROUP BY ' . join(',',@cols),
|
||||||
|
'select' => $db->paginate_sort_query('SELECT ' . join(',',@cols) . ' FROM ' . $table . ' GROUP BY ' . join(',',@cols),undef,undef,[{
|
||||||
|
column => 'filenum',
|
||||||
|
numeric => 1,
|
||||||
|
dir => 1,
|
||||||
|
},{
|
||||||
|
column => 'rownum',
|
||||||
|
numeric => 1,
|
||||||
|
dir => 1,
|
||||||
|
}]),
|
||||||
|
'selectcount' => 'SELECT COUNT(*) FROM (SELECT ' . join(',',@cols) . ' FROM ' . $table . ' GROUP BY ' . join(',',@cols) . ') AS g',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getinsertstatement {
|
||||||
|
|
||||||
|
my ($insert_ignore) = @_;
|
||||||
|
check_table();
|
||||||
|
return insert_stmt($get_db,__PACKAGE__,$insert_ignore);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getupsertstatement {
|
||||||
|
|
||||||
|
check_table();
|
||||||
|
my $db = &$get_db();
|
||||||
|
my $table = $db->tableidentifier($tablename);
|
||||||
|
my $upsert_stmt = 'INSERT OR REPLACE INTO ' . $table . ' (' .
|
||||||
|
join(', ',map { local $_ = $_; $_ = $db->columnidentifier($_); $_; } @$expected_fieldnames) . ')';
|
||||||
|
my @values = ();
|
||||||
|
foreach my $fieldname (@$expected_fieldnames) {
|
||||||
|
if ('delta' eq $fieldname) {
|
||||||
|
my $stmt = 'SELECT \'' . $updated_delta . '\' FROM ' . $table . ' WHERE ' .
|
||||||
|
$db->columnidentifier('cc') . ' = ?' .
|
||||||
|
' AND ' . $db->columnidentifier('ac') . ' = ?' .
|
||||||
|
' AND ' . $db->columnidentifier('sn') . ' = ?';
|
||||||
|
push(@values,'COALESCE((' . $stmt . '), \'' . $added_delta . '\')');
|
||||||
|
} else {
|
||||||
|
push(@values,'?');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$upsert_stmt .= ' VALUES (' . join(',',@values) . ')';
|
||||||
|
return $upsert_stmt;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub gettablename {
|
||||||
|
|
||||||
|
return $tablename;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_table {
|
||||||
|
|
||||||
|
return checktableinfo($get_db,
|
||||||
|
__PACKAGE__,$tablename,
|
||||||
|
$expected_fieldnames,
|
||||||
|
$indexes);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
@ -0,0 +1,290 @@
|
|||||||
|
package NGCP::BulkProcessor::Projects::Migration::UPCAT::Import;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
## no critic
|
||||||
|
|
||||||
|
use threads::shared qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::Settings qw(
|
||||||
|
$provision_subscriber_rownum_start
|
||||||
|
$import_multithreading
|
||||||
|
$subscriber_import_numofthreads
|
||||||
|
$ignore_subscriber_unique
|
||||||
|
$subscriber_import_single_row_txn
|
||||||
|
|
||||||
|
$skip_errors
|
||||||
|
|
||||||
|
$default_domain
|
||||||
|
$default_reseller_name
|
||||||
|
$default_billing_profile_name
|
||||||
|
$default_barring
|
||||||
|
$cc_ac_map
|
||||||
|
$default_cc
|
||||||
|
$cc_len_min
|
||||||
|
$cc_len_max
|
||||||
|
$ac_len
|
||||||
|
);
|
||||||
|
use NGCP::BulkProcessor::Logging qw (
|
||||||
|
getlogger
|
||||||
|
processing_info
|
||||||
|
processing_debug
|
||||||
|
);
|
||||||
|
use NGCP::BulkProcessor::LogError qw(
|
||||||
|
fileprocessingwarn
|
||||||
|
fileprocessingerror
|
||||||
|
);
|
||||||
|
|
||||||
|
#use NGCP::BulkProcessor::Projects::Migration::UPCAT::FileProcessors::CSVFile qw();
|
||||||
|
use NGCP::BulkProcessor::FileProcessors::CSVFileSimple qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::ProjectConnectorPool qw(
|
||||||
|
get_import_db
|
||||||
|
destroy_all_dbs
|
||||||
|
);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Array qw(removeduplicates);
|
||||||
|
use NGCP::BulkProcessor::Utils qw(threadid zerofill trim);
|
||||||
|
use NGCP::BulkProcessor::Table qw(get_rowhash);
|
||||||
|
|
||||||
|
require Exporter;
|
||||||
|
our @ISA = qw(Exporter);
|
||||||
|
our @EXPORT_OK = qw(
|
||||||
|
import_subscriber
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
sub import_subscriber {
|
||||||
|
|
||||||
|
my (@files) = @_;
|
||||||
|
|
||||||
|
my $result = NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::create_table(0);
|
||||||
|
|
||||||
|
foreach my $file (@files) {
|
||||||
|
$result &= _import_subscriber_checks($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
#my $importer = NGCP::BulkProcessor::Projects::Migration::UPCAT::FileProcessors::CSVFile->new($subscriber_import_numofthreads);
|
||||||
|
my $importer = NGCP::BulkProcessor::FileProcessors::CSVFileSimple->new($subscriber_import_numofthreads);
|
||||||
|
|
||||||
|
my $upsert = _import_subscriber_reset_delta();
|
||||||
|
|
||||||
|
destroy_all_dbs(); #close all db connections before forking..
|
||||||
|
my $warning_count :shared = 0;
|
||||||
|
my $filenum = 0;
|
||||||
|
foreach my $file (@files) {
|
||||||
|
$filenum++;
|
||||||
|
$result &= $importer->process(
|
||||||
|
file => $file,
|
||||||
|
process_code => sub {
|
||||||
|
my ($context,$rows,$row_offset) = @_;
|
||||||
|
my $rownum = $row_offset;
|
||||||
|
my @subscriber_rows = ();
|
||||||
|
foreach my $row (@$rows) {
|
||||||
|
$rownum++;
|
||||||
|
next if (defined $provision_subscriber_rownum_start and $rownum < $provision_subscriber_rownum_start);
|
||||||
|
next if (scalar @$row) == 0;
|
||||||
|
$row = [ map { local $_ = $_; trim($_); $_ =~ s/^"//; $_ =~ s/"$//r; } @$row ];
|
||||||
|
my $record = NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber->new($row);
|
||||||
|
$record->{reseller_name} = $default_reseller_name;
|
||||||
|
($record->{sip_username},$record->{domain}) = split('@',$record->{_txt_sw_username},2);
|
||||||
|
$record->{domain} //= $default_domain;
|
||||||
|
$record->{billing_profile_name} = $default_billing_profile_name;
|
||||||
|
($record->{cc},$record->{ac},$record->{sn}) = _split_dn($record->{_dn});
|
||||||
|
$record->{web_username} = undef;
|
||||||
|
$record->{web_password} = undef;
|
||||||
|
$record->{barring} = $default_barring;
|
||||||
|
#$record->{allowed_ips}
|
||||||
|
#"channels",
|
||||||
|
#"voicemail",
|
||||||
|
|
||||||
|
$record->{rownum} = $rownum;
|
||||||
|
$record->{filenum} = $filenum;
|
||||||
|
$record->{filename} = $file;
|
||||||
|
|
||||||
|
my %r = %$record; my @row_ext = @r{@NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::fieldnames};
|
||||||
|
if ($context->{upsert}) {
|
||||||
|
push(@row_ext,$record->{cc},$record->{ac},$record->{sn});
|
||||||
|
} else {
|
||||||
|
push(@row_ext,$NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::added_delta);
|
||||||
|
}
|
||||||
|
push(@subscriber_rows,\@row_ext); # if &{$context->{check_number_code}}($context,$record);
|
||||||
|
|
||||||
|
#my %r = %$record;
|
||||||
|
#$record->{contact_hash} = get_rowhash([@r{@NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::contact_fieldnames}]);
|
||||||
|
#next unless _unfold_number_ranges($context,$record,\@subscriber_rows);
|
||||||
|
if ($subscriber_import_single_row_txn and (scalar @subscriber_rows) > 0) {
|
||||||
|
while (defined (my $subscriber_row = shift @subscriber_rows)) {
|
||||||
|
if ($skip_errors) {
|
||||||
|
eval { _insert_subscriber_rows($context,[$subscriber_row]); };
|
||||||
|
_warn($context,$@) if $@;
|
||||||
|
} else {
|
||||||
|
_insert_subscriber_rows($context,[$subscriber_row]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (not $subscriber_import_single_row_txn and (scalar @subscriber_rows) > 0) {
|
||||||
|
if ($skip_errors) {
|
||||||
|
eval { _insert_subscriber_rows($context,\@subscriber_rows); };
|
||||||
|
_warn($context,$@) if $@;
|
||||||
|
} else {
|
||||||
|
_insert_subscriber_rows($context,\@subscriber_rows);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#use Data::Dumper;
|
||||||
|
#print Dumper(\@subscriber_rows);
|
||||||
|
return 1;
|
||||||
|
},
|
||||||
|
init_process_context_code => sub {
|
||||||
|
my ($context)= @_;
|
||||||
|
$context->{db} = &get_import_db(); # keep ref count low..
|
||||||
|
$context->{upsert} = $upsert;
|
||||||
|
#$context->{unfold_ranges} = $subscriber_import_unfold_ranges;
|
||||||
|
#$context->{fieldnames} = \@NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::fieldnames;
|
||||||
|
#$context->{added_delta} = $NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::added_delta;
|
||||||
|
#$context->{create_new_record_code} = sub {
|
||||||
|
# return NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber->new(shift);
|
||||||
|
#};
|
||||||
|
|
||||||
|
#$context->{check_number_code} = sub {
|
||||||
|
# my ($context,$record) = @_;
|
||||||
|
# my $result = 1;
|
||||||
|
# my $number = $record->{dn};
|
||||||
|
# my $number = $record->{cc} . $record->{ac} . $record->{sn};
|
||||||
|
# if (NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::findby_ccacsn($record->{cc},$record->{ac},$record->{sn})) {
|
||||||
|
# if ($skip_errors) {
|
||||||
|
# _warn($context,"$record->{sip_username}: duplicate number $number");
|
||||||
|
# } else {
|
||||||
|
# _error($context,"$record->{sip_username}: duplicate number $number");
|
||||||
|
# }
|
||||||
|
# $result = 0;
|
||||||
|
# }
|
||||||
|
# return $result;
|
||||||
|
#};
|
||||||
|
$context->{error_count} = 0;
|
||||||
|
$context->{warning_count} = 0;
|
||||||
|
},
|
||||||
|
uninit_process_context_code => sub {
|
||||||
|
my ($context)= @_;
|
||||||
|
undef $context->{db};
|
||||||
|
destroy_all_dbs();
|
||||||
|
{
|
||||||
|
lock $warning_count;
|
||||||
|
$warning_count += $context->{warning_count};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
multithreading => $import_multithreading
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($result,$warning_count);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _import_subscriber_checks {
|
||||||
|
my ($file) = @_;
|
||||||
|
my $result = 1;
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _import_subscriber_reset_delta {
|
||||||
|
my $upsert = 0;
|
||||||
|
if (NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::countby_ccacsn() > 0) {
|
||||||
|
processing_info(threadid(),'resetting delta of ' .
|
||||||
|
NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::update_delta(undef,undef,undef,
|
||||||
|
$NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::deleted_delta) .
|
||||||
|
' subscriber records',getlogger(__PACKAGE__));
|
||||||
|
$upsert |= 1;
|
||||||
|
}
|
||||||
|
return $upsert;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _insert_subscriber_rows {
|
||||||
|
my ($context,$subscriber_rows) = @_;
|
||||||
|
$context->{db}->db_do_begin(
|
||||||
|
($context->{upsert} ?
|
||||||
|
NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::getupsertstatement()
|
||||||
|
: NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::getinsertstatement($ignore_subscriber_unique)),
|
||||||
|
#NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::gettablename(),
|
||||||
|
#lock
|
||||||
|
);
|
||||||
|
eval {
|
||||||
|
$context->{db}->db_do_rowblock($subscriber_rows);
|
||||||
|
$context->{db}->db_finish();
|
||||||
|
};
|
||||||
|
my $err = $@;
|
||||||
|
if ($err) {
|
||||||
|
eval {
|
||||||
|
$context->{db}->db_finish(1);
|
||||||
|
};
|
||||||
|
die($err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _split_dn {
|
||||||
|
my ($dn) = @_;
|
||||||
|
my ($cc,$ac,$sn) = ('','',$dn);
|
||||||
|
if ($cc_ac_map) {
|
||||||
|
if ($default_cc) {
|
||||||
|
$cc = $default_cc;
|
||||||
|
$dn =~ s/^0//;
|
||||||
|
$sn = $dn;
|
||||||
|
} else {
|
||||||
|
foreach my $cc_length ($cc_len_min .. $cc_len_max) {
|
||||||
|
my ($_cc,$_dn) = (substr($dn,0,$cc_length), substr($dn,$cc_length));
|
||||||
|
if (exists $cc_ac_map->{$_cc}) {
|
||||||
|
$cc = $_cc;
|
||||||
|
$sn = $_dn;
|
||||||
|
$dn = $_dn;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (exists $cc_ac_map->{$cc}) {
|
||||||
|
my $ac_map = $cc_ac_map->{$cc};
|
||||||
|
foreach my $ac_length ($ac_len->{$cc}->{min} .. $ac_len->{$cc}->{max}) {
|
||||||
|
my ($_ac,$_sn) = (substr($dn,0,$ac_length), substr($dn,$ac_length));
|
||||||
|
if (exists $ac_map->{$_ac}) {
|
||||||
|
$ac = $_ac;
|
||||||
|
$sn = $_sn;
|
||||||
|
#$dn = '';
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ($cc,$ac,$sn);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _error {
|
||||||
|
|
||||||
|
my ($context,$message) = @_;
|
||||||
|
$context->{error_count} = $context->{error_count} + 1;
|
||||||
|
fileprocessingerror($context->{filename},$message,getlogger(__PACKAGE__));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _warn {
|
||||||
|
|
||||||
|
my ($context,$message) = @_;
|
||||||
|
$context->{warning_count} = $context->{warning_count} + 1;
|
||||||
|
fileprocessingwarn($context->{filename},$message,getlogger(__PACKAGE__));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _info {
|
||||||
|
|
||||||
|
my ($context,$message,$debug) = @_;
|
||||||
|
if ($debug) {
|
||||||
|
processing_debug($context->{tid},$message,getlogger(__PACKAGE__));
|
||||||
|
} else {
|
||||||
|
processing_info($context->{tid},$message,getlogger(__PACKAGE__));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
@ -0,0 +1,182 @@
|
|||||||
|
package NGCP::BulkProcessor::Projects::Migration::UPCAT::Preferences;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
## no critic
|
||||||
|
|
||||||
|
no strict 'refs';
|
||||||
|
|
||||||
|
use threads::shared qw();
|
||||||
|
#use List::Util qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::Settings qw(
|
||||||
|
$dry
|
||||||
|
$skip_errors
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Logging qw (
|
||||||
|
getlogger
|
||||||
|
processing_info
|
||||||
|
processing_debug
|
||||||
|
);
|
||||||
|
use NGCP::BulkProcessor::LogError qw(
|
||||||
|
rowprocessingerror
|
||||||
|
rowprocessingwarn
|
||||||
|
);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::ncos_levels qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::domains qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::domain_resellers qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::voip_subscribers qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_subscribers qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::ConnectorPool qw(
|
||||||
|
get_xa_db
|
||||||
|
);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::ProjectConnectorPool qw(
|
||||||
|
destroy_all_dbs
|
||||||
|
);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Utils qw(threadid);
|
||||||
|
|
||||||
|
require Exporter;
|
||||||
|
our @ISA = qw(Exporter);
|
||||||
|
our @EXPORT_OK = qw(
|
||||||
|
|
||||||
|
clear_subscriber_preferences
|
||||||
|
delete_subscriber_preference
|
||||||
|
set_subscriber_preference
|
||||||
|
get_subscriber_preference
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
my %get_preference_sub_names = (
|
||||||
|
voip_usr_preferences => 'findby_subscriberid_attributeid',
|
||||||
|
);
|
||||||
|
my %preference_id_cols = (
|
||||||
|
voip_usr_preferences => 'subscriber_id',
|
||||||
|
);
|
||||||
|
|
||||||
|
sub clear_subscriber_preferences {
|
||||||
|
my ($context,$subscriber_id,$attribute,$except_value) = @_;
|
||||||
|
return _clear_preferences($context,'voip_usr_preferences',$subscriber_id,$attribute,$except_value);
|
||||||
|
}
|
||||||
|
sub delete_subscriber_preference {
|
||||||
|
my ($context,$subscriber_id,$attribute,$value) = @_;
|
||||||
|
return _delete_preference($context,'voip_usr_preferences',$subscriber_id,$attribute,$value);
|
||||||
|
}
|
||||||
|
sub set_subscriber_preference {
|
||||||
|
my ($context,$subscriber_id,$attribute,$value) = @_;
|
||||||
|
return _set_preference($context,'voip_usr_preferences',$subscriber_id,$attribute,$value);
|
||||||
|
}
|
||||||
|
sub get_subscriber_preference {
|
||||||
|
my ($context,$subscriber_id,$attribute) = @_;
|
||||||
|
return _get_preference($context,'voip_usr_preferences',$subscriber_id,$attribute);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _clear_preferences {
|
||||||
|
my ($context,$pref_type,$id,$attribute,$except_value) = @_;
|
||||||
|
|
||||||
|
return &{'NGCP::BulkProcessor::Dao::Trunk::provisioning::' . $pref_type . '::delete_preferences'}($context->{db},
|
||||||
|
$id, $attribute->{id}, defined $except_value ? { 'NOT IN' => $except_value } : undef);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _delete_preference {
|
||||||
|
my ($context,$pref_type,$id,$attribute,$value) = @_;
|
||||||
|
|
||||||
|
return &{'NGCP::BulkProcessor::Dao::Trunk::provisioning::' . $pref_type . '::delete_preferences'}($context->{db},
|
||||||
|
$id, $attribute->{id}, { 'IN' => $value } );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _set_preference {
|
||||||
|
my ($context,$pref_type,$id,$attribute,$value) = @_;
|
||||||
|
|
||||||
|
if ($attribute->{max_occur} == 1) {
|
||||||
|
my $old_preferences = &{'NGCP::BulkProcessor::Dao::Trunk::provisioning::' . $pref_type . '::' . $get_preference_sub_names{$pref_type}}($context->{db},
|
||||||
|
$id,$attribute->{id});
|
||||||
|
if (defined $value) {
|
||||||
|
if ((scalar @$old_preferences) == 1) {
|
||||||
|
&{'NGCP::BulkProcessor::Dao::Trunk::provisioning::' . $pref_type . '::update_row'}($context->{db},{
|
||||||
|
id => $old_preferences->[0]->{id},
|
||||||
|
value => $value,
|
||||||
|
});
|
||||||
|
return $old_preferences->[0]->{id};
|
||||||
|
} else {
|
||||||
|
if ((scalar @$old_preferences) > 1) {
|
||||||
|
&{'NGCP::BulkProcessor::Dao::Trunk::provisioning::' . $pref_type . '::delete_preferences'}($context->{db},
|
||||||
|
$id,$attribute->{id});
|
||||||
|
}
|
||||||
|
return &{'NGCP::BulkProcessor::Dao::Trunk::provisioning::' . $pref_type . '::insert_row'}($context->{db},
|
||||||
|
attribute_id => $attribute->{id},
|
||||||
|
$preference_id_cols{$pref_type} => $id,
|
||||||
|
value => $value,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
&{'NGCP::BulkProcessor::Dao::Trunk::provisioning::' . $pref_type . '::delete_preferences'}($context->{db},
|
||||||
|
$id,$attribute->{id});
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (defined $value) {
|
||||||
|
return &{'NGCP::BulkProcessor::Dao::Trunk::provisioning::' . $pref_type . '::insert_row'}($context->{db},
|
||||||
|
attribute_id => $attribute->{id},
|
||||||
|
$preference_id_cols{$pref_type} => $id,
|
||||||
|
value => $value,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _get_preference {
|
||||||
|
my ($context,$pref_type,$id,$attribute) = @_;
|
||||||
|
|
||||||
|
my $preferences = &{'NGCP::BulkProcessor::Dao::Trunk::provisioning::' . $pref_type . '::' . $get_preference_sub_names{$pref_type}}($context->{db},
|
||||||
|
$id,$attribute->{id});
|
||||||
|
|
||||||
|
if ($attribute->{max_occur} == 1) {
|
||||||
|
return $preferences->[0];
|
||||||
|
} else {
|
||||||
|
return $preferences;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _error {
|
||||||
|
|
||||||
|
my ($context,$message) = @_;
|
||||||
|
$context->{error_count} = $context->{error_count} + 1;
|
||||||
|
rowprocessingerror($context->{tid},$message,getlogger(__PACKAGE__));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _warn {
|
||||||
|
|
||||||
|
my ($context,$message) = @_;
|
||||||
|
$context->{warning_count} = $context->{warning_count} + 1;
|
||||||
|
rowprocessingwarn($context->{tid},$message,getlogger(__PACKAGE__));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _info {
|
||||||
|
|
||||||
|
my ($context,$message,$debug) = @_;
|
||||||
|
if ($debug) {
|
||||||
|
processing_debug($context->{tid},$message,getlogger(__PACKAGE__));
|
||||||
|
} else {
|
||||||
|
processing_info($context->{tid},$message,getlogger(__PACKAGE__));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
@ -0,0 +1,101 @@
|
|||||||
|
package NGCP::BulkProcessor::Projects::Migration::UPCAT::ProjectConnectorPool;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
## no critic
|
||||||
|
|
||||||
|
use File::Basename;
|
||||||
|
use Cwd;
|
||||||
|
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../');
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::Settings qw(
|
||||||
|
$import_db_file
|
||||||
|
);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::ConnectorPool qw(
|
||||||
|
get_connectorinstancename
|
||||||
|
ping
|
||||||
|
);
|
||||||
|
|
||||||
|
#use NGCP::BulkProcessor::SqlConnectors::MySQLDB;
|
||||||
|
#use NGCP::BulkProcessor::SqlConnectors::OracleDB;
|
||||||
|
#use NGCP::BulkProcessor::SqlConnectors::PostgreSQLDB;
|
||||||
|
use NGCP::BulkProcessor::SqlConnectors::SQLiteDB qw(
|
||||||
|
$staticdbfilemode
|
||||||
|
cleanupdbfiles
|
||||||
|
);
|
||||||
|
#use NGCP::BulkProcessor::SqlConnectors::CSVDB;
|
||||||
|
#use NGCP::BulkProcessor::SqlConnectors::SQLServerDB;
|
||||||
|
#use NGCP::BulkProcessor::RestConnectors::NGCPRestApi;
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::SqlProcessor qw(cleartableinfo);
|
||||||
|
|
||||||
|
require Exporter;
|
||||||
|
our @ISA = qw(Exporter);
|
||||||
|
our @EXPORT_OK = qw(
|
||||||
|
get_import_db
|
||||||
|
import_db_tableidentifier
|
||||||
|
|
||||||
|
destroy_dbs
|
||||||
|
destroy_all_dbs
|
||||||
|
|
||||||
|
ping_dbs
|
||||||
|
ping_all_dbs
|
||||||
|
);
|
||||||
|
|
||||||
|
# thread connector pools:
|
||||||
|
my $import_dbs = {};
|
||||||
|
|
||||||
|
|
||||||
|
sub get_import_db {
|
||||||
|
|
||||||
|
my ($instance_name,$reconnect) = @_;
|
||||||
|
my $name = get_connectorinstancename($instance_name); #threadid(); #shift;
|
||||||
|
|
||||||
|
if (not defined $import_dbs->{$name}) {
|
||||||
|
$import_dbs->{$name} = NGCP::BulkProcessor::SqlConnectors::SQLiteDB->new($instance_name); #$name);
|
||||||
|
if (not defined $reconnect) {
|
||||||
|
$reconnect = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($reconnect) {
|
||||||
|
$import_dbs->{$name}->db_connect($staticdbfilemode,$import_db_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $import_dbs->{$name};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub import_db_tableidentifier {
|
||||||
|
|
||||||
|
my ($get_target_db,$tablename) = @_;
|
||||||
|
my $target_db = (ref $get_target_db eq 'CODE') ? &$get_target_db() : $get_target_db;
|
||||||
|
return $target_db->getsafetablename(NGCP::BulkProcessor::SqlConnectors::SQLiteDB::get_tableidentifier($tablename,$staticdbfilemode,$import_db_file));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ping_dbs {
|
||||||
|
ping($import_dbs);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ping_all_dbs {
|
||||||
|
ping_dbs();
|
||||||
|
NGCP::BulkProcessor::ConnectorPool::ping_dbs();
|
||||||
|
}
|
||||||
|
|
||||||
|
sub destroy_dbs {
|
||||||
|
|
||||||
|
|
||||||
|
foreach my $name (keys %$import_dbs) {
|
||||||
|
cleartableinfo($import_dbs->{$name});
|
||||||
|
undef $import_dbs->{$name};
|
||||||
|
delete $import_dbs->{$name};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub destroy_all_dbs() {
|
||||||
|
destroy_dbs();
|
||||||
|
NGCP::BulkProcessor::ConnectorPool::destroy_dbs();
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,325 @@
|
|||||||
|
package NGCP::BulkProcessor::Projects::Migration::UPCAT::Settings;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
## no critic
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Globals qw(
|
||||||
|
$working_path
|
||||||
|
$enablemultithreading
|
||||||
|
$cpucount
|
||||||
|
create_path
|
||||||
|
);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Logging qw(
|
||||||
|
getlogger
|
||||||
|
scriptinfo
|
||||||
|
configurationinfo
|
||||||
|
);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::LogError qw(
|
||||||
|
fileerror
|
||||||
|
filewarn
|
||||||
|
configurationwarn
|
||||||
|
configurationerror
|
||||||
|
);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::LoadConfig qw(
|
||||||
|
split_tuple
|
||||||
|
parse_regexp
|
||||||
|
);
|
||||||
|
use NGCP::BulkProcessor::Utils qw(prompt timestampdigits);
|
||||||
|
#format_number check_ipnet
|
||||||
|
|
||||||
|
require Exporter;
|
||||||
|
our @ISA = qw(Exporter);
|
||||||
|
our @EXPORT_OK = qw(
|
||||||
|
update_settings
|
||||||
|
update_cc_ac_map
|
||||||
|
update_barring_profiles
|
||||||
|
check_dry
|
||||||
|
|
||||||
|
$input_path
|
||||||
|
$output_path
|
||||||
|
$report_filename
|
||||||
|
|
||||||
|
$defaultsettings
|
||||||
|
$defaultconfig
|
||||||
|
|
||||||
|
$import_multithreading
|
||||||
|
$run_id
|
||||||
|
$dry
|
||||||
|
$skip_errors
|
||||||
|
$force
|
||||||
|
$import_db_file
|
||||||
|
|
||||||
|
@subscriber_filenames
|
||||||
|
$subscriber_import_numofthreads
|
||||||
|
$ignore_subscriber_unique
|
||||||
|
$subscriber_import_single_row_txn
|
||||||
|
|
||||||
|
$provision_subscriber_rownum_start
|
||||||
|
$provision_subscriber_multithreading
|
||||||
|
$provision_subscriber_numofthreads
|
||||||
|
$webpassword_length
|
||||||
|
$webusername_length
|
||||||
|
$sippassword_length
|
||||||
|
|
||||||
|
$default_domain
|
||||||
|
$default_reseller_name
|
||||||
|
$default_billing_profile_name
|
||||||
|
$default_barring
|
||||||
|
|
||||||
|
$cc_ac_map_yml
|
||||||
|
$cc_ac_map
|
||||||
|
$default_cc
|
||||||
|
$cc_len_min
|
||||||
|
$cc_len_max
|
||||||
|
$ac_len
|
||||||
|
|
||||||
|
$barring_profiles_yml
|
||||||
|
$barring_profiles
|
||||||
|
);
|
||||||
|
#$default_channels_map
|
||||||
|
|
||||||
|
our $defaultconfig = 'config.cfg';
|
||||||
|
our $defaultsettings = 'settings.cfg';
|
||||||
|
|
||||||
|
our $input_path = $working_path . 'input/';
|
||||||
|
our $output_path = $working_path . 'output/';
|
||||||
|
our $report_filename = undef;
|
||||||
|
|
||||||
|
our $force = 0;
|
||||||
|
our $dry = 0;
|
||||||
|
our $skip_errors = 0;
|
||||||
|
our $run_id = '';
|
||||||
|
our $import_db_file = _get_import_db_file($run_id,'import');
|
||||||
|
our $import_multithreading = 0; #$enablemultithreading;
|
||||||
|
|
||||||
|
our @subscriber_filenames = ();
|
||||||
|
our $subscriber_import_numofthreads = $cpucount;
|
||||||
|
our $ignore_subscriber_unique = 0;
|
||||||
|
our $subscriber_import_single_row_txn = 1;
|
||||||
|
|
||||||
|
our $provision_subscriber_rownum_start = 0; #all lines
|
||||||
|
our $provision_subscriber_multithreading = $enablemultithreading;
|
||||||
|
our $provision_subscriber_numofthreads = $cpucount;
|
||||||
|
our $webpassword_length = 8;
|
||||||
|
our $webusername_length = 8;
|
||||||
|
our $sippassword_length = 16;
|
||||||
|
|
||||||
|
our $default_domain = undef;
|
||||||
|
our $default_reseller_name = 'default';
|
||||||
|
our $default_billing_profile_name = 'Default Billing Profile';
|
||||||
|
our $default_barring = undef;
|
||||||
|
|
||||||
|
our $cc_ac_map_yml = 'cc_ac.yml';
|
||||||
|
our $cc_ac_map = {};
|
||||||
|
our $default_cc = undef;
|
||||||
|
our $cc_len_min = ~0;
|
||||||
|
our $cc_len_max = 0;
|
||||||
|
our $ac_len = {};
|
||||||
|
|
||||||
|
our $barring_profiles_yml = undef;
|
||||||
|
our $barring_profiles = {};
|
||||||
|
|
||||||
|
sub update_settings {
|
||||||
|
|
||||||
|
my ($data,$configfile) = @_;
|
||||||
|
|
||||||
|
if (defined $data) {
|
||||||
|
|
||||||
|
my $result = 1;
|
||||||
|
my $regexp_result;
|
||||||
|
|
||||||
|
#&$configurationinfocode("testinfomessage",$configlogger);
|
||||||
|
|
||||||
|
$result &= _prepare_working_paths(1);
|
||||||
|
if ($data->{report_filename}) {
|
||||||
|
$report_filename = $output_path . sprintf('/' . $data->{report_filename},timestampdigits());
|
||||||
|
if (-e $report_filename and (unlink $report_filename) == 0) {
|
||||||
|
filewarn('cannot remove ' . $report_filename . ': ' . $!,getlogger(__PACKAGE__));
|
||||||
|
$report_filename = undef;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$report_filename = undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
$dry = $data->{dry} if exists $data->{dry};
|
||||||
|
$skip_errors = $data->{skip_errors} if exists $data->{skip_errors};
|
||||||
|
$import_db_file = _get_import_db_file($run_id,'import');
|
||||||
|
$import_multithreading = $data->{import_multithreading} if exists $data->{import_multithreading};
|
||||||
|
#if ($import_multithreading) {
|
||||||
|
# configurationerror($configfile,"import_multithreading must be disabled to preserve record order",getlogger(__PACKAGE__));
|
||||||
|
#}
|
||||||
|
|
||||||
|
@subscriber_filenames = _get_import_filenames(\@subscriber_filenames,$data,'subscriber_filenames');
|
||||||
|
$subscriber_import_numofthreads = _get_numofthreads($cpucount,$data,'subscriber_import_numofthreads');
|
||||||
|
$ignore_subscriber_unique = $data->{ignore_subscriber_unique} if exists $data->{ignore_subscriber_unique};
|
||||||
|
$subscriber_import_single_row_txn = $data->{subscriber_import_single_row_txn} if exists $data->{subscriber_import_single_row_txn};
|
||||||
|
|
||||||
|
$provision_subscriber_rownum_start = $data->{provision_subscriber_rownum_start} if exists $data->{provision_subscriber_rownum_start};
|
||||||
|
$provision_subscriber_multithreading = $data->{provision_subscriber_multithreading} if exists $data->{provision_subscriber_multithreading};
|
||||||
|
$provision_subscriber_numofthreads = _get_numofthreads($cpucount,$data,'provision_subscriber_numofthreads');
|
||||||
|
$webpassword_length = $data->{webpassword_length} if exists $data->{webpassword_length};
|
||||||
|
if (not defined $webpassword_length or $webpassword_length <= 7) {
|
||||||
|
configurationerror($configfile,'webpassword_length greater than 7 required',getlogger(__PACKAGE__));
|
||||||
|
$result = 0;
|
||||||
|
}
|
||||||
|
$webusername_length = $data->{webusername_length} if exists $data->{webusername_length};
|
||||||
|
if (not defined $webusername_length or $webusername_length <= 7) {
|
||||||
|
configurationerror($configfile,'webusername_length greater than 7 required',getlogger(__PACKAGE__));
|
||||||
|
$result = 0;
|
||||||
|
}
|
||||||
|
$sippassword_length = $data->{sippassword_length} if exists $data->{sippassword_length};
|
||||||
|
if (not defined $sippassword_length or $sippassword_length <= 7) {
|
||||||
|
configurationerror($configfile,'sippassword_length greater than 7 required',getlogger(__PACKAGE__));
|
||||||
|
$result = 0;
|
||||||
|
}
|
||||||
|
#$default_channels = $data->{default_channels} if exists $data->{default_channels};
|
||||||
|
|
||||||
|
$default_domain = $data->{default_domain} if exists $data->{default_domain};
|
||||||
|
$default_reseller_name = $data->{default_reseller_name} if exists $data->{default_reseller_name};
|
||||||
|
$default_billing_profile_name = $data->{default_billing_profile_name} if exists $data->{default_billing_profile_name};
|
||||||
|
$default_barring = $data->{default_barring} if exists $data->{default_barring};
|
||||||
|
$cc_ac_map_yml = $data->{cc_ac_map_yml} if exists $data->{cc_ac_map_yml};
|
||||||
|
$default_cc = $data->{default_cc} if exists $data->{default_cc};
|
||||||
|
|
||||||
|
$barring_profiles_yml = $data->{barring_profiles_yml} if exists $data->{barring_profiles_yml};
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub update_cc_ac_map {
|
||||||
|
|
||||||
|
my ($data,$configfile) = @_;
|
||||||
|
|
||||||
|
if (defined $data) {
|
||||||
|
|
||||||
|
my $result = 1;
|
||||||
|
|
||||||
|
eval {
|
||||||
|
$cc_ac_map = $data;
|
||||||
|
};
|
||||||
|
if ($@ or 'HASH' ne ref $cc_ac_map) {
|
||||||
|
$cc_ac_map //= {};
|
||||||
|
configurationerror($configfile,'invalid cc ac map',getlogger(__PACKAGE__));
|
||||||
|
$result = 0;
|
||||||
|
} else {
|
||||||
|
foreach my $cc (keys %$cc_ac_map) {
|
||||||
|
my $ac_map = $cc_ac_map->{$cc};
|
||||||
|
$cc_len_min = length($cc) if length($cc) < $cc_len_min;
|
||||||
|
$cc_len_max = length($cc) if length($cc) > $cc_len_max;
|
||||||
|
$ac_len->{$cc} = { min => ~0, max => 0, };
|
||||||
|
if ('HASH' ne ref $ac_map) {
|
||||||
|
configurationerror($configfile,"invalid $cc ac map",getlogger(__PACKAGE__));
|
||||||
|
$result = 0;
|
||||||
|
} else {
|
||||||
|
foreach my $ac (keys %$ac_map) {
|
||||||
|
if ($ac_map->{$ac}) { # ac enabled
|
||||||
|
$ac_len->{$cc}->{min} = length($ac) if length($ac) < $ac_len->{$cc}->{min};
|
||||||
|
$ac_len->{$cc}->{max} = length($ac) if length($ac) > $ac_len->{$cc}->{max};
|
||||||
|
} else {
|
||||||
|
delete $ac_map->{$ac};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub update_barring_profiles {
|
||||||
|
|
||||||
|
my ($data,$configfile) = @_;
|
||||||
|
|
||||||
|
if (defined $data) {
|
||||||
|
|
||||||
|
my $result = 1;
|
||||||
|
|
||||||
|
eval {
|
||||||
|
$barring_profiles = $data; #->{'mapping'};
|
||||||
|
};
|
||||||
|
if ($@ or 'HASH' ne ref $barring_profiles or (scalar keys %$barring_profiles) == 0) {
|
||||||
|
$barring_profiles //= {};
|
||||||
|
configurationerror($configfile,'no barring mappings found',getlogger(__PACKAGE__));
|
||||||
|
$result = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _prepare_working_paths {
|
||||||
|
|
||||||
|
my ($create) = @_;
|
||||||
|
my $result = 1;
|
||||||
|
my $path_result;
|
||||||
|
|
||||||
|
($path_result,$input_path) = create_path($working_path . 'input',$input_path,$create,\&fileerror,getlogger(__PACKAGE__));
|
||||||
|
$result &= $path_result;
|
||||||
|
($path_result,$output_path) = create_path($working_path . 'output',$output_path,$create,\&fileerror,getlogger(__PACKAGE__));
|
||||||
|
$result &= $path_result;
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _get_numofthreads {
|
||||||
|
my ($default_value,$data,$key) = @_;
|
||||||
|
my $numofthreads = $default_value;
|
||||||
|
$numofthreads = $data->{$key} if exists $data->{$key};
|
||||||
|
$numofthreads = $cpucount if $numofthreads > $cpucount;
|
||||||
|
return $numofthreads;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _get_import_db_file {
|
||||||
|
my ($run,$name) = @_;
|
||||||
|
return ((defined $run and length($run) > 0) ? $run . '_' : '') . $name;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _get_import_filenames {
|
||||||
|
my ($old_value,$data,$key) = @_;
|
||||||
|
my @import_filenames = @$old_value;
|
||||||
|
@import_filenames = split_tuple($data->{$key}) if exists $data->{$key};
|
||||||
|
my @result = ();
|
||||||
|
foreach my $import_filename (@import_filenames) {
|
||||||
|
if (defined $import_filename and length($import_filename) > 0) {
|
||||||
|
$import_filename = $input_path . $import_filename unless -e $import_filename;
|
||||||
|
push(@result,$import_filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return @result;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_dry {
|
||||||
|
|
||||||
|
if ($dry) {
|
||||||
|
scriptinfo('running in dry mode - NGCP databases will not be modified',getlogger(__PACKAGE__));
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
scriptinfo('NO DRY MODE - NGCP DATABASES WILL BE MODIFIED!',getlogger(__PACKAGE__));
|
||||||
|
if (!$force) {
|
||||||
|
if ('yes' eq lc(prompt("Type 'yes' to proceed: "))) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
scriptinfo('force option applied',getlogger(__PACKAGE__));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
@ -0,0 +1,2 @@
|
|||||||
|
default:
|
||||||
|
default: 'NCOS 0'
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,61 @@
|
|||||||
|
##general settings:
|
||||||
|
working_path = /home/rkrenn/temp/upcat
|
||||||
|
cpucount = 4
|
||||||
|
enablemultithreading = 0
|
||||||
|
|
||||||
|
##gearman/service listener config:
|
||||||
|
jobservers = 127.0.0.1:4730
|
||||||
|
|
||||||
|
##NGCP MySQL connectivity - "accounting" db:
|
||||||
|
accounting_host = 192.168.0.29
|
||||||
|
accounting_port = 3306
|
||||||
|
accounting_databasename = accounting
|
||||||
|
accounting_username = root
|
||||||
|
accounting_password =
|
||||||
|
|
||||||
|
##NGCP MySQL connectivity - "billing" db:
|
||||||
|
billing_host = 192.168.0.29
|
||||||
|
billing_port = 3306
|
||||||
|
billing_databasename = billing
|
||||||
|
billing_username = root
|
||||||
|
billing_password =
|
||||||
|
|
||||||
|
##NGCP MySQL connectivity - "provisioning" db:
|
||||||
|
provisioning_host = 192.168.0.29
|
||||||
|
provisioning_port = 3306
|
||||||
|
provisioning_databasename = provisioning
|
||||||
|
provisioning_username = root
|
||||||
|
provisioning_password =
|
||||||
|
|
||||||
|
##NGCP MySQL connectivity - "kamailio" db:
|
||||||
|
kamailio_host = 192.168.0.29
|
||||||
|
kamailio_port = 3306
|
||||||
|
kamailio_databasename = kamailio
|
||||||
|
kamailio_username = root
|
||||||
|
kamailio_password =
|
||||||
|
|
||||||
|
##NGCP MySQL connectivity - default db for distributed transactions (XA) to connect to:
|
||||||
|
xa_host = 192.168.0.29
|
||||||
|
xa_port = 3306
|
||||||
|
xa_databasename = ngcp
|
||||||
|
xa_username = root
|
||||||
|
xa_password =
|
||||||
|
|
||||||
|
##NGCP REST-API connectivity:
|
||||||
|
ngcprestapi_uri = https://127.0.0.1:1443
|
||||||
|
ngcprestapi_username = administrator
|
||||||
|
ngcprestapi_password = administrator
|
||||||
|
ngcprestapi_realm = api_admin_http
|
||||||
|
|
||||||
|
##sending email:
|
||||||
|
emailenable = 0
|
||||||
|
erroremailrecipient =
|
||||||
|
warnemailrecipient =
|
||||||
|
completionemailrecipient = rkrenn@sipwise.com
|
||||||
|
doneemailrecipient =
|
||||||
|
|
||||||
|
##logging:
|
||||||
|
fileloglevel = DEBUG
|
||||||
|
screenloglevel = INFO
|
||||||
|
#INFO
|
||||||
|
emailloglevel = OFF
|
@ -0,0 +1,61 @@
|
|||||||
|
##general settings:
|
||||||
|
working_path = /home/rkrenn/temp/upcat
|
||||||
|
cpucount = 4
|
||||||
|
enablemultithreading = 0
|
||||||
|
|
||||||
|
##gearman/service listener config:
|
||||||
|
jobservers = 127.0.0.1:4730
|
||||||
|
|
||||||
|
##NGCP MySQL connectivity - "accounting" db:
|
||||||
|
accounting_host = 192.168.0.29
|
||||||
|
accounting_port = 3306
|
||||||
|
accounting_databasename = accounting
|
||||||
|
accounting_username = root
|
||||||
|
accounting_password =
|
||||||
|
|
||||||
|
##NGCP MySQL connectivity - "billing" db:
|
||||||
|
billing_host = 192.168.0.29
|
||||||
|
billing_port = 3306
|
||||||
|
billing_databasename = billing
|
||||||
|
billing_username = root
|
||||||
|
billing_password =
|
||||||
|
|
||||||
|
##NGCP MySQL connectivity - "provisioning" db:
|
||||||
|
provisioning_host = 192.168.0.29
|
||||||
|
provisioning_port = 3306
|
||||||
|
provisioning_databasename = provisioning
|
||||||
|
provisioning_username = root
|
||||||
|
provisioning_password =
|
||||||
|
|
||||||
|
##NGCP MySQL connectivity - "kamailio" db:
|
||||||
|
kamailio_host = 192.168.0.29
|
||||||
|
kamailio_port = 3306
|
||||||
|
kamailio_databasename = kamailio
|
||||||
|
kamailio_username = root
|
||||||
|
kamailio_password =
|
||||||
|
|
||||||
|
##NGCP MySQL connectivity - default db for distributed transactions (XA) to connect to:
|
||||||
|
xa_host = 192.168.0.29
|
||||||
|
xa_port = 3306
|
||||||
|
xa_databasename = ngcp
|
||||||
|
xa_username = root
|
||||||
|
xa_password =
|
||||||
|
|
||||||
|
##NGCP REST-API connectivity:
|
||||||
|
ngcprestapi_uri = https://127.0.0.1:1443
|
||||||
|
ngcprestapi_username = administrator
|
||||||
|
ngcprestapi_password = administrator
|
||||||
|
ngcprestapi_realm = api_admin_http
|
||||||
|
|
||||||
|
##sending email:
|
||||||
|
emailenable = 0
|
||||||
|
erroremailrecipient =
|
||||||
|
warnemailrecipient =
|
||||||
|
completionemailrecipient = rkrenn@sipwise.com
|
||||||
|
doneemailrecipient =
|
||||||
|
|
||||||
|
##logging:
|
||||||
|
fileloglevel = DEBUG
|
||||||
|
screenloglevel = INFO
|
||||||
|
#INFO
|
||||||
|
emailloglevel = OFF
|
@ -0,0 +1,377 @@
|
|||||||
|
use strict;
|
||||||
|
|
||||||
|
## no critic
|
||||||
|
|
||||||
|
use File::Basename;
|
||||||
|
use Cwd;
|
||||||
|
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../../');
|
||||||
|
|
||||||
|
use Getopt::Long qw(GetOptions);
|
||||||
|
use Fcntl qw(LOCK_EX LOCK_NB);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Globals qw();
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::Settings qw(
|
||||||
|
update_settings
|
||||||
|
update_cc_ac_map
|
||||||
|
update_barring_profiles
|
||||||
|
|
||||||
|
check_dry
|
||||||
|
$output_path
|
||||||
|
$defaultsettings
|
||||||
|
$defaultconfig
|
||||||
|
$dry
|
||||||
|
$skip_errors
|
||||||
|
$force
|
||||||
|
$run_id
|
||||||
|
|
||||||
|
@subscriber_filenames
|
||||||
|
$cc_ac_map_yml
|
||||||
|
|
||||||
|
$barring_profiles_yml
|
||||||
|
|
||||||
|
);
|
||||||
|
#$allowed_ips
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Logging qw(
|
||||||
|
init_log
|
||||||
|
getlogger
|
||||||
|
$attachmentlogfile
|
||||||
|
scriptinfo
|
||||||
|
cleanuplogfiles
|
||||||
|
$currentlogfile
|
||||||
|
);
|
||||||
|
use NGCP::BulkProcessor::LogError qw (
|
||||||
|
completion
|
||||||
|
done
|
||||||
|
scriptwarn
|
||||||
|
scripterror
|
||||||
|
filewarn
|
||||||
|
fileerror
|
||||||
|
);
|
||||||
|
use NGCP::BulkProcessor::LoadConfig qw(
|
||||||
|
load_config
|
||||||
|
$SIMPLE_CONFIG_TYPE
|
||||||
|
$YAML_CONFIG_TYPE
|
||||||
|
$ANY_CONFIG_TYPE
|
||||||
|
);
|
||||||
|
use NGCP::BulkProcessor::Array qw(removeduplicates);
|
||||||
|
use NGCP::BulkProcessor::Utils qw(getscriptpath prompt cleanupdir);
|
||||||
|
use NGCP::BulkProcessor::Mail qw(
|
||||||
|
cleanupmsgfiles
|
||||||
|
);
|
||||||
|
use NGCP::BulkProcessor::SqlConnectors::CSVDB qw(cleanupcvsdirs);
|
||||||
|
use NGCP::BulkProcessor::SqlConnectors::SQLiteDB qw(cleanupdbfiles);
|
||||||
|
use NGCP::BulkProcessor::RestConnectors::NGCPRestApi qw(cleanupcertfiles);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::ProjectConnectorPool qw(destroy_all_dbs);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::contracts qw();
|
||||||
|
use NGCP::BulkProcessor::Dao::Trunk::billing::voip_subscribers qw();
|
||||||
|
#use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_dbaliases qw();
|
||||||
|
#use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_cf_mappings qw();
|
||||||
|
#use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_trusted_sources qw();
|
||||||
|
|
||||||
|
#use NGCP::BulkProcessor::Dao::Trunk::kamailio::location qw();
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::Check qw(
|
||||||
|
check_billing_db_tables
|
||||||
|
check_provisioning_db_tables
|
||||||
|
check_kamailio_db_tables
|
||||||
|
check_import_db_tables
|
||||||
|
check_rest_get_items
|
||||||
|
);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::Import qw(
|
||||||
|
import_subscriber
|
||||||
|
);
|
||||||
|
|
||||||
|
use NGCP::BulkProcessor::Projects::Migration::UPCAT::Provisioning qw(
|
||||||
|
provision_subscribers
|
||||||
|
);
|
||||||
|
|
||||||
|
scripterror(getscriptpath() . ' already running',getlogger(getscriptpath())) unless flock DATA, LOCK_EX | LOCK_NB; # not tested on windows yet
|
||||||
|
|
||||||
|
my @TASK_OPTS = ();
|
||||||
|
|
||||||
|
my $tasks = [];
|
||||||
|
|
||||||
|
my $check_task_opt = 'check';
|
||||||
|
push(@TASK_OPTS,$check_task_opt);
|
||||||
|
|
||||||
|
my $cleanup_task_opt = 'cleanup';
|
||||||
|
push(@TASK_OPTS,$cleanup_task_opt);
|
||||||
|
my $cleanup_all_task_opt = 'cleanup_all';
|
||||||
|
push(@TASK_OPTS,$cleanup_all_task_opt);
|
||||||
|
|
||||||
|
my $import_subscriber_task_opt = 'import_subscriber';
|
||||||
|
push(@TASK_OPTS,$import_subscriber_task_opt);
|
||||||
|
my $import_truncate_subscriber_task_opt = 'truncate_subscriber';
|
||||||
|
push(@TASK_OPTS,$import_truncate_subscriber_task_opt);
|
||||||
|
|
||||||
|
my $create_subscriber_task_opt = 'create_subscriber';
|
||||||
|
push(@TASK_OPTS,$create_subscriber_task_opt);
|
||||||
|
|
||||||
|
if (init()) {
|
||||||
|
main();
|
||||||
|
exit(0);
|
||||||
|
} else {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub init {
|
||||||
|
|
||||||
|
my $configfile = $defaultconfig;
|
||||||
|
my $settingsfile = $defaultsettings;
|
||||||
|
|
||||||
|
return 0 unless GetOptions(
|
||||||
|
"config=s" => \$configfile,
|
||||||
|
"settings=s" => \$settingsfile,
|
||||||
|
"task=s" => $tasks,
|
||||||
|
"run=s" => \$run_id,
|
||||||
|
"dry" => \$dry,
|
||||||
|
"skip-errors" => \$skip_errors,
|
||||||
|
"force" => \$force,
|
||||||
|
); # or scripterror('error in command line arguments',getlogger(getscriptpath()));
|
||||||
|
|
||||||
|
$tasks = removeduplicates($tasks,1);
|
||||||
|
|
||||||
|
my $result = load_config($configfile);
|
||||||
|
init_log();
|
||||||
|
$result &= load_config($settingsfile,\&update_settings,$SIMPLE_CONFIG_TYPE);
|
||||||
|
$result &= load_config($cc_ac_map_yml,\&update_cc_ac_map,$YAML_CONFIG_TYPE);
|
||||||
|
$result &= load_config($barring_profiles_yml,\&update_barring_profiles,$YAML_CONFIG_TYPE);
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub main() {
|
||||||
|
|
||||||
|
my @messages = ();
|
||||||
|
my @attachmentfiles = ();
|
||||||
|
my $result = 1;
|
||||||
|
my $completion = 0;
|
||||||
|
|
||||||
|
if (defined $tasks and 'ARRAY' eq ref $tasks and (scalar @$tasks) > 0) {
|
||||||
|
scriptinfo('skip-errors: processing won\'t stop upon errors',getlogger(__PACKAGE__)) if $skip_errors;
|
||||||
|
foreach my $task (@$tasks) {
|
||||||
|
|
||||||
|
if (lc($check_task_opt) eq lc($task)) {
|
||||||
|
$result &= check_task(\@messages) if taskinfo($check_task_opt,$result);
|
||||||
|
|
||||||
|
} elsif (lc($cleanup_task_opt) eq lc($task)) {
|
||||||
|
$result &= cleanup_task(\@messages,0) if taskinfo($cleanup_task_opt,$result);
|
||||||
|
} elsif (lc($cleanup_all_task_opt) eq lc($task)) {
|
||||||
|
$result &= cleanup_task(\@messages,1) if taskinfo($cleanup_all_task_opt,$result);
|
||||||
|
|
||||||
|
} elsif (lc($import_subscriber_task_opt) eq lc($task)) {
|
||||||
|
$result &= import_subscriber_task(\@messages) if taskinfo($import_subscriber_task_opt,$result);
|
||||||
|
} elsif (lc($import_truncate_subscriber_task_opt) eq lc($task)) {
|
||||||
|
$result &= import_truncate_subscriber_task(\@messages) if taskinfo($import_truncate_subscriber_task_opt,$result);
|
||||||
|
|
||||||
|
} elsif (lc($create_subscriber_task_opt) eq lc($task)) {
|
||||||
|
if (taskinfo($create_subscriber_task_opt,$result,1)) {
|
||||||
|
next unless check_dry();
|
||||||
|
$result &= create_subscriber_task(\@messages);
|
||||||
|
$completion |= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$result = 0;
|
||||||
|
scripterror("unknow task option '" . $task . "', must be one of " . join(', ',@TASK_OPTS),getlogger(getscriptpath()));
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result = 0;
|
||||||
|
scripterror('at least one task option is required. supported tasks: ' . join(', ',@TASK_OPTS),getlogger(getscriptpath()));
|
||||||
|
}
|
||||||
|
|
||||||
|
push(@attachmentfiles,$attachmentlogfile);
|
||||||
|
if ($completion) {
|
||||||
|
completion(join("\n\n",@messages),\@attachmentfiles,getlogger(getscriptpath()));
|
||||||
|
} else {
|
||||||
|
done(join("\n\n",@messages),\@attachmentfiles,getlogger(getscriptpath()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub taskinfo {
|
||||||
|
my ($task,$result) = @_;
|
||||||
|
scriptinfo($result ? "starting task: '$task'" : "skipping task '$task' due to previous problems",getlogger(getscriptpath()));
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_task {
|
||||||
|
my ($messages) = @_;
|
||||||
|
my @check_messages = ();
|
||||||
|
my $result = check_billing_db_tables(\@check_messages);
|
||||||
|
#$result &= ..
|
||||||
|
push(@$messages,join("\n",@check_messages));
|
||||||
|
|
||||||
|
@check_messages = ();
|
||||||
|
$result = check_provisioning_db_tables(\@check_messages);
|
||||||
|
#$result &= ..
|
||||||
|
push(@$messages,join("\n",@check_messages));
|
||||||
|
|
||||||
|
@check_messages = ();
|
||||||
|
$result = check_kamailio_db_tables(\@check_messages);
|
||||||
|
#$result &= ..
|
||||||
|
push(@$messages,join("\n",@check_messages));
|
||||||
|
|
||||||
|
@check_messages = ();
|
||||||
|
$result = check_rest_get_items(\@check_messages);
|
||||||
|
#$result &= ..
|
||||||
|
push(@$messages,join("\n",@check_messages));
|
||||||
|
|
||||||
|
@check_messages = ();
|
||||||
|
$result = check_import_db_tables(\@check_messages);
|
||||||
|
#$result &= ..
|
||||||
|
push(@$messages,join("\n",@check_messages));
|
||||||
|
|
||||||
|
|
||||||
|
destroy_all_dbs();
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub cleanup_task {
|
||||||
|
my ($messages,$clean_generated) = @_;
|
||||||
|
my $result = 0;
|
||||||
|
if (!$clean_generated or $force or 'yes' eq lc(prompt("Type 'yes' to proceed: "))) {
|
||||||
|
eval {
|
||||||
|
cleanupcvsdirs() if $clean_generated;
|
||||||
|
cleanupdbfiles() if $clean_generated;
|
||||||
|
cleanuplogfiles(\&fileerror,\&filewarn,($currentlogfile,$attachmentlogfile));
|
||||||
|
cleanupmsgfiles(\&fileerror,\&filewarn);
|
||||||
|
cleanupcertfiles();
|
||||||
|
cleanupdir($output_path,1,\&filewarn,getlogger(getscriptpath())) if $clean_generated;
|
||||||
|
$result = 1;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if ($@ or !$result) {
|
||||||
|
push(@$messages,'working directory cleanup INCOMPLETE');
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
push(@$messages,'working directory folders cleaned up');
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub import_subscriber_task {
|
||||||
|
|
||||||
|
my ($messages) = @_;
|
||||||
|
my ($result,$warning_count) = (0,0);
|
||||||
|
eval {
|
||||||
|
($result,$warning_count) = import_subscriber(@subscriber_filenames);
|
||||||
|
};
|
||||||
|
my $err = $@;
|
||||||
|
my $stats = ": $warning_count warnings";
|
||||||
|
eval {
|
||||||
|
$stats .= "\n total subscriber records: " .
|
||||||
|
NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::countby_ccacsn() . ' rows';
|
||||||
|
my $added_count = NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::countby_delta(
|
||||||
|
$NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::added_delta
|
||||||
|
);
|
||||||
|
$stats .= "\n new: $added_count rows";
|
||||||
|
my $existing_count = NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::countby_delta(
|
||||||
|
$NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::updated_delta
|
||||||
|
);
|
||||||
|
$stats .= "\n existing: $existing_count rows";
|
||||||
|
my $deleted_count = NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::countby_delta(
|
||||||
|
$NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::deleted_delta
|
||||||
|
);
|
||||||
|
$stats .= "\n removed: $deleted_count rows";
|
||||||
|
};
|
||||||
|
if ($err or !$result) {
|
||||||
|
push(@$messages,"importing subscribers INCOMPLETE$stats");
|
||||||
|
} else {
|
||||||
|
push(@$messages,"importing subscribers completed$stats");
|
||||||
|
}
|
||||||
|
destroy_all_dbs(); #every task should leave with closed connections.
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub import_truncate_subscriber_task {
|
||||||
|
|
||||||
|
my ($messages) = @_;
|
||||||
|
my $result = 0;
|
||||||
|
eval {
|
||||||
|
$result = NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::create_table(1);
|
||||||
|
};
|
||||||
|
my $err = $@;
|
||||||
|
my $stats = '';
|
||||||
|
eval {
|
||||||
|
$stats .= "\n total subscriber records: " .
|
||||||
|
NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::Subscriber::countby_dn() . ' rows';
|
||||||
|
};
|
||||||
|
if ($err or !$result) {
|
||||||
|
push(@$messages,"truncating imported subscribers INCOMPLETE$stats");
|
||||||
|
} else {
|
||||||
|
push(@$messages,"truncating imported subscribers completed$stats");
|
||||||
|
}
|
||||||
|
destroy_all_dbs(); #every task should leave with closed connections.
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sub create_subscriber_task {
|
||||||
|
|
||||||
|
my ($messages) = @_;
|
||||||
|
my ($result,$warning_count,$nonunique_contacts) = (0,0,{});
|
||||||
|
eval {
|
||||||
|
($result,$warning_count,$nonunique_contacts) = provision_subscribers();
|
||||||
|
};
|
||||||
|
my $err = $@;
|
||||||
|
my $stats = ": $warning_count warnings";
|
||||||
|
eval {
|
||||||
|
$stats .= "\n total contracts: " .
|
||||||
|
NGCP::BulkProcessor::Dao::Trunk::billing::contracts::countby_status_resellerid(undef,undef) . ' rows';
|
||||||
|
$stats .= "\n total subscribers: " .
|
||||||
|
NGCP::BulkProcessor::Dao::Trunk::billing::voip_subscribers::countby_status_resellerid(undef,undef) . ' rows';
|
||||||
|
|
||||||
|
$stats .= "\n total aliases: " .
|
||||||
|
NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_dbaliases::countby_subscriberidisprimary(undef,undef) . ' rows';
|
||||||
|
$stats .= "\n primary aliases: " .
|
||||||
|
NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_dbaliases::countby_subscriberidisprimary(undef,1) . ' rows';
|
||||||
|
|
||||||
|
#$stats .= "\n call forwards: " .
|
||||||
|
# NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_cf_mappings::countby_subscriberid_type(undef,undef) . ' rows';
|
||||||
|
|
||||||
|
#$stats .= "\n registrations: " .
|
||||||
|
# NGCP::BulkProcessor::Dao::Trunk::kamailio::location::countby_usernamedomain(undef,undef) . ' rows';
|
||||||
|
|
||||||
|
#$stats .= "\n trusted sources: " .
|
||||||
|
# NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_trusted_sources::countby_subscriberid(undef) . ' rows';
|
||||||
|
|
||||||
|
$stats .= "\n non-unique contacts skipped:\n " . join("\n ",keys %$nonunique_contacts)
|
||||||
|
if (scalar keys %$nonunique_contacts) > 0;
|
||||||
|
};
|
||||||
|
if ($err or !$result) {
|
||||||
|
push(@$messages,"create subscribers INCOMPLETE$stats");
|
||||||
|
} else {
|
||||||
|
push(@$messages,"create subscribers completed$stats");
|
||||||
|
#if (not $dry) {
|
||||||
|
# push(@$messages,"YOU MIGHT WANT TO RESTART KAMAILIO FOR PERMANENT REGISTRATIONS TO COME INTO EFFECT");
|
||||||
|
#}
|
||||||
|
}
|
||||||
|
destroy_all_dbs();
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#END {
|
||||||
|
# # this should not be required explicitly, but prevents Log4Perl's
|
||||||
|
# # "rootlogger not initialized error upon exit..
|
||||||
|
# destroy_all_dbs
|
||||||
|
#}
|
||||||
|
|
||||||
|
__DATA__
|
||||||
|
This exists to allow the locking code at the beginning of the file to work.
|
||||||
|
DO NOT REMOVE THESE LINES!
|
@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
#dry=0
|
||||||
|
#skip_errors=0
|
||||||
|
import_multithreading = 0
|
||||||
|
|
||||||
|
#subscriber_filenames = /home/rkrenn/temp/upcat/export1.csv,/home/rkrenn/temp/upcat/export2.csv
|
||||||
|
subscriber_filenames = /home/rkrenn/temp/upcat/ExportTestMigration.csv
|
||||||
|
subscriber_import_numofthreads = 2
|
||||||
|
ignore_subscriber_unique = 0
|
||||||
|
subscriber_import_single_row_txn = 1
|
||||||
|
|
||||||
|
provision_subscriber_rownum_start = 2
|
||||||
|
provision_subscriber_multithreading = 1
|
||||||
|
provision_subscriber_numofthreads = 2
|
||||||
|
webpassword_length = 8
|
||||||
|
webusername_length = 8
|
||||||
|
sippassword_length = 16
|
||||||
|
report_filename = provision.txt
|
||||||
|
#report_filename = provision_%s.json
|
||||||
|
#default_channels = 1
|
||||||
|
|
||||||
|
default_domain = d20.upc.at
|
||||||
|
default_reseller_name = default
|
||||||
|
default_billing_profile_name = Default Billing Profile
|
||||||
|
default_barring =
|
||||||
|
cc_ac_map_yml = cc_ac.yml
|
||||||
|
default_cc = 43
|
||||||
|
barring_profiles_yml = barring_profiles.yml
|
@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
#dry=0
|
||||||
|
#skip_errors=0
|
||||||
|
import_multithreading = 0
|
||||||
|
|
||||||
|
#subscriber_filenames = /home/rkrenn/temp/upcat/export1.csv,/home/rkrenn/temp/upcat/export2.csv
|
||||||
|
subscriber_filenames = /home/rkrenn/temp/upcat/ExportTestMigration.csv
|
||||||
|
subscriber_import_numofthreads = 2
|
||||||
|
ignore_subscriber_unique = 0
|
||||||
|
subscriber_import_single_row_txn = 1
|
||||||
|
|
||||||
|
provision_subscriber_rownum_start = 2
|
||||||
|
provision_subscriber_multithreading = 1
|
||||||
|
provision_subscriber_numofthreads = 2
|
||||||
|
webpassword_length = 8
|
||||||
|
webusername_length = 8
|
||||||
|
sippassword_length = 16
|
||||||
|
report_filename = provision.txt
|
||||||
|
#report_filename = provision_%s.json
|
||||||
|
#default_channels = 1
|
||||||
|
|
||||||
|
default_domain = d20.upc.at
|
||||||
|
default_reseller_name = default
|
||||||
|
default_billing_profile_name = Default Billing Profile
|
||||||
|
default_barring =
|
||||||
|
cc_ac_map_yml = cc_ac.yml
|
||||||
|
default_cc = 43
|
||||||
|
barring_profiles_yml = barring_profiles.yml
|
Loading…
Reference in new issue