#!/usr/bin/perl -Tw # # $Id: svc_acct_sm.export,v 1.10 2001-05-08 10:44:17 ivan Exp $ # # Create and export config files for sendmail, qmail # # (used to) Create and export VoiceNet_quasar.m4 # # ivan@voicenet.com late oct 96 # # change priority (after copies) to 19, not 10 # ivan@voicenet.com 97-feb-5 # # put file in different place and run different script, as per matt and # mohamed # ivan@voicenet.com 97-mar-10 # # added exit if stuff is already locked ivan@voicenet.com 97-apr-15 # # removed mail2 # ivan@voicenet.com 97-jul-10 # # rewrote lots of the bits, now exports qmail "virtualdomain", # "recipientmap" and "rcpthosts" files as well # # ivan@voicenet.com 97-sep-4 # # adds ".extra" files # # ivan@voicenet.com 97-sep-29 # # added ".pp" files, ugh. # # ivan@voicenet.com 97-oct-1 # # rewrite ivan@sisd.com 98-mar-9 # # now can create .qmail-default files ivan@sisd.com 98-mar-10 # # put example $my_domain declaration in ivan@sisd.com 98-mar-23 # # /var/spool/freeside/conf and sendmail updates ivan@sisd.com 98-aug-14 # # $Log: svc_acct_sm.export,v $ # Revision 1.10 2001-05-08 10:44:17 ivan # fix for OO Net::SCP # # Revision 1.9 2001/04/22 01:56:15 ivan # get rid of FS::SSH.pm (became Net::SSH and Net::SCP on CPAN) # # Revision 1.8 2000/07/06 03:37:24 ivan # don't error out on invalid svc_acct_sm.domuid's that can't be matched in # svc_acct.uid - just warn. # # Revision 1.7 2000/07/03 09:13:10 ivan # get rid of double sendmailrestart invocation; no need for multiple sessions # # Revision 1.6 2000/07/03 09:09:14 ivan # typo # # Revision 1.5 2000/07/03 09:03:14 ivan # added sendmailrestart and sendmailconfigpath config files # # Revision 1.4 2000/06/29 14:02:29 ivan # add sendmailrestart configuration file # # Revision 1.3 2000/06/12 08:37:56 ivan # sendmail fix from Jeff Finucane # # Revision 1.2 1998/12/10 07:23:17 ivan # use FS::Conf, need user (for datasrc) # use strict; use vars qw($conf); use Fcntl qw(:flock); use Net::SSH qw(ssh); use Net::SCP qw(scp); use FS::UID qw(adminsuidsetup datasrc); use FS::Record qw(qsearch qsearchs); use FS::svc_acct; use FS::svc_acct_sm; use FS::svc_domain; my $user = shift or die &usage; adminsuidsetup $user; $conf = new FS::Conf; my($shellmachine, @qmailmachines); if ( $conf->exists('qmailmachines') ) { $shellmachine = $conf->config('shellmachine'); @qmailmachines = $conf->config('qmailmachines'); } my(@sendmailmachines, $sendmailconfigpath, $sendmailrestart); if ( $conf->exists('sendmailmachines') ) { @sendmailmachines = $conf->config('sendmailmachines'); $sendmailconfigpath = $conf->config('sendmailconfigpath') || '/etc'; $sendmailrestart = $conf->config('sendmailrestart'); } my $mydomain = $conf->config('domain'); my $spooldir = "/usr/local/etc/freeside/export.". datasrc; my $spoollock = "/usr/local/etc/freeside/svc_acct_sm.export.lock.". datasrc; umask 066; open(EXPORT,"+>>$spoollock") or die "Can't open $spoollock: $!"; select(EXPORT); $|=1; select(STDOUT); unless ( flock(EXPORT,LOCK_EX|LOCK_NB) ) { seek(EXPORT,0,0); my($pid)=; chop($pid); #no reason to start locks of blocking processes die "Is another export process running under pid $pid?\n"; } seek(EXPORT,0,0); print EXPORT $$,"\n"; ( open(RCPTHOSTS,">$spooldir/rcpthosts") and flock(RCPTHOSTS,LOCK_EX|LOCK_NB) ) or die "Can't open $spooldir/rcpthosts: $!"; ( open(RECIPIENTMAP,">$spooldir/recipientmap") and flock(RECIPIENTMAP,LOCK_EX|LOCK_NB) ) or die "Can't open $spooldir/recipientmap: $!"; ( open(VIRTUALDOMAINS,">$spooldir/virtualdomains") and flock(VIRTUALDOMAINS,LOCK_EX|LOCK_NB) ) or die "Can't open $spooldir/virtualdomains: $!"; ( open(VIRTUSERTABLE,">$spooldir/virtusertable") and flock(VIRTUSERTABLE,LOCK_EX|LOCK_NB) ) or die "Can't open $spooldir/virtusertable: $!"; ( open(SENDMAIL_CW,">$spooldir/sendmail.cw") and flock(SENDMAIL_CW,LOCK_EX|LOCK_NB) ) or die "Can't open $spooldir/sendmail.cw: $!"; setpriority(0,0,10); my($svc_domain,%domain); foreach $svc_domain ( qsearch('svc_domain',{}) ) { my($domain)=$svc_domain->domain; $domain{$svc_domain->svcnum}=$domain; print RCPTHOSTS "$domain\n.$domain\n"; print SENDMAIL_CW "$domain\n"; } my(@sendmail); my($svc_acct_sm); foreach $svc_acct_sm ( qsearch('svc_acct_sm') ) { my($domsvc,$domuid,$domuser)=( $svc_acct_sm->domsvc, $svc_acct_sm->domuid, $svc_acct_sm->domuser, ); my($domain)=$domain{$domsvc}; my($svc_acct)=qsearchs('svc_acct',{'uid'=>$domuid}); unless ( $svc_acct ) { warn "WARNING: couldn't find svc_acct.uid $domuid (svc_acct_sm.svcnum ". $svc_acct_sm->svcnum. ") - corruped database?\n"; next; } my($username,$dir,$uid,$gid)=( $svc_acct->username, $svc_acct->dir, $svc_acct->uid, $svc_acct->gid, ); next unless $username && $domain && $domuser; if ($domuser eq '*') { push @sendmail, "\@$domain\t$username\n"; print VIRTUALDOMAINS "$domain:$username-$domain\n", ".$domain:$username-$domain\n", ; ### # qmail ssh("root\@$shellmachine", "[ -e $dir/.qmail-default ] || { touch $dir/.qmail-default; chown $uid:$gid $dir/.qmail-default; }" ) if ( $shellmachine && $dir && $uid ); } else { print VIRTUSERTABLE "$domuser\@$domain\t$username\n"; print RECIPIENTMAP "$domuser\@$domain:$username\@$mydomain\n"; } } print VIRTUSERTABLE @sendmail; chmod 0644, "$spooldir/sendmail.cw", "$spooldir/virtusertable", "$spooldir/rcpthosts", "$spooldir/recipientmap", "$spooldir/virtualdomains", ; flock(SENDMAIL_CW,LOCK_UN); flock(VIRTUSERTABLE,LOCK_UN); flock(RCPTHOSTS,LOCK_UN); flock(RECIPIENTMAP,LOCK_UN); flock(VIRTUALDOMAINS,LOCK_UN); close SENDMAIL_CW; close VIRTUSERTABLE; close RCPTHOSTS; close RECIPIENTMAP; close VIRTUALDOMAINS; ### # export stuff # my($sendmailmachine); foreach $sendmailmachine (@sendmailmachines) { my $scp = new Net::SCP; $scp->scp("$spooldir/sendmail.cw","root\@$sendmailmachine:$sendmailconfigpath/sendmail.cw.new") or die "scp error: ". $scp->{errstr}; $scp->scp("$spooldir/virtusertable","root\@$sendmailmachine:$sendmailconfigpath/virtusertable.new") or die "scp error: ". $scp->{errstr}; ssh("root\@$sendmailmachine", "( ". "mv $sendmailconfigpath/sendmail.cw.new $sendmailconfigpath/sendmail.cw; ". "mv $sendmailconfigpath/virtusertable.new $sendmailconfigpath/virtusertable; ". $sendmailrestart. " )" ) == 0 or die "ssh error: $!"; } my($qmailmachine); foreach $qmailmachine (@qmailmachines) { my $scp = new Net::SCP; $scp->scp("$spooldir/recipientmap","root\@$qmailmachine:/var/qmail/control/recipientmap") or die "scp error: ". $scp->{errstr}; $scp->scp("$spooldir/virtualdomains","root\@$qmailmachine:/var/qmail/control/virtualdomains") or die "scp error: ". $scp->{errstr}; $scp->scp("$spooldir/rcpthosts","root\@$qmailmachine:/var/qmail/control/rcpthosts") or die "scp error: ". $scp->{errstr}; #ssh("root\@$qmailmachine","/etc/init.d/qmail restart") # == 0 or die "ssh error: $!"; } unlink $spoollock; flock(EXPORT,LOCK_UN); close EXPORT; # sub usage { die "Usage:\n\n svc_acct.export user\n"; }