X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_export%2Fcommunigate_pro.pm;h=fcd6b1ce328e86fb649af103a3909a9774eaf9f8;hp=c31aea3855a029186be7fdec327dedf3890cf061;hb=be61853021954c3cf8f6e63a41b1fa693e3af6d8;hpb=f696f5c9b8ec55b83285a6d159711889cc796619 diff --git a/FS/FS/part_export/communigate_pro.pm b/FS/FS/part_export/communigate_pro.pm index c31aea385..fcd6b1ce3 100644 --- a/FS/FS/part_export/communigate_pro.pm +++ b/FS/FS/part_export/communigate_pro.pm @@ -71,17 +71,15 @@ sub _export_insert_svc_acct { my( $self, $svc_acct ) = (shift, shift); my %settings = ( - 'AccessModes' => ( $svc_acct->cgp_accessmodes - || $self->option('AccessModes') ), + 'AccessModes' => [ split(' ', ( $svc_acct->cgp_accessmodes + || $self->option('AccessModes') ) + ) + ], 'RealName' => $svc_acct->finger, 'Password' => $svc_acct->_password, map { $quotas{$_} => $svc_acct->$_() } grep $svc_acct->$_(), keys %quotas ); - - #XXX preferences phase 1: message delete method, on logout remove trash - #phase 2: language, time zone, layout, pronto style, send read receipts - #phase 2: pwdallowed, passwordrecovery, allowed mail rules, # RPOP modifications, accepts mail to all, add trailer to sent mail #phase 3: archive messages, mailing lists @@ -97,16 +95,35 @@ sub _export_insert_svc_acct { if $self->option('externalFlag'); #let's do the create realtime too, for much the same reasons, and to avoid - #pain of trying to queue w/dep the aliases - #my $r= + #pain of trying to queue w/dep the prefs & aliases eval { $self->communigate_pro_runcommand( @options ) }; return $@ if $@; - my $err= $self->communigate_pro_queue( $svc_acct->svcnum, 'SetAccountAliases', - $self->export_username($svc_acct), - [ split(/\s*,\s*/, $svc_acct->cgp_aliases) ], - ); - warn "WARNING: error queueing SetAccountAliases job: $err" if $err; + #preferences + my %prefs = (); + $prefs{'DeleteMode'} = $svc_acct->cgp_deletemode if $svc_acct->cgp_deletemode; + $prefs{'EmptyTrash'} = $svc_acct->cgp_emptytrash if $svc_acct->cgp_emptytrash; + #phase 2: language, time zone, layout, pronto style, send read receipts + if ( keys %prefs ) { + my $pref_err = $self->communigate_pro_queue( $svc_acct->svcnum, + 'UpdateAccountPrefs', + $self->export_username($svc_acct), + %prefs, + ); + warn "WARNING: error queueing UpdateAccountPrefs job: $pref_err" + if $pref_err; + } + + #aliases + if ( $svc_acct->cgp_aliases ) { + my $alias_err = $self->communigate_pro_queue( $svc_acct->svcnum, + 'SetAccountAliases', + $self->export_username($svc_acct), + [ split(/\s*[,\s]\s*/, $svc_acct->cgp_aliases) ], + ); + warn "WARNING: error queueing SetAccountAliases job: $alias_err" + if $alias_err; + } ''; @@ -117,17 +134,48 @@ sub _export_insert_svc_domain { my $create = $self->option('create_domain') || 'CreateDomain'; - my @options = ( $svc_domain->svcnum, $create, $svc_domain->domain, - #other domain creation options? + my %settings = ( + 'DomainAccessModes' => [ split(' ', $svc_domain->cgp_accessmodes ) ], ); - push @options, 'AccountsLimit' => $svc_domain->max_accounts + $settings{'AccountsLimit'} = $svc_domain->max_accounts if $svc_domain->max_accounts; - $self->communigate_pro_queue( @options ); + my @options = ( $create, $svc_domain->domain, \%settings ); + + eval { $self->communigate_pro_runcommand( @options ) }; + return $@ if $@; + + #aliases + if ( $svc_domain->cgp_aliases ) { + my $alias_err = $self->communigate_pro_queue( $svc_domain->svcnum, + 'SetDomainAliases', + $svc_domain->domain, + split(/\s*[,\s]\s*/, $svc_domain->cgp_aliases), + ); + warn "WARNING: error queueing SetDomainAliases job: $alias_err" + if $alias_err; + } + + #account defaults + + #account defaults prefs + + ''; + } -#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); @@ -144,7 +192,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), @@ -187,19 +234,33 @@ sub _export_replace_svc_acct { return $error if $error; } + #preferences + my %prefs = (); + $prefs{'DeleteMode'} = $new->cgp_deletemode + if $old->cgp_deletemode ne $new->cgp_deletemode; + $prefs{'EmptyTrash'} = $new->cgp_emptytrash + if $old->cgp_emptytrash ne $new->cgp_emptytrash; + #phase 2: language, time zone, layout, pronto style, send read receipts + if ( keys %prefs ) { + my $pref_err = $self->communigate_pro_queue( $new->svcnum, + 'UpdateAccountPrefs', + $self->export_username($new), + %prefs, + ); + warn "WARNING: error queueing UpdateAccountPrefs job: $pref_err" + if $pref_err; + } + if ( $old->cgp_aliases ne $new->cgp_aliases ) { my $error = $self->communigate_pro_queue( $new->svcnum, 'SetAccountAliases', $self->export_username($new), - [ split(/\s*,\s*/, $new->cgp_aliases) ], + [ split(/\s*[,\s]\s*/, $new->cgp_aliases) ], ); return $error if $error; } - #XXX preferences phase 1: message delete method, on logout remove trash - #phase 2: language, time zone, layout, pronto style, send read receipts - ''; } @@ -213,12 +274,26 @@ sub _export_replace_svc_domain { ); return $error if $error; } + my %settings = (); + $settings{'AccountsLimit'} = $new->max_accounts + if $old->max_accounts ne $new->max_accounts; + $settings{'DomainAccessModes'} = $new->cgp_accessmodes + if $old->cgp_accessmodes ne $new->cgp_accessmodes; - if ( $old->max_accounts ne $new->max_accounts ) { + if ( keys %settings ) { my $error = $self->communigate_pro_queue( $new->svcnum, 'UpdateDomainSettings', $new->domain, - 'AccountsLimit' => ($new->max_accounts || 'default'), + %settings, + ); + return $error if $error; + } + + if ( $old->cgp_aliases ne $new->cgp_aliases ) { + my $error = $self->communigate_pro_queue( $new->svcnum, + 'SetDomainAliases', + $new->domain, + split(/\s*[,\s]\s*/, $new->cgp_aliases), ); return $error if $error; } @@ -228,6 +303,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); @@ -242,7 +346,6 @@ sub _export_delete_svc_acct { $self->communigate_pro_queue( $svc_acct->svcnum, 'DeleteAccount', $self->export_username($svc_acct), ); - } sub _export_delete_svc_domain { @@ -252,7 +355,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 { @@ -355,6 +465,17 @@ sub export_getsettings_svc_domain { keys(%$acct_defaults) ); + #aliases too + my $aliases = eval { $self->communigate_pro_runcommand( + 'GetDomainAliases', + $svc_domain->domain + ) }; + return $@ if $@; + + $effective_settings->{'Aliases'} = join(', ', @$aliases); + $settings->{'Aliases'} = join(', ', @$aliases); + + #false laziness w/below my %defaults = map { $_ => 1 } @@ -465,11 +586,13 @@ sub communigate_pro_queue_dep { my( $self, $jobnumref, $svcnum, $method ) = splice(@_,0,4); my %kludge_methods = ( - 'CreateAccount' => 'CreateAccount', + #'CreateAccount' => 'CreateAccount', 'UpdateAccountSettings' => 'UpdateAccountSettings', - 'CreateDomain' => 'cp_Scalar_Hash', - 'CreateSharedDomain' => 'cp_Scalar_Hash', + 'UpdateAccountPrefs' => 'cp_Scalar_Hash', + #'CreateDomain' => 'cp_Scalar_Hash', + #'CreateSharedDomain' => 'cp_Scalar_Hash', 'UpdateDomainSettings' => 'UpdateDomainSettings', + 'SetDomainAliases' => 'cp_Scalar_Array', ); my $sub = exists($kludge_methods{$method}) ? $kludge_methods{$method} @@ -515,6 +638,12 @@ sub cp_Scalar_Hash { communigate_pro_command( $machine, $port, $login, $password, $method, @args ); } +sub cp_Scalar_Array { + my( $machine, $port, $login, $password, $method, $scalar, @array ) = @_; + my @args = ( $scalar, \@array ); + communigate_pro_command( $machine, $port, $login, $password, $method, @args ); +} + #sub cp_Hash { # my( $machine, $port, $login, $password, $method, %hash ) = @_; # my @args = ( \%hash ); @@ -523,26 +652,27 @@ sub cp_Scalar_Hash { sub UpdateDomainSettings { my( $machine, $port, $login, $password, $method, $domain, %settings ) = @_; + $settings{'DomainAccessModes'} = [split(' ',$settings{'DomainAccessModes'})]; my @args = ( 'domain' => $domain, 'settings' => \%settings ); communigate_pro_command( $machine, $port, $login, $password, $method, @args ); } -sub CreateAccount { - my( $machine, $port, $login, $password, $method, %args ) = @_; - my $accountName = delete $args{'accountName'}; - my $accountType = delete $args{'accountType'}; - my $externalFlag = delete $args{'externalFlag'}; - $args{'AccessModes'} = [ split(' ', $args{'AccessModes'}) ]; - my @args = ( accountName => $accountName, - accountType => $accountType, - settings => \%args, - ); - #externalFlag => $externalFlag, - push @args, externalFlag => $externalFlag if $externalFlag; - - communigate_pro_command( $machine, $port, $login, $password, $method, @args ); - -} +#sub CreateAccount { +# my( $machine, $port, $login, $password, $method, %args ) = @_; +# my $accountName = delete $args{'accountName'}; +# my $accountType = delete $args{'accountType'}; +# my $externalFlag = delete $args{'externalFlag'}; +# $args{'AccessModes'} = [ split(' ', $args{'AccessModes'}) ]; +# my @args = ( accountName => $accountName, +# accountType => $accountType, +# settings => \%args, +# ); +# #externalFlag => $externalFlag, +# push @args, externalFlag => $externalFlag if $externalFlag; +# +# communigate_pro_command( $machine, $port, $login, $password, $method, @args ); +# +#} sub UpdateAccountSettings { my( $machine, $port, $login, $password, $method, $accountName, %args ) = @_; @@ -566,7 +696,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";