typo
[freeside.git] / bin / svc_acct_sm.export
1 #!/usr/bin/perl -Tw
2 #
3 # $Id: svc_acct_sm.export,v 1.6 2000-07-03 09:09:14 ivan Exp $
4
5 # Create and export config files for sendmail, qmail
6 #
7 # (used to) Create and export VoiceNet_quasar.m4
8 #
9 # ivan@voicenet.com late oct 96
10 #
11 # change priority (after copies) to 19, not 10
12 # ivan@voicenet.com 97-feb-5
13 #
14 # put file in different place and run different script, as per matt and
15 # mohamed
16 # ivan@voicenet.com 97-mar-10
17 #
18 # added exit if stuff is already locked ivan@voicenet.com 97-apr-15
19 #
20 # removed mail2
21 # ivan@voicenet.com 97-jul-10
22 #
23 # rewrote lots of the bits, now exports qmail "virtualdomain",
24 # "recipientmap" and "rcpthosts" files as well
25 #
26 # ivan@voicenet.com 97-sep-4
27 #
28 # adds ".extra" files
29 #
30 # ivan@voicenet.com 97-sep-29
31 #
32 # added ".pp" files, ugh.
33 #
34 # ivan@voicenet.com 97-oct-1
35 #
36 # rewrite ivan@sisd.com 98-mar-9
37 #
38 # now can create .qmail-default files ivan@sisd.com 98-mar-10
39 #
40 # put example $my_domain declaration in ivan@sisd.com 98-mar-23
41 #
42 # /var/spool/freeside/conf and sendmail updates ivan@sisd.com 98-aug-14
43 #
44 # $Log: svc_acct_sm.export,v $
45 # Revision 1.6  2000-07-03 09:09:14  ivan
46 # typo
47 #
48 # Revision 1.5  2000/07/03 09:03:14  ivan
49 # added sendmailrestart and sendmailconfigpath config files
50 #
51 # Revision 1.4  2000/06/29 14:02:29  ivan
52 # add sendmailrestart configuration file
53 #
54 # Revision 1.3  2000/06/12 08:37:56  ivan
55 # sendmail fix from Jeff Finucane
56 #
57 # Revision 1.2  1998/12/10 07:23:17  ivan
58 # use FS::Conf, need user (for datasrc)
59 #
60
61 use strict;
62 use vars qw($conf);
63 use Fcntl qw(:flock);
64 use FS::SSH qw(ssh scp);
65 use FS::UID qw(adminsuidsetup datasrc);
66 use FS::Record qw(qsearch qsearchs);
67 use FS::svc_acct;
68 use FS::svc_acct_sm;
69 use FS::svc_domain;
70
71 my $user = shift or die &usage;
72 adminsuidsetup $user;
73
74 $conf = new FS::Conf;
75
76 my($shellmachine, @qmailmachines);
77 if ( $conf->exists('qmailmachines') ) {
78   $shellmachine = $conf->config('shellmachine');
79   @qmailmachines = $conf->config('qmailmachines');
80 }
81
82 my(@sendmailmachines, $sendmailconfigpath, $sendmailrestart);
83 if ( $conf->exists('sendmailmachines') ) {
84   @sendmailmachines = $conf->config('sendmailmachines');
85   $sendmailconfigpath = $conf->config('sendmailconfigpath') || '/etc';
86   $sendmailrestart = $conf->config('sendmailrestart');
87 }
88
89 my $mydomain = $conf->config('domain');
90
91 my $spooldir = "/usr/local/etc/freeside/export.". datasrc;
92 my $spoollock = "/usr/local/etc/freeside/svc_acct_sm.export.lock.". datasrc;
93
94 umask 066;
95
96 open(EXPORT,"+>>$spoollock") or die "Can't open $spoollock: $!";
97 select(EXPORT); $|=1; select(STDOUT);
98 unless ( flock(EXPORT,LOCK_EX|LOCK_NB) ) {
99   seek(EXPORT,0,0);
100   my($pid)=<EXPORT>;
101   chop($pid);
102   #no reason to start locks of blocking processes
103   die "Is another export process running under pid $pid?\n";
104 }
105 seek(EXPORT,0,0);
106 print EXPORT $$,"\n";
107
108 ( open(RCPTHOSTS,">$spooldir/rcpthosts")
109   and flock(RCPTHOSTS,LOCK_EX|LOCK_NB) 
110 ) or die "Can't open $spooldir/rcpthosts: $!";
111 ( open(RECIPIENTMAP,">$spooldir/recipientmap") 
112   and flock(RECIPIENTMAP,LOCK_EX|LOCK_NB) 
113 ) or die "Can't open $spooldir/recipientmap: $!";
114 ( open(VIRTUALDOMAINS,">$spooldir/virtualdomains") 
115   and flock(VIRTUALDOMAINS,LOCK_EX|LOCK_NB)
116 ) or die "Can't open $spooldir/virtualdomains: $!";
117 ( open(VIRTUSERTABLE,">$spooldir/virtusertable")
118   and flock(VIRTUSERTABLE,LOCK_EX|LOCK_NB)
119 ) or die "Can't open $spooldir/virtusertable: $!";
120 ( open(SENDMAIL_CW,">$spooldir/sendmail.cw")
121   and flock(SENDMAIL_CW,LOCK_EX|LOCK_NB)
122 ) or die "Can't open $spooldir/sendmail.cw: $!";
123
124 setpriority(0,0,10);
125
126 my($svc_domain,%domain);
127 foreach $svc_domain ( qsearch('svc_domain',{}) ) {
128   my($domain)=$svc_domain->domain;
129   $domain{$svc_domain->svcnum}=$domain;
130   print RCPTHOSTS "$domain\n.$domain\n";
131   print SENDMAIL_CW "$domain\n";
132 }
133
134 my(@sendmail);
135
136 my($svc_acct_sm);
137 foreach $svc_acct_sm ( qsearch('svc_acct_sm') ) { 
138   my($domsvc,$domuid,$domuser)=(
139     $svc_acct_sm->domsvc,
140     $svc_acct_sm->domuid,
141     $svc_acct_sm->domuser,
142   );
143   my($domain)=$domain{$domsvc};
144   my($svc_acct)=qsearchs('svc_acct',{'uid'=>$domuid});
145   my($username,$dir,$uid,$gid)=(
146     $svc_acct->username,
147     $svc_acct->dir,
148     $svc_acct->uid,
149     $svc_acct->gid,
150   );
151   next unless $username && $domain && $domuser;
152
153   if ($domuser eq '*') {
154     push @sendmail, "\@$domain\t$username\n";
155     print VIRTUALDOMAINS "$domain:$username-$domain\n",
156                          ".$domain:$username-$domain\n",
157     ;
158     ###
159     # qmail
160     ssh("root\@$shellmachine",
161       "[ -e $dir/.qmail-default ] || { touch $dir/.qmail-default; chown $uid:$gid $dir/.qmail-default; }"
162     ) if ( $shellmachine && $dir && $uid );
163
164   } else {
165     print VIRTUSERTABLE "$domuser\@$domain\t$username\n";
166     print RECIPIENTMAP "$domuser\@$domain:$username\@$mydomain\n";
167   }
168
169 }
170
171 print VIRTUSERTABLE @sendmail;
172
173 chmod 0644, "$spooldir/sendmail.cw",
174             "$spooldir/virtusertable",
175             "$spooldir/rcpthosts",
176             "$spooldir/recipientmap",
177             "$spooldir/virtualdomains",
178 ;
179
180 flock(SENDMAIL_CW,LOCK_UN);
181 flock(VIRTUSERTABLE,LOCK_UN);
182 flock(RCPTHOSTS,LOCK_UN);
183 flock(RECIPIENTMAP,LOCK_UN);
184 flock(VIRTUALDOMAINS,LOCK_UN);
185
186 close SENDMAIL_CW;
187 close VIRTUSERTABLE;
188 close RCPTHOSTS;
189 close RECIPIENTMAP;
190 close VIRTUALDOMAINS;
191
192 ###
193 # export stuff
194 #
195
196 my($sendmailmachine);
197 foreach $sendmailmachine (@sendmailmachines) {
198   scp("$spooldir/sendmail.cw","root\@$sendmailmachine:$sendmailconfigpath/sendmail.cw.new")
199     == 0 or die "scp error: $!";
200   scp("$spooldir/virtusertable","root\@$sendmailmachine:$sendmailconfigpath/virtusertable.new")
201     == 0 or die "scp error: $!";
202   ssh("root\@$sendmailmachine",
203     "( ".
204       "mv $sendmailconfigpath/sendmail.cw.new $sendmailconfigpath/sendmail.cw; ".
205       "mv $sendmailconfigpath/virtusertable.new $sendmailconfigpath/virtusertable; ".
206       $sendmailrestart.
207     " )"
208   )
209     == 0 or die "ssh error: $!";
210   if ( $conf->config('sendmailrestart') ) {
211     ssh("root\@$sendmailmachine", $conf->config('sendmailrestart') )
212       == 0 or die "ssh error: $!";
213   }
214 }
215
216 my($qmailmachine);
217 foreach $qmailmachine (@qmailmachines) {
218   scp("$spooldir/recipientmap","root\@$qmailmachine:/var/qmail/control/recipientmap")
219     == 0 or die "scp error: $!";
220   scp("$spooldir/virtualdomains","root\@$qmailmachine:/var/qmail/control/virtualdomains")
221     == 0 or die "scp error: $!";
222   scp("$spooldir/rcpthosts","root\@$qmailmachine:/var/qmail/control/rcpthosts")
223     == 0 or die "scp error: $!";
224   #ssh("root\@$qmailmachine","/etc/init.d/qmail restart")
225   #  == 0 or die "ssh error: $!";
226 }
227
228 unlink $spoollock;
229 flock(EXPORT,LOCK_UN);
230 close EXPORT;
231
232 #
233
234 sub usage {
235   die "Usage:\n\n  svc_acct.export user\n";
236 }
237