3 # $Id: svc_acct_sm.export,v 1.8 2000-07-06 03:37:24 ivan Exp $
5 # Create and export config files for sendmail, qmail
7 # (used to) Create and export VoiceNet_quasar.m4
9 # ivan@voicenet.com late oct 96
11 # change priority (after copies) to 19, not 10
12 # ivan@voicenet.com 97-feb-5
14 # put file in different place and run different script, as per matt and
16 # ivan@voicenet.com 97-mar-10
18 # added exit if stuff is already locked ivan@voicenet.com 97-apr-15
21 # ivan@voicenet.com 97-jul-10
23 # rewrote lots of the bits, now exports qmail "virtualdomain",
24 # "recipientmap" and "rcpthosts" files as well
26 # ivan@voicenet.com 97-sep-4
30 # ivan@voicenet.com 97-sep-29
32 # added ".pp" files, ugh.
34 # ivan@voicenet.com 97-oct-1
36 # rewrite ivan@sisd.com 98-mar-9
38 # now can create .qmail-default files ivan@sisd.com 98-mar-10
40 # put example $my_domain declaration in ivan@sisd.com 98-mar-23
42 # /var/spool/freeside/conf and sendmail updates ivan@sisd.com 98-aug-14
44 # $Log: svc_acct_sm.export,v $
45 # Revision 1.8 2000-07-06 03:37:24 ivan
46 # don't error out on invalid svc_acct_sm.domuid's that can't be matched in
47 # svc_acct.uid - just warn.
49 # Revision 1.7 2000/07/03 09:13:10 ivan
50 # get rid of double sendmailrestart invocation; no need for multiple sessions
52 # Revision 1.6 2000/07/03 09:09:14 ivan
55 # Revision 1.5 2000/07/03 09:03:14 ivan
56 # added sendmailrestart and sendmailconfigpath config files
58 # Revision 1.4 2000/06/29 14:02:29 ivan
59 # add sendmailrestart configuration file
61 # Revision 1.3 2000/06/12 08:37:56 ivan
62 # sendmail fix from Jeff Finucane
64 # Revision 1.2 1998/12/10 07:23:17 ivan
65 # use FS::Conf, need user (for datasrc)
71 use FS::SSH qw(ssh scp);
72 use FS::UID qw(adminsuidsetup datasrc);
73 use FS::Record qw(qsearch qsearchs);
78 my $user = shift or die &usage;
83 my($shellmachine, @qmailmachines);
84 if ( $conf->exists('qmailmachines') ) {
85 $shellmachine = $conf->config('shellmachine');
86 @qmailmachines = $conf->config('qmailmachines');
89 my(@sendmailmachines, $sendmailconfigpath, $sendmailrestart);
90 if ( $conf->exists('sendmailmachines') ) {
91 @sendmailmachines = $conf->config('sendmailmachines');
92 $sendmailconfigpath = $conf->config('sendmailconfigpath') || '/etc';
93 $sendmailrestart = $conf->config('sendmailrestart');
96 my $mydomain = $conf->config('domain');
98 my $spooldir = "/usr/local/etc/freeside/export.". datasrc;
99 my $spoollock = "/usr/local/etc/freeside/svc_acct_sm.export.lock.". datasrc;
103 open(EXPORT,"+>>$spoollock") or die "Can't open $spoollock: $!";
104 select(EXPORT); $|=1; select(STDOUT);
105 unless ( flock(EXPORT,LOCK_EX|LOCK_NB) ) {
109 #no reason to start locks of blocking processes
110 die "Is another export process running under pid $pid?\n";
113 print EXPORT $$,"\n";
115 ( open(RCPTHOSTS,">$spooldir/rcpthosts")
116 and flock(RCPTHOSTS,LOCK_EX|LOCK_NB)
117 ) or die "Can't open $spooldir/rcpthosts: $!";
118 ( open(RECIPIENTMAP,">$spooldir/recipientmap")
119 and flock(RECIPIENTMAP,LOCK_EX|LOCK_NB)
120 ) or die "Can't open $spooldir/recipientmap: $!";
121 ( open(VIRTUALDOMAINS,">$spooldir/virtualdomains")
122 and flock(VIRTUALDOMAINS,LOCK_EX|LOCK_NB)
123 ) or die "Can't open $spooldir/virtualdomains: $!";
124 ( open(VIRTUSERTABLE,">$spooldir/virtusertable")
125 and flock(VIRTUSERTABLE,LOCK_EX|LOCK_NB)
126 ) or die "Can't open $spooldir/virtusertable: $!";
127 ( open(SENDMAIL_CW,">$spooldir/sendmail.cw")
128 and flock(SENDMAIL_CW,LOCK_EX|LOCK_NB)
129 ) or die "Can't open $spooldir/sendmail.cw: $!";
133 my($svc_domain,%domain);
134 foreach $svc_domain ( qsearch('svc_domain',{}) ) {
135 my($domain)=$svc_domain->domain;
136 $domain{$svc_domain->svcnum}=$domain;
137 print RCPTHOSTS "$domain\n.$domain\n";
138 print SENDMAIL_CW "$domain\n";
144 foreach $svc_acct_sm ( qsearch('svc_acct_sm') ) {
145 my($domsvc,$domuid,$domuser)=(
146 $svc_acct_sm->domsvc,
147 $svc_acct_sm->domuid,
148 $svc_acct_sm->domuser,
150 my($domain)=$domain{$domsvc};
151 my($svc_acct)=qsearchs('svc_acct',{'uid'=>$domuid});
152 unless ( $svc_acct ) {
153 warn "WARNING: couldn't find svc_acct.uid $domuid (svc_acct_sm.svcnum ".
154 $svc_acct_sm->svcnum. ") - corruped database?\n";
157 my($username,$dir,$uid,$gid)=(
163 next unless $username && $domain && $domuser;
165 if ($domuser eq '*') {
166 push @sendmail, "\@$domain\t$username\n";
167 print VIRTUALDOMAINS "$domain:$username-$domain\n",
168 ".$domain:$username-$domain\n",
172 ssh("root\@$shellmachine",
173 "[ -e $dir/.qmail-default ] || { touch $dir/.qmail-default; chown $uid:$gid $dir/.qmail-default; }"
174 ) if ( $shellmachine && $dir && $uid );
177 print VIRTUSERTABLE "$domuser\@$domain\t$username\n";
178 print RECIPIENTMAP "$domuser\@$domain:$username\@$mydomain\n";
183 print VIRTUSERTABLE @sendmail;
185 chmod 0644, "$spooldir/sendmail.cw",
186 "$spooldir/virtusertable",
187 "$spooldir/rcpthosts",
188 "$spooldir/recipientmap",
189 "$spooldir/virtualdomains",
192 flock(SENDMAIL_CW,LOCK_UN);
193 flock(VIRTUSERTABLE,LOCK_UN);
194 flock(RCPTHOSTS,LOCK_UN);
195 flock(RECIPIENTMAP,LOCK_UN);
196 flock(VIRTUALDOMAINS,LOCK_UN);
202 close VIRTUALDOMAINS;
208 my($sendmailmachine);
209 foreach $sendmailmachine (@sendmailmachines) {
210 scp("$spooldir/sendmail.cw","root\@$sendmailmachine:$sendmailconfigpath/sendmail.cw.new")
211 == 0 or die "scp error: $!";
212 scp("$spooldir/virtusertable","root\@$sendmailmachine:$sendmailconfigpath/virtusertable.new")
213 == 0 or die "scp error: $!";
214 ssh("root\@$sendmailmachine",
216 "mv $sendmailconfigpath/sendmail.cw.new $sendmailconfigpath/sendmail.cw; ".
217 "mv $sendmailconfigpath/virtusertable.new $sendmailconfigpath/virtusertable; ".
221 == 0 or die "ssh error: $!";
225 foreach $qmailmachine (@qmailmachines) {
226 scp("$spooldir/recipientmap","root\@$qmailmachine:/var/qmail/control/recipientmap")
227 == 0 or die "scp error: $!";
228 scp("$spooldir/virtualdomains","root\@$qmailmachine:/var/qmail/control/virtualdomains")
229 == 0 or die "scp error: $!";
230 scp("$spooldir/rcpthosts","root\@$qmailmachine:/var/qmail/control/rcpthosts")
231 == 0 or die "scp error: $!";
232 #ssh("root\@$qmailmachine","/etc/init.d/qmail restart")
233 # == 0 or die "ssh error: $!";
237 flock(EXPORT,LOCK_UN);
243 die "Usage:\n\n svc_acct.export user\n";