summaryrefslogtreecommitdiff
path: root/FS/FS/part_export/vpopmail.pm
diff options
context:
space:
mode:
Diffstat (limited to 'FS/FS/part_export/vpopmail.pm')
-rw-r--r--FS/FS/part_export/vpopmail.pm101
1 files changed, 74 insertions, 27 deletions
diff --git a/FS/FS/part_export/vpopmail.pm b/FS/FS/part_export/vpopmail.pm
index 6a486fa..a505a0f 100644
--- a/FS/FS/part_export/vpopmail.pm
+++ b/FS/FS/part_export/vpopmail.pm
@@ -1,6 +1,7 @@
package FS::part_export::vpopmail;
-use vars qw(@ISA @saltset $exportdir $rsync $ssh);
+use vars qw(@ISA @saltset $exportdir);
+use Fcntl qw(:flock);
use File::Path;
use FS::UID qw( datasrc );
use FS::part_export;
@@ -9,9 +10,6 @@ use FS::part_export;
@saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );
-$rsync = "rsync";
-$ssh = "ssh";
-
sub rebless { shift; }
sub _export_insert {
@@ -20,6 +18,8 @@ sub _export_insert {
$svc_acct->username,
crypt($svc_acct->_password,$saltset[int(rand(64))].$saltset[int(rand(64))]),
$svc_acct->domain,
+ $svc_acct->quota,
+ $svc_acct->finger,
);
}
@@ -47,7 +47,7 @@ sub _export_replace {
return '' unless $old->_password ne $new->_password;
$self->vpopmail_queue( $new->svcnum, 'replace',
- $new->username, $cpassword, $new->domain );
+ $new->username, $cpassword, $new->domain, $new->quota, $new->finger );
}
sub _export_delete {
@@ -59,25 +59,37 @@ 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",
};
$queue->insert(
$exportdir,
- $self->option('machine'),
+ $self->machine,
$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 ) = @_;
-
+ 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: ".
@@ -87,28 +99,28 @@ sub vpopmail_insert { #subroutine, not method
$password,
'1',
'0',
- $username,
+ $finger,
"$dir/domains/$domain/$username",
- 'NOQUOTA',
+ $quota ? $quota.'S' : 'NOQUOTA',
), "\n";
flock(VPASSWD,LOCK_UN);
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)
@@ -118,10 +130,21 @@ sub vpopmail_replace { #subroutine, not method
or die "Can't open $exportdir/domains/$domain/vpasswd.tmp: $!";
while (<VPASSWD>) {
- my ($mailbox, $pw, @rest) = split(':', $_);
- print VPASSWDTMP $_ unless $username eq $mailbox;
- print VPASSWDTMP join (':', ($mailbox, $password, @rest))
- if $username eq $mailbox;
+ my ($mailbox, $pw, $vuid, $vgid, $vfinger, $vdir, $vquota, @rest) =
+ split(':', $_);
+ if ( $username ne $mailbox ) {
+ print VPASSWDTMP $_;
+ next
+ }
+ print VPASSWDTMP join (':',
+ $mailbox,
+ $password,
+ '1',
+ '0',
+ $finger,
+ "$dir/domains/$domain/$username", #$vdir
+ $quota ? $quota.'S' : 'NOQUOTA',
+ ), "\n";
}
close(VPASSWDTMP);
@@ -132,12 +155,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")
@@ -164,16 +187,40 @@ 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/",
- "vpopmail\@$machine:$dir/domains/" );
- system {$args[0]} @args;
+# my @args = ( $rsync, "-rlpt", "-e", $ssh, "domains/",
+# "vpopmail\@$machine:$dir/domains/" );
+# system {$args[0]} @args;
+
+ eval "use File::Rsync;";
+ die $@ if $@;
+
+ my $rsync = File::Rsync->new({ rsh => 'ssh' });
+
+ $rsync->exec( {
+ recursive => 1,
+ perms => 1,
+ times => 1,
+ src => "$exportdir/domains/",
+ dest => "vpopmail\@$machine:$dir/domains/",
+ } ); # true/false return value from exec is not working, alas
+ if ( $rsync->err ) {
+ die "error uploading to vpopmail\@$machine:$dir/domains/ : ".
+ 'exit status: '. $rsync->status. ', '.
+ 'STDERR: '. join(" / ", $rsync->err). ', '.
+ 'STDOUT: '. join(" / ", $rsync->out);
+ }
+
+ eval "use Net::SSH qw(ssh);";
+ die $@ if $@;
+
+ ssh("vpopmail\@$machine", $restart) if $restart;
}