From dbf0f0c6c65bfe151ce48159ba57c5ef82b4dd10 Mon Sep 17 00:00:00 2001 From: Rene Krenn Date: Wed, 17 Apr 2019 18:31:53 +0200 Subject: [PATCH] TT#57614 ccs importer: implement writing pbx prefs Change-Id: Iaab35f040b567656051541204285a9e035e623c6 --- .../Trunk/provisioning/voip_preferences.pm | 11 ++ .../Projects/Migration/UPCAT/Provisioning.pm | 133 ++++++++++++++++-- .../Projects/Migration/UPCAT/process.pl | 34 +++++ .../Migration/UPCAT/settings.debug.cfg | 7 +- 4 files changed, 167 insertions(+), 18 deletions(-) diff --git a/lib/NGCP/BulkProcessor/Dao/Trunk/provisioning/voip_preferences.pm b/lib/NGCP/BulkProcessor/Dao/Trunk/provisioning/voip_preferences.pm index 3f0d69e..7c4e872 100644 --- a/lib/NGCP/BulkProcessor/Dao/Trunk/provisioning/voip_preferences.pm +++ b/lib/NGCP/BulkProcessor/Dao/Trunk/provisioning/voip_preferences.pm @@ -49,6 +49,11 @@ our @EXPORT_OK = qw( $E164_TO_RURI_ATTRIBUTE $SERIAL_FORKING_BY_Q_VALUE_ATTRIBUTE + $CLOUD_PBX_ATTRIBUTE + $CLOUD_PBX_BASE_CLI_ATTRIBUTE + $CLOUD_PBX_HUNT_POLICY_ATTRIBUTE + $MUSIC_ON_HOLD_ATTRIBUTE + $SHARED_BUDDYLIST_VISIBILITY_ATTRIBUTE ); #$FORCE_OUTBOUND_CALLS_TO_PEER @@ -109,6 +114,12 @@ our $EXTENDED_DIALING_MODE_ATTRIBUTE = 'extended_dialing_mode'; our $E164_TO_RURI_ATTRIBUTE = 'e164_to_ruri'; our $SERIAL_FORKING_BY_Q_VALUE_ATTRIBUTE = 'serial_forking_by_q_value'; +our $CLOUD_PBX_ATTRIBUTE = 'cloud_pbx'; +our $CLOUD_PBX_BASE_CLI_ATTRIBUTE = 'cloud_pbx_base_cli'; +our $CLOUD_PBX_HUNT_POLICY_ATTRIBUTE = 'cloud_pbx_hunt_policy'; +our $MUSIC_ON_HOLD_ATTRIBUTE = 'music_on_hold'; +our $SHARED_BUDDYLIST_VISIBILITY_ATTRIBUTE = 'shared_buddylist_visibility'; + sub new { my $class = shift; diff --git a/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Provisioning.pm b/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Provisioning.pm index 8cb7319..03a3fa6 100644 --- a/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Provisioning.pm +++ b/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/Provisioning.pm @@ -110,6 +110,7 @@ our @ISA = qw(Exporter); our @EXPORT_OK = qw( provision_mta_subscribers provision_ccs_subscribers + $UPDATE_CCS_PREFERENCES_MODE ); my $split_ipnets_pattern = join('|',( @@ -125,6 +126,8 @@ my $default_barring = 'default'; my $ccs_contact_identifier_field = 'gpp9'; +our $UPDATE_CCS_PREFERENCES_MODE = 'update_ccs_preferences'; + sub provision_mta_subscribers { my $static_context = { now => timestamp(), _rowcount => undef }; @@ -1039,6 +1042,8 @@ sub _apply_reseller_mapping { sub provision_ccs_subscribers { + my $update_mode = shift; + my $static_context = { now => timestamp(), _rowcount => undef }; my $result = _provision_ccs_subscribers_checks($static_context); @@ -1054,7 +1059,8 @@ sub provision_ccs_subscribers { foreach my $switch_number (@$records) { $context->{_rowcount} += 1; next unless _provision_ccs_susbcriber($context, - NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::CcsSubscriber::findby_switch_number(@$switch_number)); + NGCP::BulkProcessor::Projects::Migration::UPCAT::Dao::import::CcsSubscriber::findby_switch_number(@$switch_number), + $update_mode); push(@report_data,_get_report_obj($context)); } #cleanup_aig_sequence_ids($context); @@ -1091,7 +1097,8 @@ sub provision_ccs_subscribers { } sub _provision_ccs_susbcriber { - my ($context,$subscriber_group) = @_; + + my ($context,$subscriber_group,$update_mode) = @_; return 0 unless _provision_ccs_susbcriber_init_context($context,$subscriber_group); @@ -1109,21 +1116,38 @@ sub _provision_ccs_susbcriber { if ((scalar @$existing_billing_voip_subscribers) == 0) { - _update_ccs_contact($context); - _update_contract($context); - #{ - # lock $db_lock; #concurrent writes to voip_numbers causes deadlocks - _update_subscriber($context); - _create_aliases($context); - #} - _update_ccs_preferences($context); - _set_registrations($context); - ##_set_callforwards($context); - ##todo: additional prefs, AllowedIPs, NCOS, Callforwards. still thinking wether to integrate it - ##in this main provisioning loop, or align it in separate run-modes, according to the files given. + if (not $update_mode) { + _update_ccs_contact($context); + _update_contract($context); + #{ + # lock $db_lock; #concurrent writes to voip_numbers causes deadlocks + _update_subscriber($context); + _create_aliases($context); + #} + _update_ccs_preferences($context); + _set_registrations($context); + ##_set_callforwards($context); + ##todo: additional prefs, AllowedIPs, NCOS, Callforwards. still thinking wether to integrate it + ##in this main provisioning loop, or align it in separate run-modes, according to the files given. + } else { + _warn($context,$context->{prov_subscriber}->{username} . ': no active billing subscribers found for updating, skipping'); + } + } elsif ((scalar @$existing_billing_voip_subscribers) == 1) { + $context->{bill_subscriber} = $existing_billing_voip_subscribers->[0]; + $context->{prov_subscriber} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_subscribers::findby_uuid( + $context->{db},$context->{bill_subscriber}->{uuid}); + if (defined $context->{prov_subscriber}) { + if ($update_mode eq $UPDATE_CCS_PREFERENCES_MODE) { + _update_ccs_preferences($context); + } else { + _warn($context,$context->{prov_subscriber}->{username} . ': ' . (scalar @$existing_billing_voip_subscribers) . ' existing billing subscribers found, skipping'); + } + } else { + _warn($context,$context->{prov_subscriber}->{username} . ': no provisioning subscribers found for updating, skipping'); + } } else { - _warn($context,(scalar @$existing_billing_voip_subscribers) . ' existing billing subscribers found, skipping'); + _warn($context,$context->{prov_subscriber}->{username} . ': ' . (scalar @$existing_billing_voip_subscribers) . ' existing billing subscribers found, skipping'); } if ($dry) { @@ -1259,6 +1283,58 @@ sub _provision_ccs_subscribers_checks { processing_info(threadid(),"serial_forking_by_q_value attribute found",getlogger(__PACKAGE__)); } + eval { + $context->{attributes}->{cloud_pbx} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute( + $NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::CLOUD_PBX_ATTRIBUTE); + }; + if ($@ or not defined $context->{attributes}->{cloud_pbx}) { + rowprocessingerror(threadid(),'cannot find cloud_pbx attribute',getlogger(__PACKAGE__)); + $result = 0; #even in skip-error mode.. + } else { + processing_info(threadid(),"cloud_pbx attribute found",getlogger(__PACKAGE__)); + } + eval { + $context->{attributes}->{cloud_pbx_base_cli} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute( + $NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::CLOUD_PBX_BASE_CLI_ATTRIBUTE); + }; + if ($@ or not defined $context->{attributes}->{cloud_pbx_base_cli}) { + rowprocessingerror(threadid(),'cannot find cloud_pbx_base_cli attribute',getlogger(__PACKAGE__)); + $result = 0; #even in skip-error mode.. + } else { + processing_info(threadid(),"cloud_pbx_base_cli attribute found",getlogger(__PACKAGE__)); + } + eval { + $context->{attributes}->{cloud_pbx_hunt_policy} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute( + $NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::CLOUD_PBX_HUNT_POLICY_ATTRIBUTE); + }; + if ($@ or not defined $context->{attributes}->{cloud_pbx_hunt_policy}) { + rowprocessingerror(threadid(),'cannot find cloud_pbx_hunt_policy attribute',getlogger(__PACKAGE__)); + $result = 0; #even in skip-error mode.. + } else { + processing_info(threadid(),"cloud_pbx_hunt_policy attribute found",getlogger(__PACKAGE__)); + } + eval { + $context->{attributes}->{music_on_hold} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute( + $NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::MUSIC_ON_HOLD_ATTRIBUTE); + }; + if ($@ or not defined $context->{attributes}->{music_on_hold}) { + rowprocessingerror(threadid(),'cannot find music_on_hold attribute',getlogger(__PACKAGE__)); + $result = 0; #even in skip-error mode.. + } else { + processing_info(threadid(),"music_on_hold attribute found",getlogger(__PACKAGE__)); + } + eval { + $context->{attributes}->{shared_buddylist_visibility} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute( + $NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::SHARED_BUDDYLIST_VISIBILITY_ATTRIBUTE); + }; + if ($@ or not defined $context->{attributes}->{shared_buddylist_visibility}) { + rowprocessingerror(threadid(),'cannot find shared_buddylist_visibility attribute',getlogger(__PACKAGE__)); + $result = 0; #even in skip-error mode.. + } else { + processing_info(threadid(),"shared_buddylist_visibility attribute found",getlogger(__PACKAGE__)); + } + + return $result; } @@ -1547,6 +1623,33 @@ sub _update_ccs_preferences { # } #} + $context->{preferences}->{cloud_pbx} = { id => set_subscriber_preference($context, + $context->{prov_subscriber}->{id}, + $context->{attributes}->{cloud_pbx}, + '1'), value => '1' }; + + $context->{preferences}->{cloud_pbx_base_cli} = { id => set_subscriber_preference($context, + $context->{prov_subscriber}->{id}, + $context->{attributes}->{cloud_pbx_base_cli}, + $context->{numbers}->{primary}->{number}), value => $context->{numbers}->{primary}->{number} }; + + $context->{preferences}->{cloud_pbx_hunt_policy} = { id => set_subscriber_preference($context, + $context->{prov_subscriber}->{id}, + $context->{attributes}->{cloud_pbx_hunt_policy}, + 'serial'), value => 'serial' }; + + #contract_sound_set = 25 + + $context->{preferences}->{music_on_hold} = { id => set_subscriber_preference($context, + $context->{prov_subscriber}->{id}, + $context->{attributes}->{music_on_hold}, + '1'), value => '1' }; + + $context->{preferences}->{shared_buddylist_visibility} = { id => set_subscriber_preference($context, + $context->{prov_subscriber}->{id}, + $context->{attributes}->{shared_buddylist_visibility}, + '1'), value => '1' }; + return $result; } diff --git a/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/process.pl b/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/process.pl index 2fdc9bc..5b30ffc 100644 --- a/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/process.pl +++ b/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/process.pl @@ -93,6 +93,7 @@ use NGCP::BulkProcessor::Projects::Migration::UPCAT::Import qw( use NGCP::BulkProcessor::Projects::Migration::UPCAT::Provisioning qw( provision_mta_subscribers provision_ccs_subscribers + $UPDATE_CCS_PREFERENCES_MODE ); scripterror(getscriptpath() . ' already running',getlogger(getscriptpath())) unless flock DATA, LOCK_EX | LOCK_NB; # not tested on windows yet @@ -125,6 +126,9 @@ push(@TASK_OPTS,$truncate_ccs_subscriber_task_opt); my $create_ccs_subscriber_task_opt = 'create_ccs_subscriber'; push(@TASK_OPTS,$create_ccs_subscriber_task_opt); +my $update_ccs_subscriber_preferences_task_opt = 'update_ccs_subscriber_preferences'; +push(@TASK_OPTS,$update_ccs_subscriber_preferences_task_opt); + if (init()) { main(); @@ -202,6 +206,13 @@ sub main() { $completion |= 1; } + } elsif (lc($update_ccs_subscriber_preferences_task_opt) eq lc($task)) { + if (taskinfo($update_ccs_subscriber_preferences_task_opt,$result,1)) { + next unless check_dry(); + $result &= update_ccs_subscriber_preferences_task(\@messages); + $completion |= 1; + } + } else { $result = 0; scripterror("unknow task option '" . $task . "', must be one of " . join(', ',@TASK_OPTS),getlogger(getscriptpath())); @@ -489,6 +500,29 @@ sub create_ccs_subscriber_task { } +sub update_ccs_subscriber_preferences_task { + my ($messages) = @_; + my ($result,$warning_count) = (0,0); + eval { + ($result,$warning_count) = provision_ccs_subscribers($UPDATE_CCS_PREFERENCES_MODE); + }; + 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'; + }; + if ($err or !$result) { + push(@$messages,"update ccs subscriber preferences INCOMPLETE$stats"); + } else { + push(@$messages,"update ccs subscribers preferences completed$stats"); + } + destroy_all_dbs(); + return $result; +} + #END { # # this should not be required explicitly, but prevents Log4Perl's # # "rootlogger not initialized error upon exit.. diff --git a/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/settings.debug.cfg b/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/settings.debug.cfg index 36f1073..61a7caf 100644 --- a/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/settings.debug.cfg +++ b/lib/NGCP/BulkProcessor/Projects/Migration/UPCAT/settings.debug.cfg @@ -35,9 +35,10 @@ provision_ccs_subscriber_rownum_start = 2 ccs_subscriber_import_single_row_txn = 1 provision_ccs_subscriber_multithreading = 1 provision_ccs_subscriber_numofthreads = 2 -ccs_reseller_name = UPC -ccs_billing_profile_name = Default Billing UPC -ccs_domain = d20.upc.at +ccs_reseller_name = default +ccs_billing_profile_name = Default Billing Profile +ccs_domain = 10.15.19.193 +#d20.upc.at #in-ivr.upc.at ccs_sippassword_length = 16 css_trusted_source_ips = 80.110.2.228,80.110.2.229 \ No newline at end of file