1 package FS::part_export::vpopmail;
3 use vars qw(@ISA @saltset $exportdir $rsync $ssh);
5 use FS::UID qw( datasrc );
8 @ISA = qw(FS::part_export);
10 @saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );
15 sub rebless { shift; }
18 my($self, $svc_acct) = (shift, shift);
19 $self->vpopmail_queue( $svc_acct->svcnum, 'insert',
21 crypt($svc_acct->_password,$saltset[int(rand(64))].$saltset[int(rand(64))]),
27 my( $self, $new, $old ) = (shift, shift, shift);
29 my $cpassword = crypt(
30 $new->_password, $saltset[int(rand(64))].$saltset[int(rand(64))]
33 return "can't change username with vpopmail"
34 if $old->username ne $new->username;
36 #no.... if mail can't be preserved, better to disallow username changes
37 #if ($old->username ne $new->username || $old->domain ne $new->domain ) {
38 # vpopmail_queue( $svc_acct->svcnum, 'delete',
39 # $old->username, $old->domain
41 # vpopmail_queue( $svc_acct->svcnum, 'insert',
47 return '' unless $old->_password ne $new->_password;
49 $self->vpopmail_queue( $new->svcnum, 'replace',
50 $new->username, $cpassword, $new->domain );
54 my( $self, $svc_acct ) = (shift, shift);
55 $self->vpopmail_queue( $svc_acct->svcnum, 'delete',
56 $svc_acct->username, $svc_acct->domain );
59 #a good idea to queue anything that could fail or take any time
61 my( $self, $svcnum, $method ) = (shift, shift, shift);
62 my $exportdir = "/usr/local/etc/freeside/export." . datasrc;
63 my $queue = new FS::queue {
65 'job' => "FS::part_export::vpopmail::vpopmail_$method",
69 $self->option('machine'),
77 sub vpopmail_insert { #subroutine, not method
78 my( $exportdir, $machine, $dir, $uid, $gid ) = splice @_,0,5;
79 my( $username, $password, $domain ) = @_;
81 (open(VPASSWD, ">>$exportdir/domains/$domain/vpasswd")
82 and flock(VPASSWD,LOCK_EX)
83 ) or die "can't open vpasswd file for $username\@$domain: ".
84 "$exportdir/domains/$domain/vpasswd: $!";
85 print VPASSWD join(":",
91 "$dir/domains/$domain/$username",
95 flock(VPASSWD,LOCK_UN);
99 map { "$exportdir/domains/$domain/$username$_" }
100 ( '', qw( /Maildir /Maildir/cur /Maildir/new /Maildir/tmp ) )
102 mkdir $mkdir, 0700 or die "can't mkdir $mkdir: $!";
105 vpopmail_sync( $exportdir, $machine, $dir, $uid, $gid );
109 sub vpopmail_replace { #subroutine, not method
110 my( $exportdir, $machine, $dir, $uid, $gid ) = splice @_,0,5;
111 my( $username, $password, $domain ) = @_;
113 (open(VPASSWD, "$exportdir/domains/$domain/vpasswd")
114 and flock(VPASSWD,LOCK_EX)
115 ) or die "can't open $exportdir/domains/$domain/vpasswd: $!";
117 open(VPASSWDTMP, ">$exportdir/domains/$domain/vpasswd.tmp")
118 or die "Can't open $exportdir/domains/$domain/vpasswd.tmp: $!";
121 my ($mailbox, $pw, @rest) = split(':', $_);
122 print VPASSWDTMP $_ unless $username eq $mailbox;
123 print VPASSWDTMP join (':', ($mailbox, $password, @rest))
124 if $username eq $mailbox;
129 rename "$exportdir/domains/$domain/vpasswd.tmp", "$exportdir/domains/$domain/vpasswd"
130 or die "Can't rename $exportdir/domains/$domain/vpasswd.tmp: $!";
132 flock(VPASSWD,LOCK_UN);
135 vpopmail_sync( $exportdir, $machine, $dir, $uid, $gid );
139 sub vpopmail_delete { #subroutine, not method
140 my( $exportdir, $machine, $dir, $uid, $gid ) = splice @_,0,5;
141 my( $username, $domain ) = @_;
143 (open(VPASSWD, "$exportdir/domains/$domain/vpasswd")
144 and flock(VPASSWD,LOCK_EX)
145 ) or die "can't open $exportdir/domains/$domain/vpasswd: $!";
147 open(VPASSWDTMP, ">$exportdir/domains/$domain/vpasswd.tmp")
148 or die "Can't open $exportdir/domains/$domain/vpasswd.tmp: $!";
151 my ($mailbox, $rest) = split(':', $_);
152 print VPASSWDTMP $_ unless $username eq $mailbox;
157 rename "$exportdir/domains/$domain/vpasswd.tmp",
158 "$exportdir/domains/$domain/vpasswd"
159 or die "Can't rename $exportdir/domains/$domain/vpasswd.tmp: $!";
161 flock(VPASSWD,LOCK_UN);
164 rmtree "$exportdir/domains/$domain/$username"
165 or die "can't rmtree $exportdir/domains/$domain/$username: $!";
167 vpopmail_sync( $exportdir, $machine, $dir, $uid, $gid );
171 my( $exportdir, $machine, $dir, $uid, $gid ) = splice @_,0,5;
174 my @args = ( $rsync, "-rlpt", "-e", $ssh, "domains/",
175 "vpopmail\@$machine:$dir/domains/" );
176 system {$args[0]} @args;