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,
+ 'default_svc_class' => 'Email',
+ '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="http://www.freeside.biz/mediawiki/index.php/Freeside:1.9:Documentation:Administration:SSH_Keys">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; }
crypt($svc_acct->_password,$saltset[int(rand(64))].$saltset[int(rand(64))]),
$svc_acct->domain,
$svc_acct->quota,
+ $svc_acct->finger,
);
}
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 {
#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;
+
+ my $exportdir = "%%%FREESIDE_EXPORT%%%/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",
$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: ".
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)
'1',
'0',
$finger,
- $dir,
+ "$dir/domains/$domain/$username", #$vdir
$quota ? $quota.'S' : 'NOQUOTA',
), "\n";
}
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")
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/",
'STDERR: '. join(" / ", $rsync->err). ', '.
'STDOUT: '. join(" / ", $rsync->out);
}
+
+ eval "use Net::SSH qw(ssh);";
+ die $@ if $@;
+
+ ssh("vpopmail\@$machine", $restart) if $restart;
}
+1;