templates!!!
[freeside.git] / bin / svc_acct_sm.export
1 #!/usr/bin/perl -Tw
2 #
3 # $Id: svc_acct_sm.export,v 1.10 2001-05-08 10:44:17 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.10  2001-05-08 10:44:17  ivan
46 # fix for OO Net::SCP
47 #
48 # Revision 1.9  2001/04/22 01:56:15  ivan
49 # get rid of FS::SSH.pm (became Net::SSH and Net::SCP on CPAN)
50 #
51 # Revision 1.8  2000/07/06 03:37:24  ivan
52 # don't error out on invalid svc_acct_sm.domuid's that can't be matched in
53 # svc_acct.uid - just warn.
54 #
55 # Revision 1.7  2000/07/03 09:13:10  ivan
56 # get rid of double sendmailrestart invocation; no need for multiple sessions
57 #
58 # Revision 1.6  2000/07/03 09:09:14  ivan
59 # typo
60 #
61 # Revision 1.5  2000/07/03 09:03:14  ivan
62 # added sendmailrestart and sendmailconfigpath config files
63 #
64 # Revision 1.4  2000/06/29 14:02:29  ivan
65 # add sendmailrestart configuration file
66 #
67 # Revision 1.3  2000/06/12 08:37:56  ivan
68 # sendmail fix from Jeff Finucane
69 #
70 # Revision 1.2  1998/12/10 07:23:17  ivan
71 # use FS::Conf, need user (for datasrc)
72 #
73
74 use strict;
75 use vars qw($conf);
76 use Fcntl qw(:flock);
77 use Net::SSH qw(ssh);
78 use Net::SCP qw(scp);
79 use FS::UID qw(adminsuidsetup datasrc);
80 use FS::Record qw(qsearch qsearchs);
81 use FS::svc_acct;
82 use FS::svc_acct_sm;
83 use FS::svc_domain;
84
85 my $user = shift or die &usage;
86 adminsuidsetup $user;
87
88 $conf = new FS::Conf;
89
90 my($shellmachine, @qmailmachines);
91 if ( $conf->exists('qmailmachines') ) {
92   $shellmachine = $conf->config('shellmachine');
93   @qmailmachines = $conf->config('qmailmachines');
94 }
95
96 my(@sendmailmachines, $sendmailconfigpath, $sendmailrestart);
97 if ( $conf->exists('sendmailmachines') ) {
98   @sendmailmachines = $conf->config('sendmailmachines');
99   $sendmailconfigpath = $conf->config('sendmailconfigpath') || '/etc';
100   $sendmailrestart = $conf->config('sendmailrestart');
101 }
102
103 my $mydomain = $conf->config('domain');
104
105 my $spooldir = "/usr/local/etc/freeside/export.". datasrc;
106 my $spoollock = "/usr/local/etc/freeside/svc_acct_sm.export.lock.". datasrc;
107
108 umask 066;
109
110 open(EXPORT,"+>>$spoollock") or die "Can't open $spoollock: $!";
111 select(EXPORT); $|=1; select(STDOUT);
112 unless ( flock(EXPORT,LOCK_EX|LOCK_NB) ) {
113   seek(EXPORT,0,0);
114   my($pid)=<EXPORT>;
115   chop($pid);
116   #no reason to start locks of blocking processes
117   die "Is another export process running under pid $pid?\n";
118 }
119 seek(EXPORT,0,0);
120 print EXPORT $$,"\n";
121
122 ( open(RCPTHOSTS,">$spooldir/rcpthosts")
123   and flock(RCPTHOSTS,LOCK_EX|LOCK_NB) 
124 ) or die "Can't open $spooldir/rcpthosts: $!";
125 ( open(RECIPIENTMAP,">$spooldir/recipientmap") 
126   and flock(RECIPIENTMAP,LOCK_EX|LOCK_NB) 
127 ) or die "Can't open $spooldir/recipientmap: $!";
128 ( open(VIRTUALDOMAINS,">$spooldir/virtualdomains") 
129   and flock(VIRTUALDOMAINS,LOCK_EX|LOCK_NB)
130 ) or die "Can't open $spooldir/virtualdomains: $!";
131 ( open(VIRTUSERTABLE,">$spooldir/virtusertable")
132   and flock(VIRTUSERTABLE,LOCK_EX|LOCK_NB)
133 ) or die "Can't open $spooldir/virtusertable: $!";
134 ( open(SENDMAIL_CW,">$spooldir/sendmail.cw")
135   and flock(SENDMAIL_CW,LOCK_EX|LOCK_NB)
136 ) or die "Can't open $spooldir/sendmail.cw: $!";
137
138 setpriority(0,0,10);
139
140 my($svc_domain,%domain);
141 foreach $svc_domain ( qsearch('svc_domain',{}) ) {
142   my($domain)=$svc_domain->domain;
143   $domain{$svc_domain->svcnum}=$domain;
144   print RCPTHOSTS "$domain\n.$domain\n";
145   print SENDMAIL_CW "$domain\n";
146 }
147
148 my(@sendmail);
149
150 my($svc_acct_sm);
151 foreach $svc_acct_sm ( qsearch('svc_acct_sm') ) { 
152   my($domsvc,$domuid,$domuser)=(
153     $svc_acct_sm->domsvc,
154     $svc_acct_sm->domuid,
155     $svc_acct_sm->domuser,
156   );
157   my($domain)=$domain{$domsvc};
158   my($svc_acct)=qsearchs('svc_acct',{'uid'=>$domuid});
159   unless ( $svc_acct ) {
160     warn "WARNING: couldn't find svc_acct.uid $domuid (svc_acct_sm.svcnum ".
161          $svc_acct_sm->svcnum. ") - corruped database?\n";
162     next;
163   }
164   my($username,$dir,$uid,$gid)=(
165     $svc_acct->username,
166     $svc_acct->dir,
167     $svc_acct->uid,
168     $svc_acct->gid,
169   );
170   next unless $username && $domain && $domuser;
171
172   if ($domuser eq '*') {
173     push @sendmail, "\@$domain\t$username\n";
174     print VIRTUALDOMAINS "$domain:$username-$domain\n",
175                          ".$domain:$username-$domain\n",
176     ;
177     ###
178     # qmail
179     ssh("root\@$shellmachine",
180       "[ -e $dir/.qmail-default ] || { touch $dir/.qmail-default; chown $uid:$gid $dir/.qmail-default; }"
181     ) if ( $shellmachine && $dir && $uid );
182
183   } else {
184     print VIRTUSERTABLE "$domuser\@$domain\t$username\n";
185     print RECIPIENTMAP "$domuser\@$domain:$username\@$mydomain\n";
186   }
187
188 }
189
190 print VIRTUSERTABLE @sendmail;
191
192 chmod 0644, "$spooldir/sendmail.cw",
193             "$spooldir/virtusertable",
194             "$spooldir/rcpthosts",
195             "$spooldir/recipientmap",
196             "$spooldir/virtualdomains",
197 ;
198
199 flock(SENDMAIL_CW,LOCK_UN);
200 flock(VIRTUSERTABLE,LOCK_UN);
201 flock(RCPTHOSTS,LOCK_UN);
202 flock(RECIPIENTMAP,LOCK_UN);
203 flock(VIRTUALDOMAINS,LOCK_UN);
204
205 close SENDMAIL_CW;
206 close VIRTUSERTABLE;
207 close RCPTHOSTS;
208 close RECIPIENTMAP;
209 close VIRTUALDOMAINS;
210
211 ###
212 # export stuff
213 #
214
215 my($sendmailmachine);
216 foreach $sendmailmachine (@sendmailmachines) {
217   my $scp = new Net::SCP;
218   $scp->scp("$spooldir/sendmail.cw","root\@$sendmailmachine:$sendmailconfigpath/sendmail.cw.new")
219     or die "scp error: ". $scp->{errstr};
220   $scp->scp("$spooldir/virtusertable","root\@$sendmailmachine:$sendmailconfigpath/virtusertable.new")
221     or die "scp error: ". $scp->{errstr};
222   ssh("root\@$sendmailmachine",
223     "( ".
224       "mv $sendmailconfigpath/sendmail.cw.new $sendmailconfigpath/sendmail.cw; ".
225       "mv $sendmailconfigpath/virtusertable.new $sendmailconfigpath/virtusertable; ".
226       $sendmailrestart.
227     " )"
228   )
229     == 0 or die "ssh error: $!";
230 }
231
232 my($qmailmachine);
233 foreach $qmailmachine (@qmailmachines) {
234   my $scp = new Net::SCP;
235   $scp->scp("$spooldir/recipientmap","root\@$qmailmachine:/var/qmail/control/recipientmap")
236     or die "scp error: ". $scp->{errstr};
237   $scp->scp("$spooldir/virtualdomains","root\@$qmailmachine:/var/qmail/control/virtualdomains")
238     or die "scp error: ". $scp->{errstr};
239   $scp->scp("$spooldir/rcpthosts","root\@$qmailmachine:/var/qmail/control/rcpthosts")
240     or die "scp error: ". $scp->{errstr};
241   #ssh("root\@$qmailmachine","/etc/init.d/qmail restart")
242   #  == 0 or die "ssh error: $!";
243 }
244
245 unlink $spoollock;
246 flock(EXPORT,LOCK_UN);
247 close EXPORT;
248
249 #
250
251 sub usage {
252   die "Usage:\n\n  svc_acct.export user\n";
253 }
254