-
Notifications
You must be signed in to change notification settings - Fork 51
/
conf.pl
269 lines (222 loc) · 9.48 KB
/
conf.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
#!/usr/bin/perl -w
=head1 NAME
conf.pl - installation script to write configuration files in conf/
=head1 VERSION
$LastChangedRevision$
=head1 DATE
$LastChangedDate$
=head1 DESCRIPTION
This script is called by "make install" to write out configuration
files based on information gathered by "make". Rather than using
template files, conf.pl uses the sample configuration files directly.
=head1 AUTHOR
Sam Tregar <stregar@about-inc.com>
=head1 SEE ALSO
L<Bric::Admin>
=cut
use strict;
use FindBin;
use lib "$FindBin::Bin/lib";
use Bric::Inst qw(:all);
use File::Spec::Functions qw(:ALL);
use File::Path qw(mkpath);
use File::Copy qw(copy);
use Time::HiRes qw(time);
use Digest::MD5 qw(md5_base64);
use Data::Dumper;
# read in user config settings
our $CONFIG;
do "./config.db" or die "Failed to read config.db : $!";
our $AP;
do "./apache.db" or die "Failed to read apache.db : $!";
our $PG;
do "./postgres.db" or die "Failed to read postgres.db : $!";
our $REQ;
do "./required.db" or die "Failed to read required.db : $!";
# check if we're upgrading
our $UPGRADE;
$UPGRADE = 1 if $ARGV[0] and $ARGV[0] eq 'UPGRADE';
# get version from Makefile
our $VERSION = $ARGV[1];
print "\n\n==> Creating Bricolage Conf Files <==\n\n";
mkpath 'bconf';
create_bricolage_conf() unless $UPGRADE;
create_httpd_conf() unless $UPGRADE;
create_install_db();
print "\n\n==> Finished Creating Bricolage Conf Files <==\n\n";
exit 0;
# create conf/bricolage.conf
sub create_bricolage_conf {
# read in default config file
my $file = catfile 'conf', 'bricolage.conf';
print "Reading $file...\n";
open CONF, $file or die "Cannot read $file: $!";
my $conf = join '', <CONF>;
close CONF;
# lots of regexes to come
study($conf);
# simple settings
set_bric_conf_var(\$conf, APACHE_BIN => $REQ->{APACHE_EXE});
set_bric_conf_var(\$conf, LISTEN_PORT => $AP->{port});
set_bric_conf_var(\$conf, SSL_PORT => $AP->{ssl_port});
set_bric_conf_var(\$conf, SSL_ENABLE => $AP->{ssl} ? $AP->{ssl} : 'Off');
set_bric_conf_var(\$conf, SSL_CERTIFICATE_FILE => $AP->{ssl_cert});
set_bric_conf_var(\$conf, SSL_CERTIFICATE_KEY_FILE => $AP->{ssl_key});
set_bric_conf_var(\$conf, SYS_USER => $AP->{user});
set_bric_conf_var(\$conf, SYS_GROUP => $AP->{group});
set_bric_conf_var(\$conf, DB_NAME => $PG->{db_name});
set_bric_conf_var(\$conf, DBI_USER => $PG->{sys_user});
set_bric_conf_var(\$conf, DBI_PASS => $PG->{sys_pass});
set_bric_conf_var(\$conf, DB_HOST => $PG->{host_name});
set_bric_conf_var(\$conf, DB_PORT => $PG->{host_port});
# path settings
my $root = $CONFIG->{BRICOLAGE_ROOT};
set_bric_conf_var(\$conf, APACHE_CONF => catfile($root, "conf", "httpd.conf"));
set_bric_conf_var(\$conf, MASON_COMP_ROOT => $CONFIG->{MASON_COMP_ROOT});
set_bric_conf_var(\$conf, MASON_DATA_ROOT => $CONFIG->{MASON_DATA_ROOT});
set_bric_conf_var(\$conf, BURN_ROOT => catdir($CONFIG->{MASON_DATA_ROOT}, "burn"));
set_bric_conf_var(\$conf, TEMP_DIR => $CONFIG->{TEMP_DIR});
# setup auth secret to some fairly random string
srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
set_bric_conf_var(\$conf, AUTH_SECRET => md5_base64(rand()) .
md5_base64(rand()) .
md5_base64(rand()) .
md5_base64(rand()) .
md5_base64(rand()));
# write out new conf.
$file = catfile 'bconf', 'bricolage.conf';
print "Writing $file...\n";
open CONF, ">$file" or die "Cannot open $file: $!";
print CONF $conf;
close CONF;
copy $file, "$file.def";
}
# changes the setting of a single conf var in $$conf
sub set_bric_conf_var {
my ($conf, $var, $val) = @_;
return unless defined $val and $val ne '';
unless ($$conf =~ s/^(\s*)#?(\s*$var\s+=\s*).*$/$1$2$val/mi) {
hard_fail("Unable to set bricolage.conf variable $var to \"$val\".");
}
}
# create conf/httpd.conf
sub create_httpd_conf {
# read in default httpd.conf file
my $file = catfile 'conf', 'httpd.conf';
print "Reading $file...\n";
open HTTPD, $file or die "Cannot read $file: $!";
my $httpd = join '',<HTTPD>;
close HTTPD;
# lots of regexes to come
study($httpd);
# simple settings
my $listen80 = set_httpd_var(\$httpd,
Listen => $AP->{port});
set_httpd_var(\$httpd, User => $AP->{user});
set_httpd_var(\$httpd, Group => $AP->{group});
set_httpd_var(\$httpd, ServerName => $AP->{server_name});
# paths
my $root = $CONFIG->{BRICOLAGE_ROOT};
my $ap_root = $AP->{HTTPD_ROOT};
my $log = $CONFIG->{LOG_DIR};
set_httpd_var(\$httpd, ServerRoot => $ap_root);
set_httpd_var(\$httpd, TypesConfig => $AP->{types_config} ||
catfile($ap_root, "conf", "mime.types"));
set_httpd_var(\$httpd, DocumentRoot => $CONFIG->{MASON_COMP_ROOT});
set_httpd_var(\$httpd, PidFile => $CONFIG->{PID_FILE});
set_httpd_var(\$httpd, ErrorLog => catfile($log, "error_log"));
set_httpd_var(\$httpd, CustomLog => catfile($log,
"access_log combined"));
# httpsd must listen on another port
if ($AP->{ssl}) {
my $rm = '_random_marker_123454321_' . $$;
$httpd =~ s/$listen80/$rm/;
set_httpd_var(\$httpd, Listen => $AP->{ssl_port}, 'set all of them');
$httpd =~ s/$rm/$listen80/;
}
# take a stab at SSL settings if ssl is on. This stuff is
# probably wrong and probably needs to be probed for explicitly
# in apache.pl.
if ($AP->{ssl} =~ /apache_ssl/) {
my $gc_loc = $AP->{SUEXEC_BIN} || '';
$gc_loc =~ s/suexec/gcache/;
set_httpd_var(\$httpd, SSLCacheServerPath => catfile($gc_loc));
set_httpd_var(\$httpd, SSLCacheServerPort => catfile($log, "gcache_port"));
} elsif ($AP->{ssl} =~ /mod_ssl/) {
set_httpd_var(\$httpd, SSLSessionCache => "dbm:" .
catfile($log, "ssl_scache"));
set_httpd_var(\$httpd, SSLMutex => "file:" .
catfile($log, "ssl_mutex"));
set_httpd_var(\$httpd, SSLLog => catfile($log,
"ssl_engine_log"));
}
# DSO Apache's need that sweet DSO spike in the vein just to get
# up in the morning
if ($AP->{dso}) {
my $dso_section = "# Load DSOs\n\n";
foreach my $mod (qw(perl log_config config_log mime alias ssl apache_ssl gzip)) {
# static modules need no load
next if exists $AP->{static_modules}{"mod_$mod"};
next if $mod eq 'apache_ssl' && exists $AP->{static_modules}{apache_ssl};
if ($mod eq 'log_config'|| $mod eq 'config_log') {
# I want to kill whoever decided this was a good idea
if ($AP->{load_modules}{"${mod}_module"}) {
$dso_section .= "LoadModule \t config_log_module " .
$AP->{load_modules}{"${mod}_module"} . "\n" .
"AddModule \t mod_log_config.c\n\n";
}
} elsif ($mod eq 'gzip') {
# Load optional module mod_gzip
if ($AP->{load_modules}{"${mod}_module"}) {
$dso_section .= "LoadModule \t ${mod}_module " .
$AP->{load_modules}{"${mod}_module"} . "\n";
$dso_section .= "AddModule \t mod_$mod.c\n\n";
}
} elsif ($mod eq 'apache_ssl') {
next unless $AP->{ssl} =~ /apache_ssl/;
$dso_section .= "LoadModule \t ${mod}_module " .
$AP->{load_modules}{"${mod}_module"} . "\n";
$dso_section .= "AddModule \t apache_ssl.c\n\n";
} else {
next if $mod eq 'ssl' && $AP->{ssl} !~ /mod_ssl/;
$dso_section .= "LoadModule \t ${mod}_module " .
$AP->{load_modules}{"${mod}_module"} . "\n";
$dso_section .= "AddModule \t mod_$mod.c\n\n";
}
}
# put DSO loads at the top. This could be prettier.
$httpd = $dso_section . "\n\n" . $httpd;
}
# write out new httpd.conf.
$file = catfile 'bconf', 'httpd.conf';
print "Writing $file...\n";
open HTTPD, ">$file" or die "Cannot open $file: $!";
print HTTPD $httpd;
close HTTPD;
copy $file, "$file.def";
}
# changes the setting of multiple or single httpd vars in $$httpd
sub set_httpd_var {
my ($httpd, $var, $val, $global) = @_;
if ($global && $$httpd =~ s/^(\s*$var\s+).*$/$1$val/gmi) {
return "$var $val";
} elsif ($$httpd =~ s/^(\s*$var\s+).*$/$1$val/mi) {
return $1.$val;
} else {
hard_fail("Unable to set httpd.conf variable $var to \"$val\".");
}
}
# create the install.db file used by "make upgrade"
sub create_install_db {
# write out install.db.
my $file = catfile 'bconf', 'install.db';
print "Writing $file...\n";
open DB, ">$file" or die "Cannot open $file: $!";
print DB Data::Dumper->Dump([{ CONFIG => $CONFIG,
AP => $AP,
PG => $PG,
REQ => $REQ,
VERSION => $VERSION }],
['INSTALL']);
close DB;
}