Implemented sip peering functionality to insert lcr rules and peering gateways.

2.0@2434
Andreas Granig 17 years ago
parent 87631c3f60
commit c4f0fba5d7

@ -0,0 +1,498 @@
package admin::Controller::peering;
use strict;
use warnings;
use base 'Catalyst::Controller';
use Data::Dumper;
=head1 NAME
admin::Controller::peering - Catalyst Controller
=head1 DESCRIPTION
Catalyst Controller.
=head1 METHODS
=head2 index
Configure SIP peerings
=cut
sub index : Private {
my ( $self, $c ) = @_;
$c->stash->{template} = 'tt/peering.tt';
my $peer_groups;
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_peer_groups',
undef,
\$peer_groups
);
$c->stash->{peer_groups} = $$peer_groups{result};
$c->stash->{editid} = $c->request->params->{editid};
return 1;
}
=head2 do_delete_grp
Delete a peering group
=cut
sub delete_grp : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
my $grpid = $c->request->params->{grpid};
if($c->model('Provisioning')->call_prov( $c, 'voip', 'delete_peer_group',
{ id => $grpid
},
undef
))
{
$messages{epeermsg} = 'Server.Voip.PeerGroupDeleted';
$c->session->{messages} = \%messages;
$c->response->redirect("/peering");
return;
}
$c->response->redirect("/peering");
return;
}
=head2 create_grp
Create a peering group
=cut
sub create_grp : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
my $grpname = $c->request->params->{grpname};
$messages{cpeererr} = 'Client.Syntax.MalformedPeerGroupName'
unless $grpname =~ /^[a-zA-Z0-9_\-]+/;
my $grpdesc = $c->request->params->{grpdesc};
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'voip', 'create_peer_group',
{ name => $grpname,
description => $grpdesc
},
undef
))
{
$messages{cpeermsg} = 'Server.Voip.SavedSettings';
$c->session->{messages} = \%messages;
$c->response->redirect("/peering");
return;
}
else
{
$messages{cpeererr} = 'Client.Voip.InputErrorFound';
}
} else {
my %arefill = ();
$arefill{name} = $grpname;
$arefill{desc} = $grpdesc;
$c->stash->{arefill} = \%arefill;
}
$c->session->{messages} = \%messages;
#$c->session->{restore_domedit_input} = \%settings;
# $c->response->redirect("/peering?edit_group=$grpname");
$c->response->redirect("/peering");
return;
}
=head2 edit_grp
Edit a peering group
=cut
sub edit_grp : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
my $grpid = $c->request->params->{grpid};
my $grpdesc = $c->request->params->{grpdesc};
$c->log->debug('*** edit grp');
unless(keys %messages) {
$c->log->debug('*** call backend');
if($c->model('Provisioning')->call_prov( $c, 'voip', 'update_peer_group',
{ id => $grpid,
description => $grpdesc
},
undef
))
{
$c->log->debug('*** call backend ok');
$messages{epeermsg} = 'Server.Voip.SavedSettings';
}
else
{
$c->log->debug('*** call backend failed');
$messages{epeererr} = 'Client.Voip.InputErrorFound';
}
}
$c->session->{messages} = \%messages;
$c->response->redirect("/peering");
return;
}
sub detail : Local {
my ( $self, $c ) = @_;
$c->stash->{template} = 'tt/peering_detail.tt';
my $grpid = $c->request->params->{group_id};
my $peer_details;
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_peer_group_details',
{ id => $grpid },
\$peer_details
);
$c->log->debug(Dumper $peer_details);
$c->stash->{grp} = $peer_details;
$c->stash->{reditid} = $c->request->params->{reditid};
$c->stash->{peditid} = $c->request->params->{peditid};
return 1;
}
=head2 create_rule
Create a peering rule for a given group
=cut
sub create_rule : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
my $grpid = $c->request->params->{grpid};
my $callee_prefix = $c->request->params->{callee_prefix};
my $caller_pattern = $c->request->params->{caller_pattern};
my $priority = $c->request->params->{priority};
my $description = $c->request->params->{description};
# $messages{crulerr} = 'Client.Syntax.MalformedPeerGroupName'
# unless $callee_prefix =~ /^[a-zA-Z0-9_\.\-\@\:]+/;
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'voip', 'create_peer_rule',
{ group_id => $grpid,
callee_prefix => $callee_prefix,
caller_pattern => $caller_pattern,
priority => $priority,
description => $description
},
undef
))
{
$messages{erulmsg} = 'Server.Voip.SavedSettings';
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
else
{
$messages{erulerr} = 'Client.Voip.InputErrorFound';
}
} else {
# TODO: add proper values here and set them in tt
my %arefill = ();
# $arefill{name} = $grpname;
# $arefill{desc} = $grpdesc;
$c->stash->{arefill} = \%arefill;
}
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
=head2 delete_rule
Delete a peering rule
=cut
sub delete_rule : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
my $grpid = $c->request->params->{grpid};
my $rule_id = $c->request->params->{ruleid};
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'voip', 'delete_peer_rule',
{ id => $rule_id
},
undef
))
{
$messages{erulmsg} = 'Server.Voip.SavedSettings';
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
} else {
}
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
=head2 edit_rule
Edit a peering rule
=cut
sub edit_rule : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
my $grpid = $c->request->params->{grpid};
my $ruleid = $c->request->params->{ruleid};
my $callee_prefix = $c->request->params->{callee_prefix};
my $caller_pattern = $c->request->params->{caller_pattern};
my $priority = $c->request->params->{priority};
my $description = $c->request->params->{description};
# $messages{crulerr} = 'Client.Syntax.MalformedPeerGroupName'
# unless $callee_prefix =~ /^[a-zA-Z0-9_\.\-\@\:]+/;
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'voip', 'update_peer_rule',
{ id => $ruleid,
callee_prefix => $callee_prefix,
caller_pattern => $caller_pattern,
priority => $priority,
description => $description
},
undef
))
{
$messages{erulmsg} = 'Server.Voip.SavedSettings';
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
else
{
$messages{erulerr} = 'Client.Voip.InputErrorFound';
}
} else {
# TODO: add proper values here and set them in tt
my %arefill = ();
# $arefill{name} = $grpname;
# $arefill{desc} = $grpdesc;
$c->stash->{arefill} = \%arefill;
}
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
=head2 create_peer
Create a peering server for a given group
=cut
sub create_peer : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
my $grpid = $c->request->params->{grpid};
my $name = $c->request->params->{name};
my $ip = $c->request->params->{ip};
my $port = $c->request->params->{port};
my $via_lb = defined $c->request->params->{via_lb} ? 1 : 0;
#TODO: add syntax checks here
# $messages{serverr} = 'Client.Syntax.MalformedPeerGroupName'
# unless $callee_prefix =~ /^[a-zA-Z0-9_\.\-\@\:]+/;
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'voip', 'create_peer_host',
{ group_id => $grpid,
name => $name,
ip => $ip,
port => $port,
via_lb => $via_lb
},
undef
))
{
$messages{servmsg} = 'Server.Voip.SavedSettings';
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
else
{
$messages{serverr} = 'Client.Voip.InputErrorFound';
}
} else {
# TODO: add proper values here and set them in tt
my %arefill = ();
# $arefill{name} = $grpname;
# $arefill{desc} = $grpdesc;
$c->stash->{arefill} = \%arefill;
}
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
=head2 delete_peer
Delete a peering host
=cut
sub delete_peer : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
my $grpid = $c->request->params->{grpid};
my $peer_id = $c->request->params->{peerid};
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'voip', 'delete_peer_host',
{ id => $peer_id
},
undef
))
{
$messages{servmsg} = 'Server.Voip.SavedSettings';
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
} else {
}
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
=head2 edit_peer
Edit a peering host
=cut
sub edit_peer : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
my $grpid = $c->request->params->{grpid};
my $peerid = $c->request->params->{peerid};
my $name = $c->request->params->{name};
my $ip = $c->request->params->{ip};
my $port = $c->request->params->{port};
my $via_lb = defined $c->request->params->{via_lb} ? 1 : 0;
# $messages{crulerr} = 'Client.Syntax.MalformedPeerGroupName'
# unless $callee_prefix =~ /^[a-zA-Z0-9_\.\-\@\:]+/;
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'voip', 'update_peer_host',
{ id => $peerid,
name => $name,
ip => $ip,
port => $port,
via_lb => $via_lb
},
undef
))
{
$messages{servmsg} = 'Server.Voip.SavedSettings';
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
else
{
$messages{erulerr} = 'Client.Voip.InputErrorFound';
}
} else {
# TODO: add proper values here and set them in tt
my %arefill = ();
# $arefill{name} = $grpname;
# $arefill{desc} = $grpdesc;
$c->stash->{arefill} = \%arefill;
}
$c->session->{messages} = \%messages;
$c->response->redirect("/peering/detail?group_id=$grpid");
return;
}
=head1 BUGS AND LIMITATIONS
=over
=item currently none
=back
=head1 SEE ALSO
Provisioning model, Sipwise::Provisioning::Billing, Catalyst
=head1 AUTHORS
Andreas Granig <agranig@sipwise.com>
=head1 COPYRIGHT
The domain controller is Copyright (c) 2007 Sipwise GmbH, Austria. All
rights reserved.
=cut
# ende gelaende
1;

@ -30,7 +30,7 @@
[% IF Catalyst.config.billing_features %]
<li><a href="/billing">Billing</a></li>
[% END %]
[%# <li><a href="/gwgroup">Gateway Settings</a></li> %]
<li><a href="/peering">SIP Peerings</a></li>
[%# <li><a href="/sipserver">SIP Server Settings</a></li> %]
</ul>
[% END %]

@ -0,0 +1,103 @@
<h3>SIP Peering Groups</h3>
<div class="p1">
[% IF messages.epeermsg %]<div class="goodmsg">[% messages.epeermsg %]</div>[% END %]
[% IF messages.epeererr %]<div class="errormsg">[% messages.epeererr %]</div>[% END %]
<table class="domains">
<tr class="table_header">
<td>Name</td>
<td>Description</td>
<td style="width:40px;" />
<td style="width:60px;" />
</tr>
[% id = 0 %]
[% FOREACH grp = peer_groups %]
<tr>
[% IF grp.id == editid %]
<td>[% grp.name %]</td>
<form action="/peering/edit_grp" method="post">
<input type="hidden" name="grpid" value="[% grp.id %]" />
<td>
<input type="text" id="addtxt" title="string, description of group"
name="grpdesc" value="[% grp.description %]" />
</td>
<td>
<div class="postlink">
<label for="grpsave[% id %]">save</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="grpsave[% id %]" />
</div>
</td>
</form>
<td><a href="/peering" class="aaction">cancel</a></td>
[% ELSE %]
<td><a href="/peering/detail?group_id=[%grp.id%]" class="aaction">[% grp.name %]</a></td>
<td>[% grp.description %]</td>
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/peering?editid=[% grp.id %]" class="aaction">edit</a>
[% END %]
</td>
<form action="/peering/delete_grp" method="post">
<input type="hidden" name="grpid" value="[% grp.id %]" />
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<div class="postlink">
<label for="grpdel[% id %]">delete</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="grpdel[% id %]" />
</div>
[% END %]
</td>
[% END %]
</form>
</tr>
[% id = id + 1 %]
[% END %]
</table>
</div>
[% UNLESS Catalyst.session.admin.read_only %]
<h3>Create Peering Group</h3>
<div class="p1">
[% IF messages.cpeermsg %]<div class="goodmsg">[% messages.cpeermsg %]</div>[% END %]
[% IF messages.cpeererr %]<div class="errormsg">[% messages.cpeererr %]</div>[% END %]
<table class="domains">
<tr class="table_header">
<td>Name</td>
<td>Description</td>
<td style="width:40px;" />
<td style="width:60px;" />
</tr>
<form action="/peering/create_grp" method="post">
<tr>
<td>
<input type="text" size="20" name="grpname" title="string, name of group"
id="addtxt" value="[% arefill.name %]" />
</td>
<td>
<input type="text" size="20" name="grpdesc" title="string, description of group"
id="addtxt" value="[% arefill.desc %]" />
</td>
<td>
<div class="postlink">
<label for="grpadd">add</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="grpadd" />
</div>
</td>
</tr>
[% IF messages.acc || messages.atimezone %]
<tr><td colspan="5">
<div class="errormsg">
[% messages.acc %]
</div>
</td></tr>
[% END %]
</form>
</table>
</div>
[% END %]

@ -0,0 +1,230 @@
<h2> SIP Peering Group
<a class="noarrow" href="detail?group_id=[% grp.id %]">
[% grp.name %]</a>
</h2>
<h3>Peering Rules</h3>
<div class="p1">
[% IF messages.erulmsg %]<div class="goodmsg">[% messages.erulmsg %]</div>[% END %]
[% IF messages.erulerr %]<div class="errormsg">[% messages.erulerr %]</div>[% END %]
<table class="domains">
<tr class="table_header">
<td>Callee Prefix</td>
<td>Caller Pattern</td>
<td>Priority</td>
<td>Description</td>
<td style="width:40px;" />
<td style="width:60px;" />
</tr>
[% id = 0 %]
[% FOREACH rule = grp.rules %]
<tr>
[% IF rule.id == reditid %]
<form action="/peering/edit_rule" method="post">
<input type="hidden" name="grpid" value="[% grp.id %]" />
<input type="hidden" name="ruleid" value="[% rule.id %]" />
<td>
<input type="text" size="15 id="addtxt" title="string, callee prefix"
name="callee_prefix" value="[% rule.callee_prefix %]" />
</td>
<td>
<input type="text" size="15" id="addtxt" title="string, caller pattern"
name="caller_pattern" value="[% rule.caller_pattern %]" />
</td>
<td>
<select title="string, priority" size="1" name="priority">
[% count = 1 %]
[% WHILE count < 10 %]
<option [% "selected" IF rule.priority == count %]>[% count %]</option>
[% count = count + 1 %]
[% END %]
</select>
</td>
<td>
<input type="text" size="15" id="addtxt" title="string, rule description"
name="description" value="[% rule.description %]" />
</td>
<td>
<div class="postlink">
<label for="rsave[% id %]">save</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="rsave[% id %]" />
</div>
</td>
</form>
<td><a href="/peering/detail?group_id=[% grp.id %]" class="aaction">cancel</a></td>
[% ELSE %]
<td>[% rule.callee_prefix %]</td>
<td>[% rule.caller_pattern %]</td>
<td>[% rule.priority %]</td>
<td>[% rule.description %]</td>
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/peering/detail?group_id=[% grp.id %]&reditid=[% rule.id %]" class="aaction">edit</a>
[% END %]
</td>
<form action="/peering/delete_rule" method="post">
<input type="hidden" name="grpid" value="[% grp.id %]" />
<input type="hidden" name="ruleid" value="[% rule.id %]" />
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<div class="postlink">
<label for="rdel[% id %]">delete</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="rdel[% id %]" />
</div>
[% END %]
</td>
[% END %]
</form>
</tr>
[% id = id + 1 %]
[% END %]
<tr>
<form action="/peering/create_rule" method="post">
<input type="hidden" name="grpid" value="[% grp.id %]" />
<td>
<input type="text" size="15" id="addtxt" title="string, callee prefix"
name="callee_prefix" value="" />
</td>
<td>
<input type="text" size="15" id="addtxt" title="string, caller pattern"
name="caller_pattern" value="" />
</td>
<td>
<select title="string, priority" size="1" name="priority">
[% count = 1 %]
[% WHILE count < 10 %]
<option [% "selected" IF 1 == count %]>[% count %]</option>
[% count = count + 1 %]
[% END %]
</select>
</td>
<td>
<input type="text" size="15" id="addtxt" title="string, rule description"
name="description" value="" />
</td>
<td>
<div class="postlink">
<label for="radd">add</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="radd" />
</div>
</form>
</td>
<td />
</tr>
</table>
</div>
<h3>Peering Servers</h3>
<div class="p1">
[% IF messages.servmsg %]<div class="goodmsg">[% messages.servmsg %]</div>[% END %]
[% IF messages.serverr %]<div class="errormsg">[% messages.serverr %]</div>[% END %]
<table class="domains">
<tr class="table_header">
<td>Name</td>
<td>IP Address</td>
<td>Port</td>
<td>Via Loadbalancer</td>
<td style="width:40px;" />
<td style="width:60px;" />
</tr>
[% id = 0 %]
[% FOREACH peer = grp.peers %]
<tr>
[% IF peer.id == peditid %]
<form action="/peering/edit_peer" method="post">
<input type="hidden" name="grpid" value="[% grp.id %]" />
<input type="hidden" name="peerid" value="[% peer.id %]" />
<td>
<input type="text" size="15 id="addtxt" title="string, peer name"
name="name" value="[% peer.name %]" />
</td>
<td>
<input type="text" size="15" id="addtxt" title="string, peer ip address"
name="ip" value="[% peer.ip %]" />
</td>
<td>
<input type="text" size="5" id="addtxt" title="int, peer port"
name="port" value="[% peer.port %]" />
</td>
<td class="tdcenter">
<input type="checkbox" class="checkbox" title="check to route via load balancer "
name="via_lb" [% IF peer.via_lb %]checked="checked"[% END %] />
</td>
<td>
<div class="postlink">
<label for="psave[% id %]">save</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="psave[% id %]" />
</div>
</td>
</form>
<td><a href="/peering/detail?group_id=[% grp.id %]" class="aaction">cancel</a></td>
[% ELSE %]
<td>[% peer.name %]</td>
<td>[% peer.ip %]</td>
<td>[% peer.port %]</td>
<td class="tdcenter">
<input type="checkbox" class="checkbox" name="via_lb"
[% IF peer.via_lb %]checked="checked"[% END %] disabled="disabled" />
</td>
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/peering/detail?group_id=[% grp.id %]&peditid=[% peer.id %]" class="aaction">edit</a>
[% END %]
</td>
<form action="/peering/delete_peer" method="post">
<input type="hidden" name="grpid" value="[% grp.id %]" />
<input type="hidden" name="peerid" value="[% peer.id %]" />
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<div class="postlink">
<label for="pdel[% id %]">delete</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="pdel[% id %]" />
</div>
[% END %]
</td>
[% END %]
</form>
</tr>
[% id = id + 1 %]
[% END %]
<tr>
<form action="/peering/create_peer" method="post">
<input type="hidden" name="grpid" value="[% grp.id %]" />
<td>
<input type="text" size="15" id="addtxt" title="string, peer name"
name="name" value="" />
</td>
<td>
<input type="text" size="15" id="addtxt" title="string, peer ip address"
name="ip" value="" />
</td>
<td>
<input type="text" size="5" id="addtxt" title="string, peer port"
name="port" value="5060" />
</td>
<td class="tdcenter">
<input type="checkbox" class="checkbox" title="check to route via load balancer "
name="via_lb" checked="checked" />
</td>
<td>
<div class="postlink">
<label for="padd">add</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="padd" />
</div>
</form>
</td>
<td />
</tr>
</table>
</div>
Loading…
Cancel
Save