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