X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_export%2Fcommunigate_pro.pm;h=9ea8401742c390c082b8540ec642df7487c4d283;hp=855651370b7389dd57e56afd4594d45a8b29a428;hb=20f38e4c256094bd938b732950e8f93319f851a5;hpb=16941ee3099833522bb8b7ac3cdf88b4a5f0ad89 diff --git a/FS/FS/part_export/communigate_pro.pm b/FS/FS/part_export/communigate_pro.pm index 855651370..9ea840174 100644 --- a/FS/FS/part_export/communigate_pro.pm +++ b/FS/FS/part_export/communigate_pro.pm @@ -33,11 +33,11 @@ tie %options, 'Tie::IxHash', ; %info = ( - 'svc' => [qw( svc_acct svc_domain svc_forward )], - 'desc' => 'Real-time export of accounts and domains to a CommuniGate Pro mail server', + 'svc' => [qw( svc_acct svc_domain svc_forward svc_mailinglist )], + 'desc' => 'Real-time export of accounts, domains, mail forwards and mailing lists to a CommuniGate Pro mail server', 'options' => \%options, 'notes' => <<'END' -Real time export of accounts and domains to a +Real time export of accounts, domains, mail forwards and mailing lists to a CommuniGate Pro mail server. The CommuniGate Pro Perl Interface @@ -71,8 +71,10 @@ 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->$_() } @@ -117,7 +119,7 @@ sub _export_insert_svc_acct { my $alias_err = $self->communigate_pro_queue( $svc_acct->svcnum, 'SetAccountAliases', $self->export_username($svc_acct), - [ split(/\s*,\s*/, $svc_acct->cgp_aliases) ], + [ split(/\s*[,\s]\s*/, $svc_acct->cgp_aliases) ], ); warn "WARNING: error queueing SetAccountAliases job: $alias_err" if $alias_err; @@ -132,13 +134,63 @@ 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; + $settings{'AdminDomainName'} = $svc_domain->parent_svc_x->domain + if $svc_domain->parent_svcnum; + $settings{'TrailerText'} = $svc_domain->trailer + if $svc_domain->trailer; + + 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 + my $def_err = $self->communigate_pro_queue( $svc_domain->svcnum, + 'SetAccountDefaults', + $svc_domain->domain, + 'PWDAllowed' =>($svc_domain->acct_def_password_selfchange ? 'YES':'NO'), + 'PasswordRecovery' => ($svc_domain->acct_def_password_recover ? 'YES':'NO'), + 'AccessModes' => $svc_domain->acct_def_cgp_accessmodes, + 'MaxAccountSize' => $svc_domain->acct_def_quota, + 'MaxWebSize' => $svc_domain->acct_def_file_quota, + 'MaxWebFile' => $svc_domain->acct_def_file_maxnum, + 'MaxFileSize' => $svc_domain->acct_def_file_maxsize, + 'RulesAllowed' => $svc_domain->acct_def_cgp_rulesallowed, + 'RPOPAllowed' =>($svc_domain->acct_def_cgp_rpopallowed ?'YES':'NO'), + 'MailToAll' =>($svc_domain->acct_def_cgp_mailtoall ?'YES':'NO'), + 'AddMailTrailer' =>($svc_domain->acct_def_cgp_addmailtrailer ?'YES':'NO'), + ); + warn "WARNING: error queueing SetAccountDefaults job: $def_err" + if $def_err; + + #account defaults prefs + my $pref_err = $self->communigate_pro_queue( $svc_domain->svcnum, + 'SetAccountDefaultPrefs', + $svc_domain->domain, + 'DeleteMode' => $svc_domain->acct_def_cgp_deletemode, + 'EmptyTrash' => $svc_domain->acct_def_cgp_emptytrash, + ); + warn "WARNING: error queueing SetAccountDefaultPrefs job: $pref_err" + if $pref_err; + + ''; - $self->communigate_pro_queue( @options ); } sub _export_insert_svc_forward { @@ -154,6 +206,31 @@ sub _export_insert_svc_forward { ''; } +sub _export_insert_svc_mailinglist { + my( $self, $svc_mlist ) = (shift, shift); + + my @members = map $_->email_address, + $svc_mlist->mailinglist->mailinglistmember; + + #real-time here, presuming CGP does some dup detection + eval { $self->communigate_pro_runcommand( + 'CreateGroup', + $svc_mlist->username.'@'.$svc_mlist->domain, + { 'RealName' => $svc_mlist->listname, + 'SetReplyTo' => ( $svc_mlist->reply_to ? 'YES' : 'NO' ), + 'RemoveAuthor' => ( $svc_mlist->remove_from ? 'YES' : 'NO' ), + 'RejectAuto' => ( $svc_mlist->reject_auto ? 'YES' : 'NO' ), + 'RemoveToAndCc' => ( $svc_mlist->remove_to_and_cc ? 'YES' : 'NO' ), + 'Members' => \@members, + } + ); + }; + return $@ if $@; + + ''; + +} + sub _export_replace { my( $self, $new, $old ) = (shift, shift, shift); @@ -233,7 +310,7 @@ sub _export_replace_svc_acct { $new->svcnum, 'SetAccountAliases', $self->export_username($new), - [ split(/\s*,\s*/, $new->cgp_aliases) ], + [ split(/\s*[,\s]\s*/, $new->cgp_aliases) ], ); return $error if $error; } @@ -251,17 +328,67 @@ 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{'TrailerText'} = $new->trailer + if $old->trailer ne $new->trailer; + $settings{'DomainAccessModes'} = $new->cgp_accessmodes + if $old->cgp_accessmodes ne $new->cgp_accessmodes; + $settings{'AdminDomainName'} = + $new->parent_svcnum ? $new->parent_svc_x->domain : '' + if $old->parent_svcnum != $new->parent_svcnum; - 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; } - #other kinds of changes? + 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; + } + + #below this identical to insert... any value to doing an Update here? + #not seeing any big one... i guess it would be nice to avoid the update + #when things haven't changed + + #account defaults + my $def_err = $self->communigate_pro_queue( $new->svcnum, + 'SetAccountDefaults', + $new->domain, + 'PWDAllowed' => ( $new->acct_def_password_selfchange ? 'YES' : 'NO' ), + 'PasswordRecovery' => ( $new->acct_def_password_recover ? 'YES' : 'NO' ), + 'AccessModes' => $new->acct_def_cgp_accessmodes, + 'MaxAccountSize' => $new->acct_def_quota, + 'MaxWebSize' => $new->acct_def_file_quota, + 'MaxWebFile' => $new->acct_def_file_maxnum, + 'MaxFileSize' => $new->acct_def_file_maxsize, + 'RulesAllowed' => $new->acct_def_cgp_rulesallowed, + 'RPOPAllowed' => ( $new->acct_def_cgp_rpopallowed ? 'YES' : 'NO' ), + 'MailToAll' => ( $new->acct_def_cgp_mailtoall ? 'YES' : 'NO' ), + 'AddMailTrailer' => ( $new->acct_def_cgp_addmailtrailer ? 'YES' : 'NO' ), + ); + warn "WARNING: error queueing SetAccountDefaults job: $def_err" + if $def_err; + + #account defaults prefs + my $pref_err = $self->communigate_pro_queue( $new->svcnum, + 'SetAccountDefaultPrefs', + $new->domain, + 'DeleteMode' => $new->acct_def_cgp_deletemode, + 'EmptyTrash' => $new->acct_def_cgp_emptytrash, + ); + warn "WARNING: error queueing SetAccountDefaultPrefs job: $pref_err" + if $pref_err; ''; } @@ -295,6 +422,39 @@ sub _export_replace_svc_forward { ''; } +sub _export_replace_svc_mailinglist { + my( $self, $new, $old ) = (shift, shift, shift); + + my $oldGroupName = $old->username.'@'.$old->domain; + my $newGroupName = $new->username.'@'.$new->domain; + + if ( $oldGroupName ne $newGroupName ) { + eval { $self->communigate_pro_runcommand( + 'RenameGroup', $oldGroupName, $newGroupName ); }; + return $@ if $@; + } + + my @members = map $_->email_address, + $new->mailinglist->mailinglistmember; + + #real-time here, presuming CGP does some dup detection + eval { $self->communigate_pro_runcommand( + 'SetGroup', $newGroupName, + { 'RealName' => $new->listname, + 'SetReplyTo' => ( $new->reply_to ? 'YES' : 'NO' ), + 'RemoveAuthor' => ( $new->remove_from ? 'YES' : 'NO' ), + 'RejectAuto' => ( $new->reject_auto ? 'YES' : 'NO' ), + 'RemoveToAndCc' => ( $new->remove_to_and_cc ? 'YES' : 'NO' ), + 'Members' => \@members, + } + ); + }; + return $@ if $@; + + ''; + +} + sub _export_delete { my( $self, $svc_x ) = (shift, shift); @@ -328,6 +488,21 @@ sub _export_delete_svc_forward { ); } +sub _export_delete_svc_mailinglist { + my( $self, $svc_mailinglist ) = (shift, shift); + + #real-time here, presuming CGP does some dup detection + eval { $self->communigate_pro_runcommand( + 'DeleteGroup', + $svc_mailinglist->username.'@'.$svc_mailinglist->domain, + ); + }; + return $@ if $@; + + ''; + +} + sub _export_suspend { my( $self, $svc_x ) = (shift, shift); @@ -389,6 +564,20 @@ sub _export_unsuspend_svc_domain { } +sub export_mailinglistmember_insert { + my( $self, $svc_mailinglist, $mailinglistmember ) = (shift, shift, shift); + $svc_mailinglist->replace(); +} + +sub export_mailinglistmember_replace { + my( $self, $svc_mailinglist, $new, $old ) = (shift, shift, shift, shift); + die "no way to do this from the UI right now"; +} + +sub export_mailinglistmember_delete { + my( $self, $svc_mailinglist, $mailinglistmember ) = (shift, shift, shift); + $svc_mailinglist->replace(); +} sub export_getsettings { my($self, $svc_x) = (shift, shift); @@ -421,12 +610,41 @@ sub export_getsettings_svc_domain { ) }; return $@ if $@; - #warn Dumper($acct_defaults); + my $acct_defaultprefs = eval { $self->communigate_pro_runcommand( + 'GetAccountDefaultPrefs', + $svc_domain->domain + ) }; + return $@ if $@; + + %$effective_settings = ( + %$effective_settings, + ( map { ("Acct. Default $_" => $acct_defaults->{$_}); } + keys(%$acct_defaults) + ), + ( map { ("Acct. Default $_" => $acct_defaultprefs->{$_}); } #diff label?? + keys(%$acct_defaultprefs) + ), + ); + %$settings = ( + %$settings, + ( map { ("Acct. Default $_" => $acct_defaults->{$_}); } + keys(%$acct_defaults) + ), + ( map { ("Acct. Default $_" => $acct_defaultprefs->{$_}); } #diff label?? + keys(%$acct_defaultprefs) + ), + ); + + #aliases too + my $aliases = eval { $self->communigate_pro_runcommand( + 'GetDomainAliases', + $svc_domain->domain + ) }; + return $@ if $@; + + $effective_settings->{'Aliases'} = join(', ', @$aliases); + $settings->{'Aliases'} = join(', ', @$aliases); - %$effective_settings = ( %$effective_settings, - map { ("Acct. Default $_" => $acct_defaults->{$_}); } - keys(%$acct_defaults) - ); #false laziness w/below @@ -528,6 +746,22 @@ sub export_getsettings_svc_acct { } +sub export_getsettings_svc_mailinglist { + my($self, $svc_mailinglist, $settingsref, $defaultref ) = @_; + + my $settings = eval { $self->communigate_pro_runcommand( + 'GetGroup', + $svc_mailinglist->username.'@'.$svc_mailinglist->domain, + ) }; + return $@ if $@; + + $settings->{'Members'} = join(', ', @{ $settings->{'Members'} } ); + + %{$settingsref} = %$settings; + + ''; +} + sub communigate_pro_queue { my( $self, $svcnum, $method ) = (shift, shift, shift); my $jobnum = ''; #don't actually care @@ -538,12 +772,17 @@ sub communigate_pro_queue_dep { my( $self, $jobnumref, $svcnum, $method ) = splice(@_,0,4); my %kludge_methods = ( - 'CreateAccount' => 'CreateAccount', - 'UpdateAccountSettings' => 'UpdateAccountSettings', - 'UpdateAccountPrefs' => 'cp_Scalar_Hash', - 'CreateDomain' => 'cp_Scalar_Hash', - 'CreateSharedDomain' => 'cp_Scalar_Hash', - 'UpdateDomainSettings' => 'UpdateDomainSettings', + #'CreateAccount' => 'CreateAccount', + 'UpdateAccountSettings' => 'UpdateAccountSettings', + 'UpdateAccountPrefs' => 'cp_Scalar_Hash', + #'CreateDomain' => 'cp_Scalar_Hash', + #'CreateSharedDomain' => 'cp_Scalar_Hash', + 'UpdateDomainSettings' => 'cp_Scalar_settingsHash', + 'SetDomainAliases' => 'cp_Scalar_Array', + 'SetAccountDefaults' => 'cp_Scalar_settingsHash', + 'UpdateAccountDefaults' => 'cp_Scalar_settingsHash', + 'SetAccountDefaultPrefs' => 'cp_Scalar_settingsHash', + 'UpdateAccountDefaultPrefs' => 'cp_Scalar_settingsHash', ); my $sub = exists($kludge_methods{$method}) ? $kludge_methods{$method} @@ -589,34 +828,43 @@ 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 ); # communigate_pro_command( $machine, $port, $login, $password, $method, @args ); #} -sub UpdateDomainSettings { +sub cp_Scalar_settingsHash { my( $machine, $port, $login, $password, $method, $domain, %settings ) = @_; + for (qw( AccessModes DomainAccessModes )) { + $settings{$_} = [split(' ',$settings{$_})] if $settings{$_}; + } 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 ) = @_; @@ -629,6 +877,7 @@ sub communigate_pro_command { #subroutine, not method my( $machine, $port, $login, $password, $method, @args ) = @_; eval "use CGP::CLI"; + die $@ if $@; my $cli = new CGP::CLI( { 'PeerAddr' => $machine,