From c9de68f1c6b79d0ff82b788d1411aabe3b924449 Mon Sep 17 00:00:00 2001 From: Andreas Granig Date: Fri, 12 Aug 2011 01:01:43 +0000 Subject: [PATCH] Add views and controller for new global rewrite rule set configuration. --- lib/admin/Controller/rewrite.pm | 437 ++++++++++++++++++++++++++++++++ root/layout/menu | 1 + root/tt/rewrite.tt | 73 ++++++ root/tt/rewrite_detail.tt | 184 ++++++++++++++ 4 files changed, 695 insertions(+) create mode 100644 lib/admin/Controller/rewrite.pm create mode 100644 root/tt/rewrite.tt create mode 100644 root/tt/rewrite_detail.tt diff --git a/lib/admin/Controller/rewrite.pm b/lib/admin/Controller/rewrite.pm new file mode 100644 index 0000000..df69e4b --- /dev/null +++ b/lib/admin/Controller/rewrite.pm @@ -0,0 +1,437 @@ +package admin::Controller::rewrite; + +use strict; +use warnings; +use base 'Catalyst::Controller'; +use Data::Dumper; +use admin::Utils; + +=head1 NAME + +admin::Controller::rewrite - Catalyst Controller + +=head1 DESCRIPTION + +Catalyst Controller. + +=head1 METHODS + +=head2 index + +Configure SIP rewrites + +=cut + +sub index : Private { + my ( $self, $c ) = @_; + $c->stash->{template} = 'tt/rewrite.tt'; + + my $rule_sets; + return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_rewrite_rule_sets', + undef, + \$rule_sets + ); + $c->stash->{rule_sets} = $rule_sets if eval { @$rule_sets }; + $c->stash->{editid} = $c->request->params->{editid}; + + if(exists $c->session->{garefill}) { + $c->stash->{garefill} = $c->session->{garefill}; + delete $c->session->{garefill}; + } + + return 1; +} + +=head2 do_delete_set + +Delete a rewrite set + +=cut + +sub delete_set : Local { + my ( $self, $c ) = @_; + $c->stash->{template} = 'tt/rewrite.tt'; + + my %messages; + my %settings; + + my $setid = $c->request->params->{setid}; + + if($c->model('Provisioning')->call_prov( $c, 'voip', 'delete_rewrite_rule_set', + { id => $setid + }, + undef + )) + { + $messages{epeermsg} = 'Server.Voip.RewriteRuleSetDeleted'; + $c->session->{messages} = \%messages; + $c->response->redirect("/rewrite"); + return; + } + $c->response->redirect("/rewrite"); + return; +} + + + +=head2 create_set + +Create a rewrite set + +=cut + +sub create_set : Local { + my ( $self, $c ) = @_; + $c->stash->{template} = 'tt/rewrite.tt'; + + my %messages = (); + my %settings = (); + + $settings{name} = $c->request->params->{setname}; + $messages{cpeererr} = 'Client.Syntax.MalformedRewriteRuleSetName' + unless $settings{name} =~ /^[a-zA-Z0-9_\-]+/; + $settings{description} = $c->request->params->{setdesc}; + + unless(keys %messages) { + if($c->model('Provisioning')->call_prov( $c, 'voip', 'create_rewrite_rule_set', + { %settings }, + undef + )) + { + $messages{cpeermsg} = 'Server.Voip.SavedSettings'; + $c->session->{messages} = \%messages; + $c->response->redirect("/rewrite"); + return; + } + } else { + $messages{cpeererr} = 'Client.Voip.InputErrorFound'; + } + + $c->session->{garefill} = \%settings; + $c->session->{messages} = \%messages; + $c->response->redirect("/rewrite#create_set"); + return; +} + +=head2 edit_set + +Edit a rewrite set + +=cut + +sub edit_set : Local { + my ( $self, $c ) = @_; + $c->stash->{template} = 'tt/rewrite.tt'; + + my %messages; + my %settings; + + my $setid = $c->request->params->{setid}; + $settings{description} = $c->request->params->{setdesc}; + +#$c->log->debug('*** edit set'); + + unless(keys %messages) { + if($c->model('Provisioning')->call_prov( $c, 'voip', 'update_rewrite_rule_set', + { id => $setid, + data => \%settings, + }, + undef + )) + { + $messages{epeermsg} = 'Server.Voip.SavedSettings'; + } + } + $c->session->{messages} = \%messages; + $c->response->redirect("/rewrite"); + return; +} + +=head2 detail + +Show rewrite rules for a given set + +=cut + +sub detail : Local { + my ( $self, $c ) = @_; + $c->stash->{template} = 'tt/rewrite_detail.tt'; + + my $setid = $c->request->params->{set_id}; + + my $set_details; + return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_rewrite_rule_set', + { id => $setid }, + \$set_details + ); + $c->stash->{set} = $set_details; + $c->stash->{editid} = $c->request->params->{editid}; + + return 1; +} + +=head2 create_rewrite + +Create a rewrite rule for a given peer with defined direction and field + +=cut + +sub create_rewrite : Local { + my ( $self, $c ) = @_; + $c->stash->{template} = 'tt/rewrite_detail.tt'; + + my %messages; + my %settings; + + my $setid = $c->request->params->{setid}; + my $match_pattern = $c->request->params->{match_pattern}; + my $replace_pattern = $c->request->params->{replace_pattern}; + my $description = $c->request->params->{description}; + my $direction = $c->request->params->{direction}; + my $field = $c->request->params->{field}; + my $priority = $c->request->params->{priority}; + + my $a = ""; + if($field eq 'caller') { $a = 'caller'.$a; } + elsif($field eq 'callee') { $a = 'callee'.$a; } + if($direction eq 'in') { $a = 'i'.$a; } + elsif($direction eq 'out') { $a = 'o'.$a; } + my $m = $a.'msg'; my $e = $a.'err'; my $d = $a.'detail'; + +# $messages{crulerr} = 'Client.Syntax.MalformedPeerGroupName' +# unless $callee_prefix =~ /^[a-zA-Z0-9_\.\-\@\:]+/; + + unless(keys %messages) { + if($c->model('Provisioning')->call_prov( $c, 'voip', 'create_rewrite_rule', + { set_id => $setid, + data => { + match_pattern => $match_pattern, + replace_pattern => $replace_pattern, + description => $description, + direction => $direction, + field => $field, + priority => $priority, + }, + }, + undef + )) + { + $messages{$m} = 'Server.Voip.SavedSettings'; + $c->session->{messages} = \%messages; + $c->response->redirect("/rewrite/detail?set_id=$setid#$a"); + return; + } + else + { + $messages{$e} = 'Client.Voip.InputErrorFound'; + if($c->session->{prov_error_object}) { + $c->flash->{$d} = $c->session->{prov_error_object}; + } + } + } else { + # TODO: add proper values here and set them in tt + my %arefill = (); +# $arefill{name} = $setname; +# $arefill{desc} = $setdesc; + + $c->stash->{arefill} = \%arefill; + } + + $c->session->{messages} = \%messages; + $c->response->redirect("/rewrite/detail?set_id=$setid#$a"); + return; +} + +=head2 update_rewrite_priority + +Updates the priority of rewrite rules upon re-order + +=cut + +sub update_rewrite_priority : Local { + my ( $self, $c ) = @_; + + my %messages; + my %settings; + + my $prio = 0; + + my $rules = $c->request->params->{'rule[]'}; + + foreach my $rule_id(@$rules) + { + my $rule = undef; + $c->model('Provisioning')->call_prov( $c, 'voip', 'get_rewrite_rule', + { id => $rule_id }, + \$rule + ); + $c->model('Provisioning')->call_prov( $c, 'voip', 'update_rewrite_rule', + { id => $rule_id, + data => { + match_pattern => $rule->{match_pattern}, + replace_pattern => $rule->{replace_pattern}, + description => $rule->{description}, + direction => $rule->{direction}, + field => $rule->{field}, + priority => $prio, + }, + }, + undef + ); + $prio++; + } + + $c->session->{messages} = \%messages; + $c->response->redirect("/"); + return; +} + + +=head2 delete_rewrite + +Delete a rewrite rule + +=cut + +sub delete_rewrite : Local { + my ( $self, $c ) = @_; + $c->stash->{template} = 'tt/rewrite_detail.tt'; + + my %messages; + my %settings; + + my $setid = $c->request->params->{setid}; + my $rewriteid = $c->request->params->{rewriteid}; + my $direction = $c->request->params->{direction}; + my $field = $c->request->params->{field}; + + my $a = ""; + if($field eq 'caller') { $a = 'caller'.$a; } + elsif($field eq 'callee') { $a = 'callee'.$a; } + if($direction eq 'in') { $a = 'i'.$a; } + elsif($direction eq 'out') { $a = 'o'.$a; } + my $m = $a.'msg'; my $e = $a.'err'; + + unless(keys %messages) { + if($c->model('Provisioning')->call_prov( $c, 'voip', 'delete_rewrite_rule', + { id => $rewriteid + }, + undef + )) + { + $messages{$m} = 'Server.Voip.SavedSettings'; + $c->session->{messages} = \%messages; + $c->response->redirect("/rewrite/detail?set_id=$setid#$a"); + return; + } + } else { + } + + $c->session->{messages} = \%messages; + $c->response->redirect("/rewrite/detail?set_id=$setid#$a"); + return; +} + +=head2 edit_rewrite + +Updates a rewrite rule + +=cut + +sub edit_rewrite : Local { + my ( $self, $c ) = @_; + $c->stash->{template} = 'tt/rewrite_detail.tt'; + + my %messages; + my %settings; + + my $setid = $c->request->params->{setid}; + my $rewriteid = $c->request->params->{rewriteid}; + my $match_pattern = $c->request->params->{match_pattern}; + my $replace_pattern = $c->request->params->{replace_pattern}; + my $description = $c->request->params->{description}; + my $direction = $c->request->params->{direction}; + my $field = $c->request->params->{field}; + my $priority = $c->request->params->{priority}; + + my $a = ""; + if($field eq 'caller') { $a = 'caller'.$a; } + elsif($field eq 'callee') { $a = 'callee'.$a; } + if($direction eq 'in') { $a = 'i'.$a; } + elsif($direction eq 'out') { $a = 'o'.$a; } + my $m = $a.'msg'; my $e = $a.'err'; my $d = $a.'detail'; + +# $messages{crulerr} = 'Client.Syntax.MalformedPeerGroupName' +# unless $callee_prefix =~ /^[a-zA-Z0-9_\.\-\@\:]+/; + + unless(keys %messages) { + if($c->model('Provisioning')->call_prov( $c, 'voip', 'update_rewrite_rule', + { id => $rewriteid, + data => { + match_pattern => $match_pattern, + replace_pattern => $replace_pattern, + description => $description, + direction => $direction, + field => $field, + priority => $priority, + }, + }, + undef + )) + { + $messages{$m} = 'Server.Voip.SavedSettings'; + $c->session->{messages} = \%messages; + $c->response->redirect("/rewrite/detail?set_id=$setid#$a"); + return; + } + else + { + $messages{$e} = 'Client.Voip.InputErrorFound'; + if($c->session->{prov_error_object}) { + $c->flash->{$d} = $c->session->{prov_error_object}; + } + } + } else { + # TODO: add proper values here and set them in tt + my %arefill = (); +# $arefill{name} = $setname; +# $arefill{desc} = $setdesc; + + $c->stash->{arefill} = \%arefill; + } + + $c->session->{messages} = \%messages; + $c->response->redirect("/rewrite/detail?set_id=$setid#$a"); + return; +} + +=head1 BUGS AND LIMITATIONS + +=over + +=item currently none + +=back + +=head1 SEE ALSO + +Provisioning model, Sipwise::Provisioning::Billing, Catalyst + +=head1 AUTHORS + +=over + +=item Andreas Granig + +=back + +=head1 COPYRIGHT + +The rewrite controller is Copyright (c) 2009-2011 Sipwise GmbH, Austria. +You should have received a copy of the licences terms together with the +software. + +=cut + +# ende gelaende +1; diff --git a/root/layout/menu b/root/layout/menu index 3bc32a3..3d1c829 100644 --- a/root/layout/menu +++ b/root/layout/menu @@ -35,6 +35,7 @@ [% IF Catalyst.config.peering_features %]
  • SIP Peerings
  • [% END %] +
  • Rewrite Rule Sets
  • diff --git a/root/tt/rewrite.tt b/root/tt/rewrite.tt new file mode 100644 index 0000000..801fd65 --- /dev/null +++ b/root/tt/rewrite.tt @@ -0,0 +1,73 @@ +

    Rewrite Rule Sets

    + + [% IF messages.epeermsg %]
    [% messages.epeermsg %]
    [% END %] + [% IF messages.epeererr %]
    [% messages.epeererr %]
    [% END %] + [% IF messages.cpeermsg %]
    [% messages.cpeermsg %]
    [% END %] + [% IF messages.cpeererr %]
    [% messages.cpeererr %]
    [% END %] + + + + [% END %] + + diff --git a/root/tt/rewrite_detail.tt b/root/tt/rewrite_detail.tt new file mode 100644 index 0000000..be284e6 --- /dev/null +++ b/root/tt/rewrite_detail.tt @@ -0,0 +1,184 @@ + + + +

    Rewrite Rule Set [% set.rewrite_set.name %]

    + + Back

    + + [% + rewrites = [ + { + header = 'Inbound Rewrite Rules for Caller', + id = 'icaller', + tag = 'if', + dir = 'in', + field = 'caller', + msg = messages.icallermsg, + err = messages.icallererr, + detail = icallerdetail, + rules = set.rewrite_in_caller, + }, + { + header = 'Inbound Rewrite Rules for Callee', + id = 'icallee', + tag = 'it', + dir = 'in', + field = 'callee', + msg = messages.icalleemsg, + err = messages.icalleeerr, + detail = icalleedetail, + rules = set.rewrite_in_callee, + }, + { + header = 'Outbound Rewrite Rules for Caller', + id = 'ocaller', + tag = 'of', + dir = 'out', + field = 'caller', + msg = messages.ocallermsg, + err = messages.ocallererr, + detail = ocallerdetail, + rules = set.rewrite_out_caller, + }, + { + header = 'Outbound Rewrite Rules for Callee', + id = 'ocallee', + tag = 'ot', + dir = 'out', + field = 'callee', + msg = messages.ocalleemsg, + err = messages.ocalleeerr, + detail = ocalleedetail, + rules = set.rewrite_out_callee, + }, + ] + %] + + [% FOREACH rw = rewrites %] + +

    [% rw.header %]

    + [% IF rw.msg %]
    [% rw.msg %]
    [% END %] + [% IF rw.err %]
    [% rw.err %][% IF rw.detail %]
    [% rw.detail %][% END %]
    [% END %] + + + + + + [% UNLESS Catalyst.session.admin.read_only %] + +
    + [% END %] + + [% END %] +