no maintainer, use shellcommands_withdomain instead
[freeside.git] / FS / FS / part_export / vpopmail.pm
index cc8136e..0fc8266 100644 (file)
@@ -1,16 +1,41 @@
 package FS::part_export::vpopmail;
 
-use vars qw(@ISA @saltset $exportdir $rsync $ssh);
+use vars qw(@ISA %info @saltset $exportdir);
+use Fcntl qw(:flock);
+use Tie::IxHash;
 use File::Path;
 use FS::UID qw( datasrc );
 use FS::part_export;
 
 @ISA = qw(FS::part_export);
 
-@saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );
+tie my %options, 'Tie::IxHash',
+  #'machine' => { label=>'vpopmail machine', },
+  'dir'     => { label=>'directory', }, # ?more info? default?
+  'uid'     => { label=>'vpopmail uid' },
+  'gid'     => { label=>'vpopmail gid' },
+  'restart' => { label=> 'vpopmail restart command',
+                 default=> 'cd /home/vpopmail/domains; for domain in *; do /home/vpopmail/bin/vmkpasswd $domain; done; /var/qmail/bin/qmail-newu; killall -HUP qmail-send',
+               },
+;
+
+%info = (
+  'svc'     => 'svc_acct',
+  'desc'    => 'Real-time export to vpopmail text files',
+  'options' => \%options,
+  'notes'   => <<'END'
+This export is currently unmaintained.  See shellcommands_withdomain for an
+export that uses vpopmail CLI commands instead.<BR>
+<BR>
+Real time export to <a href="http://inter7.com/vpopmail/">vpopmail</a> text
+files.  <a href="http://search.cpan.org/dist/File-Rsync">File::Rsync</a>
+must be installed, and you will need to
+<a href="../docs/ssh.html">setup SSH for unattended operation</a>
+to <b>vpopmail</b>@<i>export.host</i>. 
+END
+);
 
-$rsync = "rsync";
-$ssh = "ssh";
+@saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );
 
 sub rebless { shift; }
 
@@ -21,6 +46,7 @@ sub _export_insert {
     crypt($svc_acct->_password,$saltset[int(rand(64))].$saltset[int(rand(64))]),
     $svc_acct->domain,
     $svc_acct->quota,
+    $svc_acct->finger,
   );
 }
 
@@ -48,7 +74,7 @@ sub _export_replace {
   return '' unless $old->_password ne $new->_password;
 
   $self->vpopmail_queue( $new->svcnum, 'replace',
-    $new->username, $cpassword, $new->domain, $new->quota );
+    $new->username, $cpassword, $new->domain, $new->quota, $new->finger );
 }
 
 sub _export_delete {
@@ -60,7 +86,15 @@ sub _export_delete {
 #a good idea to queue anything that could fail or take any time
 sub vpopmail_queue {
   my( $self, $svcnum, $method ) = (shift, shift, shift);
+
   my $exportdir = "/usr/local/etc/freeside/export." . datasrc;
+  mkdir $exportdir, 0700 or die $! unless -d $exportdir;
+  $exportdir .= "/vpopmail";
+  mkdir $exportdir, 0700 or die $! unless -d $exportdir;
+  $exportdir .= '/'. $self->machine;
+  mkdir $exportdir, 0700 or die $! unless -d $exportdir;
+  mkdir "$exportdir/domains", 0700 or die $! unless -d "$exportdir/domains";
+
   my $queue = new FS::queue {
     'svcnum' => $svcnum,
     'job'    => "FS::part_export::vpopmail::vpopmail_$method",
@@ -71,14 +105,18 @@ sub vpopmail_queue {
     $self->option('dir'),
     $self->option('uid'),
     $self->option('gid'),
+    $self->option('restart'),
     @_
   );
 }
 
 sub vpopmail_insert { #subroutine, not method
-  my( $exportdir, $machine, $dir, $uid, $gid ) = splice @_,0,5;
-  my( $username, $password, $domain, $quota ) = @_;
-  
+  my( $exportdir, $machine, $dir, $uid, $gid, $restart ) = splice @_,0,6;
+  my( $username, $password, $domain, $quota, $finger ) = @_;
+
+  mkdir "$exportdir/domains/$domain", 0700 or die $!
+    unless -d "$exportdir/domains/$domain";
+
   (open(VPASSWD, ">>$exportdir/domains/$domain/vpasswd")
     and flock(VPASSWD,LOCK_EX)
   ) or die "can't open vpasswd file for $username\@$domain: ".
@@ -97,19 +135,19 @@ sub vpopmail_insert { #subroutine, not method
   close(VPASSWD);
 
   for my $mkdir (
-    map { "$exportdir/domains/$domain/$username$_" }
-      ( '', qw( /Maildir /Maildir/cur /Maildir/new /Maildir/tmp ) )
+    grep { ! -d $_ } map { "$exportdir/domains/$domain/$username$_" }
+        ( '', qw( /Maildir /Maildir/cur /Maildir/new /Maildir/tmp ) )
   ) {
     mkdir $mkdir, 0700 or die "can't mkdir $mkdir: $!";
   }
 
-  vpopmail_sync( $exportdir, $machine, $dir, $uid, $gid );
+  vpopmail_sync( $exportdir, $machine, $dir, $uid, $gid, $restart );
 
 }
 
 sub vpopmail_replace { #subroutine, not method
-  my( $exportdir, $machine, $dir, $uid, $gid ) = splice @_,0,5;
-  my( $username, $password, $domain ) = @_;
+  my( $exportdir, $machine, $dir, $uid, $gid, $restart ) = splice @_,0,6;
+  my( $username, $password, $domain, $quota, $finger ) = @_;
   
   (open(VPASSWD, "$exportdir/domains/$domain/vpasswd")
     and flock(VPASSWD,LOCK_EX)
@@ -131,7 +169,7 @@ sub vpopmail_replace { #subroutine, not method
       '1',
       '0',
       $finger,
-      $dir,
+      "$dir/domains/$domain/$username", #$vdir
       $quota ? $quota.'S' : 'NOQUOTA',
     ), "\n";
   }
@@ -144,12 +182,12 @@ sub vpopmail_replace { #subroutine, not method
   flock(VPASSWD,LOCK_UN);
   close(VPASSWD);
 
-  vpopmail_sync( $exportdir, $machine, $dir, $uid, $gid );
+  vpopmail_sync( $exportdir, $machine, $dir, $uid, $gid, $restart );
 
 }
 
 sub vpopmail_delete { #subroutine, not method
-  my( $exportdir, $machine, $dir, $uid, $gid ) = splice @_,0,5;
+  my( $exportdir, $machine, $dir, $uid, $gid, $restart ) = splice @_,0,6;
   my( $username, $domain ) = @_;
   
   (open(VPASSWD, "$exportdir/domains/$domain/vpasswd")
@@ -176,11 +214,11 @@ sub vpopmail_delete { #subroutine, not method
   rmtree "$exportdir/domains/$domain/$username"
     or die "can't rmtree $exportdir/domains/$domain/$username: $!";
 
-  vpopmail_sync( $exportdir, $machine, $dir, $uid, $gid );
+  vpopmail_sync( $exportdir, $machine, $dir, $uid, $gid, $restart );
 }
 
 sub vpopmail_sync {
-  my( $exportdir, $machine, $dir, $uid, $gid ) = splice @_,0,5;
+  my( $exportdir, $machine, $dir, $uid, $gid, $restart ) = splice @_,0,6;
   
   chdir $exportdir;
 #  my @args = ( $rsync, "-rlpt", "-e", $ssh, "domains/",
@@ -205,6 +243,12 @@ sub vpopmail_sync {
         'STDERR: '. join(" / ", $rsync->err). ', '.
         'STDOUT: '. join(" / ", $rsync->out);
   }
+
+  eval "use Net::SSH qw(ssh);";
+  die $@ if $@;
+
+  ssh("vpopmail\@$machine", $restart) if $restart;
 }
 
+1;