MT#19113 subscriber and peering apply_rewrite and lookup

- extended apply_rewrite to allow "rwr_rs" parameter to
      override rewrite rule set
    - added lookup functions for Subscriber and Peering to
      perform a lookup based on calleer/callee

Change-Id: Iceea7a807587e12e1f5485998ade23bc932adaaf
changes/85/5685/2
Kirill Solomko 10 years ago
parent 945b5a52bc
commit fd56d72476

@ -19,6 +19,135 @@ EOF
return 1;
}
sub apply_rewrite {
my (%params) = @_;
my $c = $params{c};
my $peer_host = $params{peer_host};
my $callee = $params{number};
my $dir = $params{direction};
my $rws_id = $params{rws_id}; # override rewrite rule set
my $rwr_rs = undef;
return $callee unless $dir =~ /^(caller_in|callee_in|caller_out|callee_out|callee_lnp|caller_lnp)$/;
my ($field, $direction) = split /_/, $dir;
$dir = "rewrite_".$dir."_dpid";
if ($rws_id) {
$rwr_rs = $c->model('DB')->resultset('voip_rewrite_rule_sets')->search({
id => $rws_id,
}, {
'+select' => (sprintf "%s_%s_dpid", $field, $direction),
'+as' => qw(rwr_id),
});
unless ($rwr_rs->count) {
return $callee;
}
} elsif (not $peer_host) {
$c->log->warn('could not apply rewrite: no peer host found.');
return $callee;
} else {
$rwr_rs = NGCP::Panel::Utils::Preferences::get_peer_preference_rs(
c => $c, attribute => $dir,
peer_host => $peer_host,
);
unless($rwr_rs->count) {
return $callee;
}
}
my $rule_rs = $c->model('DB')->resultset('voip_rewrite_rules')->search({
'ruleset.'.$field.'_'.$direction.'_dpid' =>
$rws_id ? $rwr_rs->first->get_column('rwr_id')
: $rwr_rs->first->value,
direction => $direction,
field => $field,
}, {
join => 'ruleset',
order_by => { -asc => 'priority' },
});
foreach my $r($rule_rs->all) {
my $match = $r->match_pattern;
my $replace = $r->replace_pattern;
#print ">>>>>>>>>>> match=$match, replace=$replace\n";
$match = [ $match ] if(ref $match ne "ARRAY");
$replace = shift @{ $replace } if(ref $replace eq "ARRAY");
$replace =~ s/\\(\d{1})/\${$1}/g;
$replace =~ s/\"/\\"/g;
$replace = qq{"$replace"};
my $found;
#print ">>>>>>>>>>> apply matches\n";
foreach my $m(@{ $match }) {
#print ">>>>>>>>>>> m=$m, r=$replace\n";
if($callee =~ s/$m/$replace/eeg) {
# we only process one match
#print ">>>>>>>>>>> match found, callee=$callee\n";
$found = 1;
last;
}
}
last if $found;
#print ">>>>>>>>>>> done, match=$match, replace=$replace, callee is $callee\n";
}
return $callee;
}
sub lookup {
my (%params) = @_;
my ($c, $caller, $callee) = @{params}{qw(c caller callee)};
return unless $caller && $callee;
my $rs = $c->model('DB')->resultset('voip_peer_rules')->search({
enabled => 1,
},{
'+columns' => {
rule_match => \do {
"'$callee' LIKE CONCAT(callee_prefix,'%') as rule_match"
},
},
having => { rule_match => 1 },
order_by => { -desc => qw/callee_prefix/ },
});
return undef unless $rs->first;
my %peer_data;
my @peer_groups;
foreach my $rule ($rs->all) {
my $caller_pattern = $rule->caller_pattern || '.*';
my $callee_pattern = $rule->callee_pattern || '.*';
next unless $caller =~ /$caller_pattern/;
next unless $callee =~ /$callee_pattern/;
push @{$peer_data{length($rule->callee_prefix)}{$rule->group->priority}}, $rule->group;
}
foreach my $len (sort { $b <=> $a } keys %peer_data) {
my $len_data = $peer_data{$len};
foreach my $prio (sort { $a <=> $b } keys %$len_data) {
my $groups = $len_data->{$prio};
foreach my $group (@$groups) {
unless (grep { $_ eq $group} @peer_groups) {
push @peer_groups, $group;
}
}
}
}
return \@peer_groups;
}
1;
=head1 NAME
@ -37,6 +166,14 @@ This is ported from ossbss.
Reloads lcr cache of sip proxies.
=head2 apply_rewrite
Applies rewrite rules using a peering group (and its first peering host preferences)
=head2 lookup
Peering group lookup based on peering rules and peering group priorities
=head1 AUTHOR
Irina Peshinskaya

@ -1186,6 +1186,7 @@ sub apply_rewrite {
my $subscriber = $params{subscriber};
my $callee = $params{number};
my $dir = $params{direction};
my $rws_id = $params{rws_id}; # override rewrite rule set
my $sub_type = 'provisioning';
my $rwr_rs = undef;
@ -1194,7 +1195,17 @@ sub apply_rewrite {
my ($field, $direction) = split /_/, $dir;
$dir = "rewrite_".$dir."_dpid";
unless ($subscriber) {
if ($rws_id) {
$rwr_rs = $c->model('DB')->resultset('voip_rewrite_rule_sets')->search({
id => $rws_id,
}, {
'+select' => (sprintf "%s_%s_dpid", $field, $direction),
'+as' => qw(rwr_id),
});
unless ($rwr_rs->count) {
return $callee;
}
} elsif (not $subscriber) {
$c->log->warn('could not apply rewrite: no subscriber found.');
return $callee;
} elsif ($subscriber->provisioning_voip_subscriber) {
@ -1227,13 +1238,21 @@ sub apply_rewrite {
}
my $rule_rs = $c->model('DB')->resultset('voip_rewrite_rules')->search({
'ruleset.'.$field.'_'.$direction.'_dpid' => $rwr_rs->first->value,
'ruleset.'.$field.'_'.$direction.'_dpid' =>
$rws_id ? $rwr_rs->first->get_column('rwr_id')
: $rwr_rs->first->value,
direction => $direction,
field => $field,
}, {
join => 'ruleset',
order_by => { -asc => 'priority' },
});
unless($rule_rs->count) {
$c->log->warn('could not apply rewrite: no rewrite rule set found.');
return $callee;
}
my $cache = {};
foreach my $r($rule_rs->all) {
my @entries = ();
@ -1460,6 +1479,31 @@ sub number_as_string{
? $number_row->{cc} . ($number_row->{ac} // '') . $number_row->{sn}
: $number_row->cc . ($number_row->ac // '') . $number_row->sn;
}
sub lookup {
my (%params) = @_;
my ($c, $lookup) = @{params}{qw(c lookup)};
my $rs = $c->model('DB')->resultset('voip_subscribers')->search({
'voip_dbaliases.username' => { 'like' => $lookup.'%' },
status => { '!=' => 'terminated' },
}, {
join => { 'provisioning_voip_subscriber' => 'voip_dbaliases' },
order_by => { -desc => qw/voip_dbaliases.username/ },
});
if (not $rs->first and $lookup =~ /(\S+?)\@(\S+)/) {
$rs = $c->model('DB')->resultset('voip_subscribers')->search({
username => $1,
'domain.domain' => $2,
status => { '!=' => 'terminated' },
}, {
join => 'domain',
});
}
return $rs->first || undef;
}
1;
=head1 NAME

Loading…
Cancel
Save