lists.def blocks http mboxes, unused otherwise
[mharc.git] / bin / apply-config
1 #!/usr/bin/perl
2 ##--------------------------------------------------------------------------##
3 ##  File:
4 ##      $Id: apply-config,v 1.15 2002/10/17 03:14:31 ehood Exp $
5 ##  Description:
6 ##      Processes all '.in' template files.
7 ##--------------------------------------------------------------------------##
8 ##  Copyright (C) 2002  Earl Hood <earl@earlhood.com>
9 ##
10 ##  This program is free software; you can redistribute it and/or modify
11 ##  it under the terms of the GNU General Public License as published by
12 ##  the Free Software Foundation; either version 2 of the License, or
13 ##  (at your option) any later version.
14 ##  
15 ##  This program is distributed in the hope that it will be useful,
16 ##  but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ##  GNU General Public License for more details.
19 ##  
20 ##  You should have received a copy of the GNU General Public License
21 ##  along with this program; if not, write to the Free Software
22 ##  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23 ##  02111-1307, USA
24 ##--------------------------------------------------------------------------##
25
26 package MHArc::apply_config;
27
28 ##--------------------------------------------------------------------------##
29 # <x-boot-strap>
30 BEGIN { die qq/CGI use FORBIDDEN!\n/ if (defined($ENV{'GATEWAY_INTERFACE'})); }
31 my $Dir; BEGIN { $Dir = `dirname $0`; chomp $Dir; }
32 use lib "$Dir/../lib";  # Add relative lib to search path
33 # </x-boot-strap>
34 ##--------------------------------------------------------------------------##
35 # <x-config>
36 use MHArc::Config;
37 my $config = MHArc::Config->load("$Dir/../lib/config.sh");
38 # </x-config>
39 ##--------------------------------------------------------------------------##
40
41 use Getopt::Long;
42 use File::Find;
43 use MHArc::Util qw(run_prg usage);
44
45 my $clean = 0;
46 my $distclean = 0;
47 my $debug = 0;
48 my $noact = 0;
49 my $verbose = 0;
50
51 my $clstatus = GetOptions(
52     "clean!"      => \$clean,
53     "distclean!"  => \$distclean,
54     "debug!"      => \$debug,
55     "n!"          => \$noact,
56     "verbose!"    => \$verbose,
57
58     "help"        => \$help,
59     "man"         => \$man
60 );
61 usage(0) unless $clstatus;
62 usage(1) if $help;
63 usage(2) if $man;
64
65 $verbose = 1  if $debug || $noact;
66 $clean   = 1  if $distclean;
67 $MHArc::Util::ECHO_CMDS = 1  if ($verbose);
68 $MHArc::Util::ECHO_ONLY = 1  if ($noact);
69
70 my %done = ( );
71
72 if ($debug) {
73   $config->dump_config(\*STDERR);
74 }
75
76 sub wanted {
77   if ($_ =~ /config\.sh$/ ||
78       $_ =~ /config\.sh\.in$/ ||
79       $_ =~ /config\.sh\.dist$/ ||
80       $_ =~ /config\.sh\.in\.dist$/) {
81     print qq/Skipping config file "$File::Find::name"\n/  if $debug;
82     return;
83   }
84   if (-d $_ && ($_ =~ /RCS$/ || $_ =~ /CVS$/ || $_ =~ /SCCS$/)) {
85     print qq/Pruning "$File::Find::name"\n/  if $debug;
86     $File::Find::prune = 1;
87     return;
88   }
89   if (-d $_ || !/\.in(?:\.dist)?$/o) {
90     print qq/Ignoring "$File::Find::name"\n/  if $debug;
91     return;
92   }
93   if ($done{$File::Find::name}) {
94     print qq/Skipping "$File::Find::name", already processed.\n/
95         if $debug;
96     return;
97   }
98
99   my $file = $_;
100   print qq/Checking "$File::Find::name"...\n/  if $debug;
101   if ($file =~ s/\.dist$//) {
102     if (!$clean) {
103       if (! -e $file) {
104         run_prg('/bin/cp', $_, $file);
105         run_prg('/bin/chmod', 'u+w', $file);
106       }
107     }
108     $done{$File::Find::name} = 1;
109     $done{"$File::Find::dir/$file"} = 1;
110   }
111
112   my $file_out = $file;
113   $file_out =~ s/\.in$//;
114
115   if ($clean) {
116     run_prg('/bin/rm', $file_out)  if (-e $file_out);
117     run_prg('/bin/rm', $file)      if ($distclean && (-e $file) &&
118                                        (-e "$file.dist"));
119     return;
120   }
121
122   print qq|Processing "$File::Find::dir/$file"\n|  if $verbose;
123   if (!$noact) {
124     local(*IN, *OUT);
125     open(IN, $file) ||
126         die qq|ERROR: Unable to open "$File::Find::dir/$file": $!\n|;
127     open(OUT, ">$file_out") ||
128         die qq|ERROR: Unable to create "$File::Find::dir/$file_out": $!\n|;
129
130     my($line);
131     while (defined($line = <IN>)) {
132       $line =~ s/\@\@([^@]*)\@\@/$config->{$1}/g;
133       print OUT $line;
134     }
135     close(IN);
136     close(OUT);
137     if (-x $file) {
138       run_prg('/bin/chmod', 'a+x,go-w', $file_out);
139     }
140   }
141 }
142
143 if (!@ARGV) {
144   my $home = $config->{'SW_ROOT'};
145      $home = "$Dir/.."  unless $home;
146   push(@ARGV, $home);
147
148   my($dir);
149   foreach $dir ($config->{'HTML_DIR'},
150                 $config->{'CGI_DIR'},
151                 $config->{'MBOX_DIR'},
152                 $config->{'INFO_DIR'},
153                 $config->{'MKNMZ_TMPL_DIR'}) {
154
155     next  unless $dir =~ /\S/;
156     if (! -e $dir) {
157       warn qq/Warning: "$dir" does not exist\n/;
158       next;
159     }
160     $dir =~ s/\/+$//;
161     if ($dir !~ /^\Q$home\E\//o) {
162       push(@ARGV, $dir);
163     }
164   }
165 }
166
167 find(\&wanted, @ARGV);
168
169 ##--------------------------------------------------------------------------##
170 __END__
171
172 =head1 NAME
173
174 apply-config - Process input template files based upon configuration settings.
175
176 =head1 SYNOPSIS
177
178   apply-config [options] [dir ...]
179
180 =head1 DESCRIPTION
181
182 This program processes input template files and expands variables
183 referenced to values specified in C<E<lt>mharc-rootE<gt>/lib/config.sh>.
184
185 Template files are designated by the C<.in> filename extentions.  For a
186 given file, if C<I<file>.in.dist> exists and C<I<file>.in> does not,
187 C<I<file>.in.dist> will be copied to C<I<file>.in> before processing.
188
189 Variable references in template files are denoted as follows:
190
191   @@VARIABLE_NAME@@
192
193 If the specified variable name is defined, the reference will be
194 replaced with the empty string.
195
196 =head1 OPTIONS
197
198 Any non-option arguments are treated as directories to recursively
199 scan for template files.  If no directories are specified, then
200 C<$SW_ROOT> is used as defined in C<E<lt>mharc-rootE<gt>/lib/config.sh>.
201
202 =over
203
204 =item -clean
205
206 Remove all files that have a C<.in> version.  This option is useful
207 to clean up all files generated from templates.
208
209 =item -distclean
210
211 Remove all files that have a C<.in> version and remove all C<.in>
212 files that have a C<.in.dist> version.  This option is useful to
213 clean up all files for generating a distribution bundle.
214
215 B<WARNING:> Use this option with care since it will delete all
216 customized versions of C<.in> templates.  This option is mainly
217 for use by mharc developers.
218
219 =item -debug
220
221 Print out alot of information on what is going on.  This options
222 prints out more information than C<-verbose>.
223
224 =item -n
225
226 Just echo what would be done, but do not do it.
227
228 =item -verbose
229
230 Echo out status on any operation that modifies files.
231
232 =back
233
234 =head1 FILES
235
236 =over
237
238 =item C<E<lt>mharc-rootE<gt>/lib/config.sh>
239
240 Configuration file defining variables values.
241
242 =back
243
244 =head1 VERSION
245
246 C<$Id: apply-config,v 1.15 2002/10/17 03:14:31 ehood Exp $>
247
248 =head1 AUTHOR
249
250 Earl Hood, earl@earlhood.com
251
252 This program is part of the mharc archiving system and comes with
253 ABSOLUTELY NO WARRANTY and may be copied only under the terms of
254 the GNU General Public License, which may be found in the mhArc
255 distribution.
256
257 =cut
258