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
mr13.4
Kirill Solomko 12 months ago
parent 7f8d6eacd3
commit 4d26ca5c9a

@ -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;
}

@ -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());

@ -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));

@ -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());

@ -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.",

@ -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());
}

@ -536,7 +536,7 @@ Delete a rewrite rule determined by L</rules_base>.
Show a modal to create a new rewrite rule using the form
L<NGCP::Panel::Form::RewriteRule>.
=head2 _sip_dialplan_reload
=head2 sip_dialplan_reload
This is ported from ossbss.

@ -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 },

@ -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

@ -593,7 +593,7 @@ Delete a rewrite rule determined by L</rules_base>.
Show a modal to create a new rewrite rule using the form
L<NGCP::Panel::Form::RewriteRule>.
=head2 _sip_dialplan_reload
=head2 sip_dialplan_reload
This is ported from ossbss.

@ -85,6 +85,7 @@ sub update_item {
}
$item->update($resource);
return $item;
}

@ -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, <<EOF );
<?xml version="1.0" ?>
<methodCall>
@ -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, <<EOF );
<?xml version="1.0" ?>
<methodCall>
@ -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.

@ -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} &&

@ -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;
}

Loading…
Cancel
Save