Commit | Line | Data |
---|---|---|
2ea8f66b IK |
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 |