From 7e3a2997f4bd042a8a62fcabb0128142d6ae120a Mon Sep 17 00:00:00 2001 From: Andreas Granig Date: Wed, 11 Dec 2013 12:57:51 +0100 Subject: [PATCH] MT#5355 Implement peer_auth api calls to sems. --- lib/NGCP/Panel/Controller/Subscriber.pm | 46 ++++++- lib/NGCP/Panel/Utils/Preferences.pm | 36 +++++ lib/NGCP/Panel/Utils/Sems.pm | 174 ++++++++++++++++++++++++ 3 files changed, 255 insertions(+), 1 deletion(-) create mode 100644 lib/NGCP/Panel/Utils/Sems.pm diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index a0329b6453..1acc869edb 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -3,6 +3,7 @@ use Sipwise::Base; BEGIN { extends 'Catalyst::Controller'; } use HTML::Entities; use URI::Escape qw(uri_unescape); +use Test::More; use NGCP::Panel::Utils::Navigation; use NGCP::Panel::Utils::Contract; use NGCP::Panel::Utils::Subscriber; @@ -11,6 +12,7 @@ use NGCP::Panel::Utils::Callflow; use NGCP::Panel::Utils::Preferences; use NGCP::Panel::Utils::Message; use NGCP::Panel::Utils::DateTime; +use NGCP::Panel::Utils::Sems; use NGCP::Panel::Form::Subscriber; use NGCP::Panel::Form::SubscriberEdit; use NGCP::Panel::Form::Customer::PbxExtensionSubscriberEdit; @@ -409,6 +411,8 @@ sub preferences_base :Chained('base') :PathPart('preferences') :CaptureArgs(1) { sub preferences_edit :Chained('preferences_base') :PathPart('edit') :Args(0) { my ($self, $c) = @_; + my $prov_subscriber = $c->stash->{subscriber}->provisioning_voip_subscriber; + $c->detach('/denied_page') if(($c->user->roles eq "admin" || $c->user->roles eq "reseller") && $c->user->read_only); @@ -422,15 +426,55 @@ sub preferences_edit :Chained('preferences_base') :PathPart('edit') :Args(0) { my $pref_rs = $c->model('DB') ->resultset('voip_usr_preferences') ->search({ - subscriber_id => $c->stash->{subscriber}->provisioning_voip_subscriber->id + subscriber_id => $prov_subscriber->id }); + my $old_auth_prefs = {}; + if($c->req->method eq "POST" && $c->stash->{preference_meta}->attribute =~ /^peer_auth_/) { + NGCP::Panel::Utils::Preferences::get_peer_auth_params( + $c, $prov_subscriber, $old_auth_prefs); + } + NGCP::Panel::Utils::Preferences::create_preference_form( c => $c, pref_rs => $pref_rs, enums => \@enums, base_uri => $c->uri_for_action('/subscriber/preferences', [$c->req->captures->[0]]), edit_uri => $c->uri_for_action('/subscriber/preferences_edit', $c->req->captures), ); + + if(keys %{ $old_auth_prefs }) { + my $new_auth_prefs = {}; + NGCP::Panel::Utils::Preferences::get_peer_auth_params( + $c, $prov_subscriber, $new_auth_prefs); + unless(is_deeply($old_auth_prefs, $new_auth_prefs)) { + try { + + if(!NGCP::Panel::Utils::Preferences::is_peer_auth_active($c, $old_auth_prefs) && + NGCP::Panel::Utils::Preferences::is_peer_auth_active($c, $new_auth_prefs)) { + + NGCP::Panel::Utils::Sems::create_peer_registration( + $c, $prov_subscriber, $new_auth_prefs); + } elsif(NGCP::Panel::Utils::Preferences::is_peer_auth_active($c, $old_auth_prefs) && + !NGCP::Panel::Utils::Preferences::is_peer_auth_active($c, $new_auth_prefs)) { + + NGCP::Panel::Utils::Sems::delete_peer_registration( + $c, $prov_subscriber, $old_auth_prefs); + } elsif(NGCP::Panel::Utils::Preferences::is_peer_auth_active($c, $old_auth_prefs) && + NGCP::Panel::Utils::Preferences::is_peer_auth_active($c, $new_auth_prefs)){ + + NGCP::Panel::Utils::Sems::update_peer_registration( + $c, $prov_subscriber, $new_auth_prefs, $old_auth_prefs); + } + + } catch($e) { + NGCP::Panel::Utils::Message->error( + c => $c, + log => "Failed to set peer registration: $e", + desc => "Peer registration error: $e", + ); + } + } + } } sub preferences_callforward :Chained('base') :PathPart('preferences/callforward') :Args(1) { diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index e2cce03a8c..8cfedda998 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -460,6 +460,42 @@ sub get_dom_preference_rs { return $preference; } +sub get_peer_auth_params { + my ($c, $prov_subscriber, $prefs) = @_; + + my $rs; + $rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( + c => $c, attribute => 'peer_auth_user', + prov_subscriber => $prov_subscriber); + $prefs->{peer_auth_user} = $rs->first ? $rs->first->value : undef; + $rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( + c => $c, attribute => 'peer_auth_realm', + prov_subscriber => $prov_subscriber); + $prefs->{peer_auth_realm} = $rs->first ? $rs->first->value : undef; + $rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( + c => $c, attribute => 'peer_auth_pass', + prov_subscriber => $prov_subscriber); + $prefs->{peer_auth_pass} = $rs->first ? $rs->first->value : undef; + $rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( + c => $c, attribute => 'peer_auth_register', + prov_subscriber => $prov_subscriber); + $prefs->{peer_auth_register} = $rs->first ? $rs->first->value : undef; +} + +sub is_peer_auth_active { + my ($c, $prefs) = @_; + if(defined $prefs->{peer_auth_register} && $prefs->{peer_auth_register} == 1 && + defined $prefs->{peer_auth_user} && + defined $prefs->{peer_auth_realm} && + defined $prefs->{peer_auth_pass}) { + + $c->log->debug("+++++++++++ peer auth register is active"); + return 1; + } + $c->log->debug("+++++++++++ peer auth register is NOT active"); + return; +} + 1; =head1 NAME diff --git a/lib/NGCP/Panel/Utils/Sems.pm b/lib/NGCP/Panel/Utils/Sems.pm new file mode 100644 index 0000000000..5927fc4971 --- /dev/null +++ b/lib/NGCP/Panel/Utils/Sems.pm @@ -0,0 +1,174 @@ +package NGCP::Panel::Utils::Sems; + +use Sipwise::Base; +use NGCP::Panel::Utils::XMLDispatcher; +use Data::Dumper; + +sub create_peer_registration { + my ($c, $prov_subscriber, $prefs) = @_; + + if($c->config->{features}->{debug}) { + $c->log->debug("skip creating peer registration for subscriber '".$prov_subscriber->username.'@'.$prov_subscriber->domain->domain."'"); + return 1; + } + + my $dispatcher = NGCP::Panel::Utils::XMLDispatcher->new; + + $c->log->debug("creating peer registration for subscriber '".$prov_subscriber->username.'@'.$prov_subscriber->domain->domain."'"); + + my $sid = $prov_subscriber->id; + my $uuid = $prov_subscriber->uuid; + my $contact = $c->config->{sip}->{lb_ext}; + + my @ret = $dispatcher->dispatch("appserver", 1, 1, < + + db_reg_agent.createRegistration + + $sid + $$prefs{peer_auth_user} + $$prefs{peer_auth_pass} + $$prefs{peer_auth_realm} + sip:$$prefs{peer_auth_user}\@$contact;uuid=$uuid + + +EOF + + if(grep { $$_[1] != 1 or $$_[2] !~ m#OK# } @ret) { # error + $c->log->error("Failed XML-RPC call to appserver: ". Dumper \@ret); + + # remove reg from successsful backends + foreach my $ret (grep {!$$_[1]} @ret) { # successful backends + $dispatcher->dispatch($$ret[0], 1, 1, < + + db_reg_agent.removeRegistration + + $sid + + +EOF + } + die "Failed to add peer registration on application servers\n"; + } + + return 1; +} + +sub update_peer_registration { + my ($c, $prov_subscriber, $prefs, $oldprefs) = @_; + + if($c->config->{features}->{debug}) { + $c->log->debug("skip updating peer registration for subscriber '".$prov_subscriber->username.'@'.$prov_subscriber->domain->domain."'"); + return 1; + } + + my $dispatcher = NGCP::Panel::Utils::XMLDispatcher->new; + + $c->log->debug("trying to update peer registration for subscriber '".$prov_subscriber->username.'@'.$prov_subscriber->domain->domain."'"); + + my $sid = $prov_subscriber->id; + my $uuid = $prov_subscriber->uuid; + my $contact = $c->config->{sip}->{lb_ext}; + + use Data::Dumper; + $c->log->debug("+++++++++++++++++++ old peer auth params: " . Dumper $oldprefs); + $c->log->debug("+++++++++++++++++++ new peer auth params: " . Dumper $prefs); + $c->log->debug("+++++++++++++++++++ sid=$sid"); + $c->log->debug("+++++++++++++++++++ uuid=$uuid"); + $c->log->debug("+++++++++++++++++++ contact=$contact"); + + my @ret = $dispatcher->dispatch("appserver", 1, 1, < + + db_reg_agent.updateRegistration + + $sid + $$prefs{peer_auth_user} + $$prefs{peer_auth_pass} + $$prefs{peer_auth_realm} + sip:$$prefs{peer_auth_user}\@$contact;uuid=$uuid + + +EOF + + if(grep { $$_[1] != 1 or $$_[2] !~ m#OK# } @ret) { # error + $c->log->error("Failed XML-RPC call to appserver: ". Dumper \@ret); + + # undo update on successsful backends + foreach my $ret (grep {!$$_[1]} @ret) { # successful backends + $dispatcher->dispatch($$ret[0], 1, 1, < + + db_reg_agent.updateRegistration + + $sid + $$oldprefs{peer_auth_user} + $$oldprefs{peer_auth_pass} + $$oldprefs{peer_auth_realm} + sip:$$oldprefs{peer_auth_user}\@$contact;uuid=$uuid + + +EOF + } + die "Failed to update peer registration on application servers\n"; + } + + return 1; +} + +sub delete_peer_registration { + my ($c, $prov_subscriber, $oldprefs) = @_; + + if($c->config->{features}->{debug}) { + $c->log->debug("skip deleting peer registration for subscriber '".$prov_subscriber->username.'@'.$prov_subscriber->domain->domain."'"); + return 1; + } + + my $dispatcher = NGCP::Panel::Utils::XMLDispatcher->new; + + $c->log->debug("trying to delete peer registration for subscriber '".$prov_subscriber->username.'@'.$prov_subscriber->domain->domain."'"); + + my $sid = $prov_subscriber->id; + my $uuid = $prov_subscriber->uuid; + my $contact = $c->config->{sip}->{lb_ext}; + + my @ret = $dispatcher->dispatch("appserver", 1, 1, < + + db_reg_agent.removeRegistration + + $sid + + +EOF + + if(grep { $$_[1] != 1 or $$_[2] !~ m#OK# } @ret) { # error + $c->log->error("Failed XML-RPC call to appserver: ". Dumper \@ret); + + # remove reg from successsful backends + foreach my $ret (grep {!$$_[1]} @ret) { # successful backends + $dispatcher->dispatch($ret[0], 1, 1, < + + db_reg_agent.createRegistration + + $sid + $$oldprefs{peer_auth_user} + $$oldprefs{peer_auth_pass} + $$oldprefs{peer_auth_realm} + sip:$$oldprefs{peer_auth_user}\@$contact;uuid=$uuid + + +EOF + + } + die "Failed to delete peer registration on application servers\n"; + } + + return 1; +} + +1; + +# vim: set tabstop=4 expandtab: