package NGCP::Panel::Utils::Kamailio; use Sipwise::Base; use NGCP::Panel::Utils::XMLDispatcher; use NGCP::Panel::Utils::DateTime; use Data::Dumper; sub delete_location_contact { my ($c, $prov_subscriber, $contact) = @_; my $aor = $prov_subscriber->username . '@' . $prov_subscriber->domain->domain; my $ret = NGCP::Panel::Utils::XMLDispatcher::dispatch($c, "proxy-ng", 1, 1, < ul.rm_contact location $aor $contact EOF } sub delete_location { my ($c, $prov_subscriber) = @_; my $aor = $prov_subscriber->username . '@' . $prov_subscriber->domain->domain; my $ret = NGCP::Panel::Utils::XMLDispatcher::dispatch($c, "proxy-ng", 1, 1, < ul.rm location $aor EOF } sub create_location { my ($c, $prov_subscriber, $params) = @_; my($contact, $q, $expires, $flags, $cflags) = @$params{qw/contact q expires flags cflags/}; my $aor = get_aor($c, $prov_subscriber); my $path = _compose_location_path($c, $prov_subscriber, $params);#compose path from path or socket from params if ($expires) { $expires = NGCP::Panel::Utils::DateTime::from_string($expires)->epoch; $expires //= 0; $expires -= time(); # "expires" is required to be an integer but it is not a timestamp # <=0: 1970-01-01 00:00:00 # 1: now # >=1: now + seconds to the future } else { $expires = 4294967295; } $expires = 0 if $expires < 0; $flags //= 0; $cflags //= 0; my $ret = NGCP::Panel::Utils::XMLDispatcher::dispatch($c, "proxy-ng", 1, 1, < ul.add location $aor $contact $expires $q $flags $cflags 0 EOF } sub flush { my ($c) = @_; my $ret = NGCP::Panel::Utils::XMLDispatcher::dispatch($c, "proxy-ng", 1, 1, < ul.flush EOF } # returns: () or (ID, STATUS, [XML]) sub trusted_reload { my ($c) = @_; my ($ret) = NGCP::Panel::Utils::XMLDispatcher::dispatch($c, "proxy-ng", 1, 1, < permissions.trustedReload EOF return ref $ret ? @{ $ret } : (); } sub get_aor{ my ($c, $prov_subscriber) = @_; return $prov_subscriber->username . '@' . $prov_subscriber->domain->domain; } sub _compose_location_path { my ($c, $prov_subscriber, $params) = @_; #path: #The "path" uri points to the sip_int on the LB node to which this subscriber belongs. #The "socket" points to the LB interface from which the incoming calls to this registration should be sent out. #See detailed description of the implemented logic in the workfron tasks 37459, 14589 my $socket = $params->{socket}; my $path_default = $c->config->{sip}->{path} || ''; if (!$socket) { #user selected default outbound option $c->log->debug('_compose_location_path: socket is empty, return default path:'.$path_default); return $path_default; } my $lb_clusters = $c->config->{cluster_sets}; my $subscriber_lb_ptr_preference_rs = NGCP::Panel::Utils::Preferences::get_chained_preference_rs( $c, 'lbrtp_set', $prov_subscriber, { type => 'usr', 'order' => [qw/usr prof dom/] }, ); my ($subscriber_lb_ptr,$subscriber_lb); if ($subscriber_lb_ptr_preference_rs && $subscriber_lb_ptr_preference_rs->first) { $c->log->debug('_compose_location_path: lbrtp_set:'.$subscriber_lb_ptr_preference_rs->first->value); $subscriber_lb_ptr = $subscriber_lb_ptr_preference_rs->first->value; } $subscriber_lb_ptr //= $lb_clusters->{default}; #TODO: is it ok to use default 'sip:lb@127.0.0.1:5060;lr' here? $subscriber_lb = $lb_clusters->{$subscriber_lb_ptr} // 'sip:lb@127.0.0.1:5060;lr'; my $path = '<'.$subscriber_lb.';socket='.$socket.'>'; $c->log->debug('_compose_location_path: path:'.$path); return $path; } 1; # vim: set tabstop=4 expandtab: