From 4d26ca5c9ad043abfb16d8c7828f9ba23e524324 Mon Sep 17 00:00:00 2001 From: Kirill Solomko Date: Wed, 7 May 2025 17:08:29 +0200 Subject: [PATCH] MT#62705 improve peer_auth registrations support * DELETE /api/peeringgroups and PUT/PATCH/DELETE /api/peeringservers now call sip_create_peer_registration or delete_peer_registration correspondingly to correctly reflect the registartion on related changes * rework Panel::Utils::Peering create_peer_registration() and delete_peer_registration() - use provisioning peer db object in the argument instead of a separate hash to simplify its logic - adjust related UI parts that call these functions as well as cleanup now unnesessary code from there * Panel::Utils::Peering: remove '_' prefix from _sip* functions as they are not private but rather public class methods * Panel::Utils::Preferences - add suport for 'peer_auth' updates for type='peerings' (was only supported for 'subscribers') - remove '_' prefix from _is_peer_auth_active() * Panel::Utils::Sems - simplify peer registration by using the the db object (same as for subscribers) - only create/delete peer registration when the peering is enabled, otherwise there will be errors related to unavailable $prov_peer->lcr_gw->id Change-Id: I0fc79a6580fd17aa34df870fb7a93e33edfff15b --- .../Panel/Controller/API/PeeringGroups.pm | 2 +- .../Panel/Controller/API/PeeringGroupsItem.pm | 14 +- lib/NGCP/Panel/Controller/API/PeeringRules.pm | 2 +- .../Panel/Controller/API/PeeringRulesItem.pm | 6 +- .../Panel/Controller/API/PeeringServers.pm | 6 +- .../Controller/API/PeeringServersItem.pm | 147 ++++++++++++++---- lib/NGCP/Panel/Controller/Header.pm | 2 +- lib/NGCP/Panel/Controller/Peering.pm | 58 +++---- lib/NGCP/Panel/Controller/Product.pm | 2 +- lib/NGCP/Panel/Controller/Rewrite.pm | 2 +- lib/NGCP/Panel/Role/API/PeeringServers.pm | 1 + lib/NGCP/Panel/Utils/Peering.pm | 136 ++++++++-------- lib/NGCP/Panel/Utils/Preferences.pm | 62 ++++---- lib/NGCP/Panel/Utils/Sems.pm | 49 ++++-- 14 files changed, 303 insertions(+), 186 deletions(-) diff --git a/lib/NGCP/Panel/Controller/API/PeeringGroups.pm b/lib/NGCP/Panel/Controller/API/PeeringGroups.pm index 4473f5a89a..61c6abd64c 100644 --- a/lib/NGCP/Panel/Controller/API/PeeringGroups.pm +++ b/lib/NGCP/Panel/Controller/API/PeeringGroups.pm @@ -111,7 +111,7 @@ sub create_item { $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering group.", $e); return; } - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); return $item; } diff --git a/lib/NGCP/Panel/Controller/API/PeeringGroupsItem.pm b/lib/NGCP/Panel/Controller/API/PeeringGroupsItem.pm index dd698c2fa1..fe613b484c 100644 --- a/lib/NGCP/Panel/Controller/API/PeeringGroupsItem.pm +++ b/lib/NGCP/Panel/Controller/API/PeeringGroupsItem.pm @@ -70,7 +70,7 @@ sub PATCH :Allow { $guard->commit; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); $self->return_representation($c, 'item' => $item, 'form' => $form, 'preference' => $preference ); } @@ -101,7 +101,7 @@ sub PUT :Allow { $guard->commit; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); $self->return_representation($c, 'item' => $item, 'form' => $form, 'preference' => $preference ); } @@ -118,20 +118,26 @@ sub DELETE :Allow { foreach my $p ($item->voip_peer_hosts->all) { if($p->probe) { - NGCP::Panel::Utils::Peering::_sip_delete_probe( + NGCP::Panel::Utils::Peering::sip_delete_probe( c => $c, ip => $p->ip, port => $p->port, transport => $p->transport, ); } + if ($p->enabled) { + NGCP::Panel::Utils::Peering::sip_delete_peer_registration( + c => $c, + prov_peer => $p + ); + } $p->voip_peer_preferences->delete_all; $p->delete; } $item->delete; $guard->commit; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); $c->response->status(HTTP_NO_CONTENT); $c->response->body(q()); diff --git a/lib/NGCP/Panel/Controller/API/PeeringRules.pm b/lib/NGCP/Panel/Controller/API/PeeringRules.pm index 0ecb53139e..4c27e4b12c 100644 --- a/lib/NGCP/Panel/Controller/API/PeeringRules.pm +++ b/lib/NGCP/Panel/Controller/API/PeeringRules.pm @@ -156,7 +156,7 @@ sub POST :Allow { $guard->commit; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); $c->response->status(HTTP_CREATED); $c->response->header(Location => sprintf('/%s%d', $c->request->path, $item->id)); diff --git a/lib/NGCP/Panel/Controller/API/PeeringRulesItem.pm b/lib/NGCP/Panel/Controller/API/PeeringRulesItem.pm index 38d9a9dfa1..65f1e2c6de 100644 --- a/lib/NGCP/Panel/Controller/API/PeeringRulesItem.pm +++ b/lib/NGCP/Panel/Controller/API/PeeringRulesItem.pm @@ -81,7 +81,7 @@ sub PATCH :Allow { $guard->commit; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); $self->return_representation($c, 'item' => $item, 'form' => $form, 'preference' => $preference ); } @@ -111,7 +111,7 @@ sub PUT :Allow { $guard->commit; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); $self->return_representation($c, 'item' => $item, 'form' => $form, 'preference' => $preference ); } @@ -128,7 +128,7 @@ sub DELETE :Allow { $item->delete; $guard->commit; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); $c->response->status(HTTP_NO_CONTENT); $c->response->body(q()); diff --git a/lib/NGCP/Panel/Controller/API/PeeringServers.pm b/lib/NGCP/Panel/Controller/API/PeeringServers.pm index 0dd4cbc521..4b4caff85f 100644 --- a/lib/NGCP/Panel/Controller/API/PeeringServers.pm +++ b/lib/NGCP/Panel/Controller/API/PeeringServers.pm @@ -152,7 +152,7 @@ sub POST :Allow { try { $item = $c->model('DB')->resultset('voip_peer_hosts')->create($resource); if($resource->{probe}) { - NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_dispatcher_reload(c => $c); } } catch($e) { $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering server.", $e); @@ -161,11 +161,11 @@ sub POST :Allow { $guard->commit; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); try { if($resource->{probe}) { - NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_dispatcher_reload(c => $c); } } catch($e) { $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering server.", diff --git a/lib/NGCP/Panel/Controller/API/PeeringServersItem.pm b/lib/NGCP/Panel/Controller/API/PeeringServersItem.pm index 93e875cfe2..c1f8afc1a8 100644 --- a/lib/NGCP/Panel/Controller/API/PeeringServersItem.pm +++ b/lib/NGCP/Panel/Controller/API/PeeringServersItem.pm @@ -11,6 +11,8 @@ require Catalyst::ActionRole::ACL; require NGCP::Panel::Role::HTTPMethods; require Catalyst::ActionRole::RequireSSL; +use NGCP::Panel::Utils::Peering; + sub allowed_methods{ return [qw/GET OPTIONS HEAD PATCH PUT DELETE/]; } @@ -75,30 +77,63 @@ sub PATCH :Allow { my $resource = $self->apply_patch($c, $old_resource, $json); last unless $resource; + my $probe_deleted = 0; + + try { + if ($old_resource->{enabled} && !$resource->{enabled}) { + NGCP::Panel::Utils::Peering::sip_delete_peer_registration( + c => $c, + prov_peer => $item + ); + } + } catch($e) { + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to update peering server.", + "failed to delete peer registration", $e); + last; + } + + try { + if (($resource->{probe} && $old_resource->{enabled} && !$resource->{enabled}) || + ($old_resource->{probe} && !$resource->{probe})) { + NGCP::Panel::Utils::Peering::sip_delete_probe( + c => $c, + ip => $item->ip, + port => $item->port, + transport => $item->transport, + ); + $probe_deleted = 1; + } + } catch($e) { + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to update peering server.", + "failed to delete probe", $e); + last; + } + my $form = $self->get_form($c); $item = $self->update_item($c, $item, $old_resource, $resource, $form); last unless $item; - $guard->commit; - - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); - try { - if (($item->probe && $old_resource->{enabled} && !$item->enabled) || ($old_resource->{probe} && !$item->probe)) { - NGCP::Panel::Utils::Peering::_sip_delete_probe( + if (!$old_resource->{enabled} && $resource->{enabled}) { + NGCP::Panel::Utils::Peering::sip_create_peer_registration( c => $c, - ip => $item->ip, - port => $item->port, - transport => $item->transport, + prov_peer => $item ); } - NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c); } catch($e) { - $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering server.", - "failed to reload kamailio cache", $e); + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to update peering server.", + "failed to create peer registration", $e); last; } + $guard->commit; + + if ($probe_deleted) { + NGCP::Panel::Utils::Peering::sip_dispatcher_reload(c => $c); + } + + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); + if ('minimal' eq $preference) { $c->response->status(HTTP_NO_CONTENT); $c->response->header(Preference_Applied => 'return=minimal'); @@ -133,30 +168,63 @@ sub PUT :Allow { last unless $resource; my $old_resource = { $item->get_inflated_columns }; + my $probe_deleted = 0; + + try { + if ($old_resource->{enabled} && !$resource->{enabled}) { + NGCP::Panel::Utils::Peering::sip_delete_peer_registration( + c => $c, + prov_peer => $item + ); + } + } catch($e) { + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to update peering server.", + "failed to delete peer registration", $e); + last; + } + + try { + if (($resource->{probe} && $old_resource->{enabled} && !$resource->{enabled}) || + ($old_resource->{probe} && !$resource->{probe})) { + NGCP::Panel::Utils::Peering::sip_delete_probe( + c => $c, + ip => $item->ip, + port => $item->port, + transport => $item->transport, + ); + $probe_deleted = 1; + } + } catch($e) { + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to update peering server.", + "failed to delete probe", $e); + last; + } + my $form = $self->get_form($c); $item = $self->update_item($c, $item, $old_resource, $resource, $form); last unless $item; - $guard->commit; - - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); - try { - if (($item->probe && $old_resource->{enabled} && !$item->enabled) || ($old_resource->{probe} && !$item->probe)) { - NGCP::Panel::Utils::Peering::_sip_delete_probe( + if (!$old_resource->{enabled} && $resource->{enabled}) { + NGCP::Panel::Utils::Peering::sip_create_peer_registration( c => $c, - ip => $item->ip, - port => $item->port, - transport => $item->transport, + prov_peer => $item ); } - NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c); } catch($e) { - $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering server.", - "failed to reload kamailio cache", $e); + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to update peering server.", + "failed to create peer registration", $e); last; } + $guard->commit; + + if ($probe_deleted) { + NGCP::Panel::Utils::Peering::sip_dispatcher_reload(c => $c); + } + + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); + if ('minimal' eq $preference) { $c->response->status(HTTP_NO_CONTENT); $c->response->header(Preference_Applied => 'return=minimal'); @@ -181,28 +249,41 @@ sub DELETE :Allow { { my $item = $self->item_by_id($c, $id); last unless $self->resource_exists($c, peeringserver => $item); - my $probe = $item->probe; - $item->delete; - $guard->commit; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + try { + if ($item->enabled) { + NGCP::Panel::Utils::Peering::sip_delete_peer_registration( + c => $c, prov_peer => $item + ); + } + } catch($e) { + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to delete peering server.", + "failed to delete peer registration", $e); + last; + } try { - if($probe) { - NGCP::Panel::Utils::Peering::_sip_delete_probe( + if($item->probe) { + NGCP::Panel::Utils::Peering::sip_delete_probe( c => $c, ip => $item->ip, port => $item->port, transport => $item->transport, ); - NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_dispatcher_reload(c => $c); } } catch($e) { - $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering server.", - "failed to reload kamailio cache", $e); + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to delete peering server.", + "failed to reload kamailio cache", $e); last; } + $item->delete; + $guard->commit; + + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); + + $c->response->status(HTTP_NO_CONTENT); $c->response->body(q()); } diff --git a/lib/NGCP/Panel/Controller/Header.pm b/lib/NGCP/Panel/Controller/Header.pm index 042a0cd816..47829fa129 100644 --- a/lib/NGCP/Panel/Controller/Header.pm +++ b/lib/NGCP/Panel/Controller/Header.pm @@ -536,7 +536,7 @@ Delete a rewrite rule determined by L. Show a modal to create a new rewrite rule using the form L. -=head2 _sip_dialplan_reload +=head2 sip_dialplan_reload This is ported from ossbss. diff --git a/lib/NGCP/Panel/Controller/Peering.pm b/lib/NGCP/Panel/Controller/Peering.pm index 952a2ef151..2a0c82d65a 100644 --- a/lib/NGCP/Panel/Controller/Peering.pm +++ b/lib/NGCP/Panel/Controller/Peering.pm @@ -138,7 +138,7 @@ sub edit :Chained('base') :PathPart('edit') { if($posted && $form->validated) { try { $c->stash->{group_result}->update($form->custom_get_values); - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); delete $c->session->{created_objects}->{contract}; NGCP::Panel::Utils::Message::info( c => $c, @@ -166,7 +166,7 @@ sub delete_peering :Chained('base') :PathPart('delete') { # manually delete hosts in group to let triggers hit in foreach my $p ($c->stash->{group_result}->voip_peer_hosts->all) { if($p->probe) { - NGCP::Panel::Utils::Peering::_sip_delete_probe( + NGCP::Panel::Utils::Peering::sip_delete_probe( c => $c, ip => $p->ip, port => $p->port, @@ -178,13 +178,15 @@ sub delete_peering :Chained('base') :PathPart('delete') { $c->stash->{server}->{ip} = $p->ip; $c->stash->{server}->{id} = $p->id; $c->stash->{server_result} = $p; - NGCP::Panel::Utils::Peering::_sip_delete_peer_registration(c => $c); + NGCP::Panel::Utils::Peering::sip_delete_peer_registration( + c => $c, prov_peer => $p + ); } $p->voip_peer_preferences->delete_all; $p->delete; } $c->stash->{group_result}->delete; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); NGCP::Panel::Utils::Message::info( c => $c, data => { $c->stash->{group_result}->get_inflated_columns }, @@ -226,7 +228,7 @@ sub create :Chained('group_list') :PathPart('create') :Args(0) { try { $c->model('DB')->resultset('voip_peer_groups')->create( $formdata ); - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); delete $c->session->{created_objects}->{contract}; NGCP::Panel::Utils::Message::info( c => $c, @@ -298,9 +300,9 @@ sub servers_create :Chained('servers_list') :PathPart('create') :Args(0) { probe => $form->values->{probe}, }; my $server = $c->stash->{group_result}->voip_peer_hosts->create($dbvalues); - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); if($dbvalues->{probe}) { - NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_dispatcher_reload(c => $c); } NGCP::Panel::Utils::Message::info( c => $c, @@ -376,26 +378,30 @@ sub servers_edit :Chained('servers_base') :PathPart('edit') :Args(0) { my $probing_before = $c->stash->{server_result}->probe; if ($enabled_before && !$form->values->{enabled}) { - NGCP::Panel::Utils::Peering::_sip_delete_peer_registration(c => $c); + NGCP::Panel::Utils::Peering::sip_delete_peer_registration( + c => $c, prov_peer => $c->stash->{server_result} + ); } $c->stash->{server_result}->update($form->values); if (!$enabled_before && $form->values->{enabled}) { - NGCP::Panel::Utils::Peering::_sip_create_peer_registration(c => $c); + NGCP::Panel::Utils::Peering::sip_create_peer_registration( + c => $c, prov_peer => $c->stash->{server_result} + ); } - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); if (($c->stash->{server_result}->probe && $enabled_before && !$c->stash->{server_result}->enabled) || ($probing_before && !$c->stash->{server_result}->probe)) { - NGCP::Panel::Utils::Peering::_sip_delete_probe( + NGCP::Panel::Utils::Peering::sip_delete_probe( c => $c, ip => $c->stash->{server_result}->ip, port => $c->stash->{server_result}->port, transport => $c->stash->{server_result}->transport, ); } - NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_dispatcher_reload(c => $c); NGCP::Panel::Utils::Message::info( c => $c, desc => $c->loc('Peering server successfully updated'), @@ -424,19 +430,21 @@ sub servers_delete :Chained('servers_base') :PathPart('delete') :Args(0) { my $probe = $c->stash->{server_result}->probe; my $enabled = $c->stash->{server_result}->enabled; if ($enabled) { - NGCP::Panel::Utils::Peering::_sip_delete_peer_registration(c => $c); + NGCP::Panel::Utils::Peering::sip_delete_peer_registration( + c => $c, prov_peer => $c->stash->{server_result} + ); } $c->stash->{server_result}->delete; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); if($probe) { - NGCP::Panel::Utils::Peering::_sip_delete_probe( + NGCP::Panel::Utils::Peering::sip_delete_probe( c => $c, ip => $c->stash->{server_result}->ip, port => $c->stash->{server_result}->port, transport => $c->stash->{server_result}->transport, ); - NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_dispatcher_reload(c => $c); } NGCP::Panel::Utils::Message::info( c => $c, @@ -590,17 +598,15 @@ sub servers_preferences_edit :Chained('servers_preferences_base') :PathPart('edi return; } - my $prov_peer = {}; my $type = 'peering'; - $prov_peer->{username} = $c->stash->{server}->{name}; - $prov_peer->{domain} = $c->stash->{server}->{ip}; - $prov_peer->{id} = $c->stash->{server_result}->lcr_gw->id; - $prov_peer->{uuid} = 0; + my $prov_peer = $c->stash->{server_result}; - unless(compare($old_authentication_prefs, $new_authentication_prefs)) { + if (!compare($old_authentication_prefs, $new_authentication_prefs)) { try { NGCP::Panel::Utils::Preferences::update_sems_peer_auth( - $c, $prov_peer, $type, $old_authentication_prefs, $new_authentication_prefs); + $c, $prov_peer, $type, + $old_authentication_prefs, $new_authentication_prefs + ); } catch($e) { NGCP::Panel::Utils::Message::error( c => $c, @@ -662,7 +668,7 @@ sub rules_create :Chained('rules_list') :PathPart('create') :Args(0) { }); die("peering rule already exists") if $dup_item; $c->stash->{group_result}->voip_peer_rules->create($form->values); - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); NGCP::Panel::Utils::Message::info( c => $c, desc => $c->loc('Peering rule successfully created'), @@ -746,7 +752,7 @@ sub rules_edit :Chained('rules_base') :PathPart('edit') :Args(0) { }); die("peering rule already exists") if ($dup_item && $dup_item->id != $c->stash->{rule_result}->id); $c->stash->{rule_result}->update($form->values); - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); NGCP::Panel::Utils::Message::info( c => $c, desc => $c->loc('Peering rule successfully changed'), @@ -773,7 +779,7 @@ sub rules_delete :Chained('rules_base') :PathPart('delete') :Args(0) { try { $c->stash->{rule_result}->delete; - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); + NGCP::Panel::Utils::Peering::sip_lcr_reload(c => $c); NGCP::Panel::Utils::Message::info( c => $c, data => { $c->stash->{rule_result}->get_inflated_columns }, diff --git a/lib/NGCP/Panel/Controller/Product.pm b/lib/NGCP/Panel/Controller/Product.pm index 9bdace6330..b6f38711e9 100644 --- a/lib/NGCP/Panel/Controller/Product.pm +++ b/lib/NGCP/Panel/Controller/Product.pm @@ -108,7 +108,7 @@ Retrieves and processes a datastructure containing preference groups, preference Data that is put on stash: pref_groups -=head2 _sip_domain_reload +=head2 sip_domain_reload Ported from ossbss diff --git a/lib/NGCP/Panel/Controller/Rewrite.pm b/lib/NGCP/Panel/Controller/Rewrite.pm index 1b4cb2ed5d..8b033664f1 100644 --- a/lib/NGCP/Panel/Controller/Rewrite.pm +++ b/lib/NGCP/Panel/Controller/Rewrite.pm @@ -593,7 +593,7 @@ Delete a rewrite rule determined by L. Show a modal to create a new rewrite rule using the form L. -=head2 _sip_dialplan_reload +=head2 sip_dialplan_reload This is ported from ossbss. diff --git a/lib/NGCP/Panel/Role/API/PeeringServers.pm b/lib/NGCP/Panel/Role/API/PeeringServers.pm index f632052e63..4ac5554278 100644 --- a/lib/NGCP/Panel/Role/API/PeeringServers.pm +++ b/lib/NGCP/Panel/Role/API/PeeringServers.pm @@ -85,6 +85,7 @@ sub update_item { } $item->update($resource); + return $item; } diff --git a/lib/NGCP/Panel/Utils/Peering.pm b/lib/NGCP/Panel/Utils/Peering.pm index 4aeb23ab4d..23c6e820ca 100644 --- a/lib/NGCP/Panel/Utils/Peering.pm +++ b/lib/NGCP/Panel/Utils/Peering.pm @@ -1,10 +1,11 @@ package NGCP::Panel::Utils::Peering; -use NGCP::Panel::Utils::XMLDispatcher; - use strict; use warnings; -sub _sip_lcr_reload { +use NGCP::Panel::Utils::Sems; +use NGCP::Panel::Utils::XMLDispatcher; + +sub sip_lcr_reload { my(%params) = @_; my($c) = @params{qw/c/}; @@ -21,73 +22,70 @@ EOF return 1; } -sub _sip_delete_peer_registration { - my(%params) = @_; - my($c) = @params{qw/c/}; - my $prov_peer = {}; - my $type = 'peering'; - - $prov_peer->{username} = $c->stash->{server}->{name}; - $prov_peer->{domain} = $c->stash->{server}->{ip}; - $prov_peer->{id} = $c->stash->{server_result}->lcr_gw->id; - $prov_peer->{uuid} = 0; - - my $pref_all = $c->stash->{server_result}->voip_peer_preferences->search({ - }, { - join => 'attribute', - }); - - my $auth_prefs = {}; - foreach my $pref ($pref_all->all) { - my $attr = $pref->attribute->attribute; - if ($attr =~ /^peer_auth_/) { - $auth_prefs->{$attr} = $pref->value; - } - } - - if (defined $auth_prefs->{peer_auth_register} && $auth_prefs->{peer_auth_register} == 1 && - defined $auth_prefs->{peer_auth_user} && - defined $auth_prefs->{peer_auth_realm} && - defined $auth_prefs->{peer_auth_pass}) { - NGCP::Panel::Utils::Sems::delete_peer_registration($c, $prov_peer, $type, $auth_prefs); - } - return 1; +sub sip_delete_peer_registration { + my (%params) = @_; + my ($c, $prov_peer) = @params{qw/c prov_peer/}; + my $type = 'peering'; + + my $pref_all = $prov_peer->voip_peer_preferences->search({ + },{ + join => 'attribute', + }); + + my $auth_prefs = {}; + foreach my $pref ($pref_all->all) { + my $attr = $pref->attribute->attribute; + if ($attr =~ /^peer_auth_/) { + $auth_prefs->{$attr} = $pref->value; + } + } + + if (defined $auth_prefs->{peer_auth_register} && + defined $auth_prefs->{peer_auth_user} && + defined $auth_prefs->{peer_auth_realm} && + defined $auth_prefs->{peer_auth_pass} && + $auth_prefs->{peer_auth_register} == 1) + { + NGCP::Panel::Utils::Sems::delete_peer_registration( + $c, $prov_peer, $type, $auth_prefs + ); + } } -sub _sip_create_peer_registration { - my(%params) = @_; - my($c) = @params{qw/c/}; - my $prov_peer = {}; - my $type = 'peering'; - - $prov_peer->{username} = $c->stash->{server}->{name}; - $prov_peer->{domain} = $c->stash->{server}->{ip}; - $prov_peer->{id} = $c->stash->{server_result}->lcr_gw->id; - $prov_peer->{uuid} = 0; - - my $pref_all = $c->stash->{server_result}->voip_peer_preferences->search({ - }, { - join => 'attribute', - }); - - my $auth_prefs = {}; - foreach my $pref ($pref_all->all) { - my $attr = $pref->attribute->attribute; - if ($attr =~ /^peer_auth_/) { - $auth_prefs->{$attr} = $pref->value; - } - } - if (defined $auth_prefs->{peer_auth_register} && $auth_prefs->{peer_auth_register} == 1 && - defined $auth_prefs->{peer_auth_user} && - defined $auth_prefs->{peer_auth_realm} && - defined $auth_prefs->{peer_auth_pass}) { - NGCP::Panel::Utils::Sems::create_peer_registration($c, $prov_peer, $type, $auth_prefs); - } - return 1; +sub sip_create_peer_registration { + my (%params) = @_; + my ($c, $prov_peer) = @params{qw/c prov_peer/}; + my $type = 'peering'; + + my $pref_all = $prov_peer->voip_peer_preferences->search({ + }, { + join => 'attribute', + }); + + my $auth_prefs = {}; + foreach my $pref ($pref_all->all) { + my $attr = $pref->attribute->attribute; + if ($attr =~ /^peer_auth_/) { + $auth_prefs->{$attr} = $pref->value; + } + } + + if (defined $auth_prefs->{peer_auth_register} && + defined $auth_prefs->{peer_auth_user} && + defined $auth_prefs->{peer_auth_realm} && + defined $auth_prefs->{peer_auth_pass} && + $auth_prefs->{peer_auth_register} == 1) + { + NGCP::Panel::Utils::Sems::create_peer_registration( + $c, $prov_peer, $type, $auth_prefs + ); + } } -sub _sip_dispatcher_reload { - my ($self, $c) = @_; +sub sip_dispatcher_reload { + my (%params) = @_; + my ($c) = @params{qw/c/}; + my ($res) = NGCP::Panel::Utils::XMLDispatcher::dispatch($c, "proxy-ng", 1, 1, < @@ -99,10 +97,12 @@ EOF return ref $res ? @{ $res } : (); } -sub _sip_delete_probe { +sub sip_delete_probe { my (%params) = @_; my ($c, $ip, $port, $transport) = @params{qw/c ip port transport/}; + my $string_transport = {'1' => 'UDP', '2' => 'TCP', '3' => 'TLS'}; + NGCP::Panel::Utils::XMLDispatcher::dispatch($c, "proxy-ng", 1, 1, < @@ -258,7 +258,7 @@ A temporary helper to manipulate peerings related data =head1 METHODS -=head2 _sip_lcr_reload +=head2 sip_lcr_reload This is ported from ossbss. diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index d2b3a48848..474e12e67f 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -556,10 +556,9 @@ sub update_preferences { return; } - if ($type eq "subscribers" && grep {/^peer_auth_/} keys %{ $resource }) { - $c->log->debug("Fetching old peer_auth_params for future comparison"); - get_peer_auth_params( - $c, $elem, $old_auth_prefs); + if (($type eq 'subscribers' || $type eq 'peerings') + && grep {/^peer_auth_/} keys %{ $resource }) { + get_peer_auth_params($c, $elem, $type, $old_auth_prefs); }; # make sure to not clear any internal prefs, except for those defined @@ -1067,18 +1066,19 @@ sub update_preferences { } } - if($type eq "subscribers") { - if(keys %{ $old_auth_prefs }) { + if ($type eq 'subscribers' || $type eq 'peerings') { + if (keys %{ $old_auth_prefs }) { my $new_auth_prefs = {}; - my $prov_subscriber = $elem; - get_peer_auth_params( - $c, $prov_subscriber, $new_auth_prefs); - unless(compare($old_auth_prefs, $new_auth_prefs)) { - $c->log->debug("peer_auth_params changed. Updating sems."); - my $type = 'subscriber'; + my $prov_object = $elem; + my $sems_type = $type eq 'subscribers' ? 'subscriber' : 'peering'; + get_peer_auth_params($c, $prov_object, $type, $new_auth_prefs); + if (!compare($old_auth_prefs, $new_auth_prefs)) { + $c->log->debug("peer_auth_params changed. updating sems registration."); try { update_sems_peer_auth( - $c, $prov_subscriber, $type, $old_auth_prefs, $new_auth_prefs); + $c, $prov_object, $sems_type, + $old_auth_prefs, $new_auth_prefs + ); } catch($e) { $c->log->error("Failed to set peer registration: $e"); &$err_code(HTTP_INTERNAL_SERVER_ERROR, "Internal Server Error."); # TODO? @@ -2730,18 +2730,18 @@ sub update_sems_peer_auth { my ($c, $prov_object, $type, $old_auth_prefs, $new_auth_prefs) = @_; # prov_object can be either peering or subscriber - if(!_is_peer_auth_active($c, $old_auth_prefs) && - _is_peer_auth_active($c, $new_auth_prefs)) { + if(!is_peer_auth_active($c, $old_auth_prefs) && + is_peer_auth_active($c, $new_auth_prefs)) { NGCP::Panel::Utils::Sems::create_peer_registration( $c, $prov_object, $type, $new_auth_prefs); - } elsif( _is_peer_auth_active($c, $old_auth_prefs) && - !_is_peer_auth_active($c, $new_auth_prefs)) { + } elsif(is_peer_auth_active($c, $old_auth_prefs) && + !is_peer_auth_active($c, $new_auth_prefs)) { NGCP::Panel::Utils::Sems::delete_peer_registration( $c, $prov_object, $type, $old_auth_prefs); - } elsif(_is_peer_auth_active($c, $old_auth_prefs) && - _is_peer_auth_active($c, $new_auth_prefs)){ + } elsif(is_peer_auth_active($c, $old_auth_prefs) && + is_peer_auth_active($c, $new_auth_prefs)){ NGCP::Panel::Utils::Sems::update_peer_registration( $c, $prov_object, $type, $new_auth_prefs, $old_auth_prefs); @@ -2751,20 +2751,28 @@ sub update_sems_peer_auth { } sub get_peer_auth_params { - my ($c, $prov_subscriber, $prefs) = @_; + my ($c, $prov_object, $type, $prefs) = @_; - foreach my $attribute (qw/peer_auth_user peer_auth_hf_user peer_auth_realm peer_auth_registrar_server peer_auth_pass peer_auth_register/){ + foreach my $attribute (qw/peer_auth_user peer_auth_hf_user peer_auth_realm peer_auth_registrar_server peer_auth_pass peer_auth_register/) { my $rs; - $rs = get_usr_preference_rs( - c => $c, - attribute => $attribute, - prov_subscriber => $prov_subscriber - ); + if ($type eq 'subscribers') { + $rs = get_usr_preference_rs( + c => $c, + attribute => $attribute, + prov_subscriber => $prov_object + ); + } elsif ($type eq 'peerings') { + $rs = get_peer_preference_rs( + c => $c, + attribute => $attribute, + peer_host => $prov_object + ); + } $prefs->{$attribute} = $rs->first ? $rs->first->value : undef; } } -sub _is_peer_auth_active { +sub is_peer_auth_active { my ($c, $prefs) = @_; if(defined $prefs->{peer_auth_register} && $prefs->{peer_auth_register} == 1 && defined $prefs->{peer_auth_user} && diff --git a/lib/NGCP/Panel/Utils/Sems.pm b/lib/NGCP/Panel/Utils/Sems.pm index ba1e96d552..37e7769cd4 100644 --- a/lib/NGCP/Panel/Utils/Sems.pm +++ b/lib/NGCP/Panel/Utils/Sems.pm @@ -37,10 +37,15 @@ sub create_peer_registration { if ($type eq 'peering') { # outbound registration for a peering - $sid = $prov_obj->{id}; - $uuid = $prov_obj->{uuid}; - $username = $prov_obj->{username}; - $domain = $prov_obj->{domain}; + if ($prov_obj->enabled) { + $sid = $prov_obj->lcr_gw->id; + $uuid = 0; + $username = $prov_obj->name; + $domain = $prov_obj->ip; + } else { + $c->log->debug("skip creating a registration for disabled peering."); + return 1; + } } elsif ($type eq "subscriber") { # outbound registration for usual subscriber $sid = $prov_obj->kamailio_subscriber->id; @@ -77,7 +82,7 @@ sub create_peer_registration { # if the outbound socket is default, then use the transport # of the peering's parameters (Protocol: UDP/TCP/TLS) } else { - SWITCH: for ($c->stash->{server_result}->transport) { + SWITCH: for ($prov_obj->transport) { /^2$/ && do { $transport = ';transport=tcp'; last SWITCH; @@ -138,7 +143,7 @@ EOF } die "Failed to add peer registration on application servers\n"; } - + return 1; } @@ -155,10 +160,15 @@ sub update_peer_registration { if ($type eq 'peering') { # outbound registration for a peering - $sid = $prov_obj->{id}; - $uuid = $prov_obj->{uuid}; - $username = $prov_obj->{username}; - $domain = $prov_obj->{domain}; + if ($prov_obj->enabled) { + $sid = $prov_obj->lcr_gw->id; + $uuid = 0; + $username = $prov_obj->name; + $domain = $prov_obj->ip; + } else { + $c->log->debug("skip updating a registration for disabled peering."); + return 1; + } } elsif ($type eq "subscriber") { # outbound registration for usual subscriber $sid = $prov_obj->kamailio_subscriber->id; @@ -195,7 +205,7 @@ sub update_peer_registration { # if the outbound socket is default, then use the transport # of the peering's parameters (Protocol: UDP/TCP/TLS) } else { - SWITCH: for ($c->stash->{server_result}->transport) { + SWITCH: for ($prov_obj->transport) { /^2$/ && do { $transport = ';transport=tcp'; last SWITCH; @@ -278,7 +288,7 @@ EOF } die "Failed to update peer registration on application servers\n"; } - + return 1; } @@ -294,10 +304,15 @@ sub delete_peer_registration { if ($type eq 'peering') { # outbound registration for a peering - $sid = $prov_obj->{id}; - $uuid = $prov_obj->{uuid}; - $username = $prov_obj->{username}; - $domain = $prov_obj->{domain}; + if ($prov_obj->enabled) { + $sid = $prov_obj->lcr_gw->id; + $uuid = 0; + $username = $prov_obj->name; + $domain = $prov_obj->ip; + } else { + $c->log->debug("skip deleting a registration for disabled peering."); + return 1; + } } elsif ($type eq "subscriber") { # outbound registration for usual subscriber $sid = $prov_obj->kamailio_subscriber->id; @@ -368,7 +383,7 @@ EOF } die "Failed to delete peer registration on application servers\n"; } - + return 1; }