Merge branch 'master' of git.freeside.biz:/home/git/freeside
[freeside.git] / bin / apache.export
1 #!/usr/bin/perl -w
2
3 use strict;
4 use Getopt::Std;
5 #use File::Path;
6 use File::Rsync;
7 use Net::SSH qw(ssh);
8 use FS::UID qw(adminsuidsetup datasrc);
9 use FS::Record qw(qsearch qsearchs);
10 use FS::part_export;
11 use FS::cust_svc;
12 use FS::svc_www;
13
14 use vars qw(%opt);
15 getopts("d", \%opt);
16
17 my $user = shift or die &usage;
18 adminsuidsetup $user;
19
20 #needs the export number in there somewhere too...?
21 my $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/apache";
22 mkdir $spooldir, 0700 unless -d $spooldir;
23
24 my @exports = qsearch('part_export', { 'exporttype' => 'apache' } );
25
26 my $rsync = File::Rsync->new({
27   rsh     => 'ssh',
28 #  dry_run => 1,
29 });
30
31 foreach my $export ( @exports ) {
32
33   my $machine   = $export->machine;
34   my $exportnum = $export->exportnum;
35   my $file = "$spooldir/$machine.exportnum$exportnum.conf";
36
37   warn "exporting apache configuration for $machine to $file\n"
38     if $opt{d};
39
40   open(HTTPD_CONF,">$file") or die "can't open $file: $!";
41
42   my @svc_www = $export->svc_x;
43
44   foreach my $svc_www ( @svc_www ) {
45     use vars qw($zone $username $dir $email $config);
46     $zone = $svc_www->domain_record->zone;
47     $config = $svc_www->config;
48     my $template = $export->option('template');
49     my $cust_pkg = $svc_www->cust_svc->cust_pkg;
50     if ( $cust_pkg->getfield('susp') or $cust_pkg->getfield('cancel') ) {
51       $template = $export->option('template_inactive') 
52                   || $export->option('template');
53       # Fall back to the regular template if template_inactive doesn't exist
54     }
55     if ( $svc_www->svc_acct ) {
56       $username = $svc_www->svc_acct->username;
57       $dir = $svc_www->svc_acct->dir;
58       $email = $svc_www->svc_acct->email;
59     } else {
60       $username = '';
61       $dir      = '';
62       $email    = '';
63     }
64
65     warn "  adding configuration section for $zone\n"
66       if $opt{d};
67
68     print HTTPD_CONF eval(qq("$template")). "\n\n";
69   }
70
71   my $user = $export->option('user');
72   my $httpd_conf = $export->option('httpd_conf');
73
74   warn "syncing $file to $httpd_conf on $machine\n"
75     if $opt{d};
76
77   $rsync->exec( {
78     src       => $file,
79     dest      => "$user\@$machine:$httpd_conf",
80   } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
81  # warn $rsync->out;
82
83   my $restart = $export->option('restart') || 'apachectl graceful';
84
85   warn "running restart command $restart on $machine\n"
86     if $opt{d};
87
88   ssh("root\@$machine", $restart);
89
90 }
91
92 close HTTPD_CONF;
93
94 # -----
95
96 sub usage {
97   die "Usage:\n  apache.export [ -d ] user\n"; 
98 }
99