From 16941ee3099833522bb8b7ac3cdf88b4a5f0ad89 Mon Sep 17 00:00:00 2001 From: ivan Date: Sun, 21 Feb 2010 22:54:10 +0000 Subject: [PATCH] communigate forwarders, RT#7083 --- FS/FS/Conf.pm | 7 +++++ FS/FS/part_export/communigate_pro.pm | 55 ++++++++++++++++++++++++++++++++---- httemplate/edit/svc_forward.cgi | 45 ++++++++++++++++++----------- httemplate/view/svc_forward.cgi | 32 +++++++++++++++------ 4 files changed, 107 insertions(+), 32 deletions(-) diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 0b4000e4c..54b173ab3 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -2418,6 +2418,13 @@ worry that config_items is freeside-specific and icky. }, { + 'key' => 'svc_forward-no_srcsvc', + 'section' => '', + 'description' => "Don't allow forwards from existing accounts, only arbitrary addresses. Useful when exporting to systems such as Communigate Pro which treat forwards in this fashion.", + 'type' => 'checkbox', + }, + + { 'key' => 'svc_forward-arbitrary_dst', 'section' => '', 'description' => "Allow forwards to point to arbitrary strings that don't necessarily look like email addresses. Only used when using forwards for weird, non-email things.", diff --git a/FS/FS/part_export/communigate_pro.pm b/FS/FS/part_export/communigate_pro.pm index e07010b0b..855651370 100644 --- a/FS/FS/part_export/communigate_pro.pm +++ b/FS/FS/part_export/communigate_pro.pm @@ -94,7 +94,6 @@ sub _export_insert_svc_acct { #let's do the create realtime too, for much the same reasons, and to avoid #pain of trying to queue w/dep the prefs & aliases - #my $r= eval { $self->communigate_pro_runcommand( @options ) }; return $@ if $@; @@ -142,8 +141,18 @@ sub _export_insert_svc_domain { $self->communigate_pro_queue( @options ); } -#sub _export_insert_svc_forward { -#} +sub _export_insert_svc_forward { + my( $self, $svc_forward ) = (shift, shift); + + my $src = $svc_forward->src || $svc_forward->srcsvc_acct->email; + my $dst = $svc_forward->dst || $svc_forward->dstsvc_acct->email; + + #real-time here, presuming CGP does some dup detection? + eval { $self->communigate_pro_runcommand( 'CreateForwarder', $src, $dst); }; + return $@ if $@; + + ''; +} sub _export_replace { my( $self, $new, $old ) = (shift, shift, shift); @@ -160,7 +169,6 @@ sub _export_replace_svc_acct { #w/dependencies. we don't want FS winding up out-of-sync with the wrong #username and a queued job anyway. right?? if ( $self->export_username($old) ne $self->export_username($new) ) { - #my $r = eval { $self->communigate_pro_runcommand( 'RenameAccount', $self->export_username($old), @@ -258,6 +266,35 @@ sub _export_replace_svc_domain { ''; } +sub _export_replace_svc_forward { + my( $self, $new, $old ) = (shift, shift, shift); + + my $osrc = $old->src || $old->srcsvc_acct->email; + my $nsrc = $new->src || $new->srcsvc_acct->email; + my $odst = $old->dst || $old->dstsvc_acct->email; + my $ndst = $new->dst || $new->dstsvc_acct->email; + + if ( $odst ne $ndst ) { + + #no change command, so delete and create (real-time) + eval { $self->communigate_pro_runcommand('DeleteForwarder', $osrc) }; + return $@ if $@; + eval { $self->communigate_pro_runcommand('CreateForwarder', $nsrc, $ndst)}; + return $@ if $@; + + } elsif ( $osrc ne $nsrc ) { + + #real-time here, presuming CGP does some dup detection? + eval { $self->communigate_pro_runcommand( 'RenameForwarder', $osrc, $nsrc)}; + return $@ if $@; + + } else { + warn "communigate replace called for svc_forward with no changes\n";#confess + } + + ''; +} + sub _export_delete { my( $self, $svc_x ) = (shift, shift); @@ -272,7 +309,6 @@ sub _export_delete_svc_acct { $self->communigate_pro_queue( $svc_acct->svcnum, 'DeleteAccount', $self->export_username($svc_acct), ); - } sub _export_delete_svc_domain { @@ -282,7 +318,14 @@ sub _export_delete_svc_domain { $svc_domain->domain, #XXX turn on force option for domain deletion? ); +} + +sub _export_delete_svc_forward { + my( $self, $svc_forward ) = (shift, shift); + $self->communigate_pro_queue( $svc_forward->svcnum, 'DeleteForwarder', + ($svc_forward->src || $svc_forward->srcsvc_acct->email), + ); } sub _export_suspend { @@ -597,7 +640,7 @@ sub communigate_pro_command { #subroutine, not method #warn "$method ". Dumper(@args) if $DEBUG; my $return = $cli->$method(@args) - or die "Communigate Pro error: ". $cli->getErrMessage; + or die "Communigate Pro error: ". $cli->getErrMessage. "\n"; $cli->Logout; # or die "Can't logout of CGPro: $CGP::ERR_STRING\n"; diff --git a/httemplate/edit/svc_forward.cgi b/httemplate/edit/svc_forward.cgi index 96a00a5aa..73f6465b9 100755 --- a/httemplate/edit/svc_forward.cgi +++ b/httemplate/edit/svc_forward.cgi @@ -32,24 +32,35 @@ function dstchanged(what) { <% ntable("#cccccc",2) %> -Email to - -% if ( $svc_forward->dbdef_table->column('src') ) { - -> -% } - - + + Email to + +% if ( $conf->exists('svc_forward-no_srcsvc') ) { + +% } else { + +% } + +% my $src_disabled = $src +% || $conf->exists('svc_forward-no_srcsvc') +% || !scalar(%email); + + > + + + Forwards to