libreccm-legacy/tools-legacy/scripts/pkg/bin/configure.pl

501 lines
16 KiB
Perl
Executable File

#!/usr/bin/perl -wT
use strict;
use Cwd;
use File::Spec;
$ENV{PATH} = "/bin:/usr/bin";
delete $ENV{BASH_ENV};
if ($#ARGV != 0) {
print "syntax: configure.pl system.conf\n";
exit -1;
}
my $windows_environment = 0;
if ($^O eq 'MSWin32' || (defined $ENV{CCM_WINDOWS_MACHINE} && $ENV{CCM_WINDOWS_MACHINE} == "1")) {
$windows_environment = 1;
}
my $errors = 0;
my $app_home;
my $resin_home;
my $java_home;
my $runtime_home;
my %hosts;
my %srun;
my @srun;
my %http;
my %vars;
my $container;
my $webxml = "servlet23";
&parse_config($ARGV[0]);
&check_config();
exit -1 if $errors;
&generate_enterprise();
&generate_webxml();
system("rm -f $app_home/bin/* $app_home/conf/*");
my $host = `hostname`;
chomp $host;
if ($container eq 'resin') {
if (!exists $hosts{$host}) {
die "cannot find entry for $host in configuration file\n";
}
if ($hosts{$host}->{type} eq 'resin') {
&generate_run_resin($host);
&generate_resin_back($host);
} elsif (exists $hosts{'localhost'} && $hosts{'localhost'}->{type} eq 'resin') {
&generate_run_resin('localhost');
&generate_resin_back('localhost');
}
if ($hosts{$host}->{type} eq 'apache') {
&generate_resin_vhost($host);
&generate_resin_front($host);
} elsif (exists $hosts{'localhost'} && $hosts{'localhost'}->{type} eq 'apache') {
&generate_resin_front('localhost');
}
&generate_run($host);
} elsif ($container eq 'tomcat4') {
&generate_modjk();
&generate_workers();
&generate_tomcat_vhost();
&generate_tomcat4_server_xml();
if ($windows_environment) {
&generate_tomcat_service();
} else {
$hosts{$host}->{type} = 'tomcat4';
&generate_run($host);
&generate_run_tomcat();
}
}
exit 0;
sub parse_config {
my $config = shift;
print "Reading $config\n";
my $abs_path = File::Spec->rel2abs($config);
my $directory = (File::Spec->splitpath($abs_path))[1];
my $old_cwd = cwd();
$old_cwd =~ /^(.*)$/;
$old_cwd = $1;
chdir ($directory);
my $conf = "";
{
local $/;
$/ = undef;
open CONF, "<$config" or die "cannot open config file $config: $!";
$conf = <CONF>;
close CONF;
}
my $line = 0;
foreach (split $/, $conf) {
$line++;
chomp;
next if /^\s*$/;
next if /^\s*\#/;
if (/^\s*Include\s+\"(.+?)\"\s*$/) {
# include a config file
parse_config ($1);
next;
}
if (/^\s*servlet-container\s*=\s*(\S+)\s*$/) {
$container = $1;
} elsif (/^\s*servlet-webxml\s*=\s*(\S+)\s*$/) {
$webxml = $1;
} elsif (/^\s*apache-home\s*=\s*(\S+)\s*$/) {
warn "apache-home option is obsolete, please use include the resin-httpd-vhost.conf file in httpd.conf";
} elsif (/^\s*resin-home\s*=\s*(\S+)\s*$/) {
$resin_home = $1;
} elsif (/^\s*java-home\s*=\s*(\S+)\s*$/) {
$java_home = $1;
} elsif (/^\s*app-home\s*=\s*(\S+)\s*$/) {
$app_home = $1;
} elsif (/^\s*runtime-home\s*=\s*(\S+)\s*$/) {
$runtime_home = $1;
} elsif (/^\s*resin\s*=\s*(\S+)\s*$/) {
if (exists $hosts{$1}) {
die "duplicate entry for host $1 line $line\n";
}
$hosts{$1} = { type => "resin" };
} elsif (/^\s*tomcat\s*=\s*(\S+)\s*$/) {
if (exists $hosts{$1}) {
die "duplicate entry for host $1 line $line\n";
}
$hosts{$1} = { type => "tomcat" };
} elsif (/^\s*apache\s*=\s*(\S+)\s*$/) {
if (exists $hosts{$1}) {
die "duplicate entry for host $1 line $line\n";
}
$hosts{$1} = { type => "apache" };
} elsif (/^\s*srun\s*=\s*(\S+):(\d+)\s*$/) {
$srun{$1} = { port => $2, firewall => $1, connect => $2};
push @srun, $1;
} elsif (/^\s*srun\s*=\s*(\S+):(\d+)\s*,\s*(\S+):(\d+)\s*$/) {
$srun{$1} = { port => $2, firewall => $3, connect => $4};
push @srun, $1;
} elsif (/^\s*http\s*=\s*(\S+):(\d+)\s*$/) {
$http{$1} = $2;
} elsif (/^\s*((?:\w|-)+)\s*=\s*(.*?)\s*$/) {
$vars{$1} = $2;
} else {
die "malformed config option at line $line";
}
}
chdir ($old_cwd);
}
sub interpolate_file {
my $src = shift;
my $dest = shift;
my $vars = shift;
open SRC, "<$src" or die "cannot read file $src: $!";
open DEST, ">$dest" or die "cannot create file $dest: $!";
while (<SRC>) {
s/::((?:\w|-)+)::/exists $vars->{$1} ? $vars->{$1} : (exists $vars{$1} ? $vars{$1} : "::${1}::")/gex;
print DEST;
}
close SRC;
close DEST;
print "Wrote $dest\n";
}
sub check_config {
&check_value("servlet-container", $container);
&check_value('java-home', $java_home);
&check_value('app-home', $app_home);
&check_value('runtime-home', $runtime_home);
if (defined $container) {
if ($container eq 'resin') {
&check_value('resin-home', $resin_home);
} elsif ($container eq 'tomcat4') {
} else {
die "unknown servlet container $container\n";
}
}
if ( ($windows_environment) && ($container ne 'tomcat4') ) {
die "$container is not yet supported under Windows\n";
}
}
sub check_value {
my $option = shift;
my $value = shift;
$errors++ unless defined $value;
warn "$option not specified in config file\n" unless defined $value;
}
sub generate_enterprise {
&interpolate_file($app_home . "/dist/WEB-INF/resources/enterprise.init.in",
$app_home . "/dist/WEB-INF/resources/enterprise.init");
}
sub generate_webxml {
&interpolate_file($app_home . "/dist/WEB-INF/web.xml.$webxml",
$app_home . "/dist/WEB-INF/web.xml");
&insert_webxml_includes($app_home . "/dist/WEB-INF/web.xml");
}
sub insert_webxml_includes {
my $webxml = shift;
my $abs_path = File::Spec->rel2abs($webxml);
my $directory = (File::Spec->splitpath($abs_path))[1];
my $servdec = "";
my $servmap = "";
local $/;
$/ = undef;
opendir(DIR, $directory) || die "can't opendir $directory: $!";
my @files = grep { /.*\.servlet-declarations\.xml$/ && -f "$directory/$_" } readdir(DIR);
foreach (@files) {
open(FILE, "< $directory/$_") || die "can't open file $directory/$_: $!";
$servdec .= <FILE> . "\n";
close(FILE);
}
rewinddir DIR;
@files = grep { /.*\.servlet-mappings\.xml$/ && -f "$directory/$_" } readdir(DIR);
foreach (@files) {
open(FILE, "< $directory/$_") || die "can't open file $directory/$_: $!";
$servmap .= <FILE> . "\n";
close(FILE);
}
closedir DIR;
open(FILE, "< $webxml") || die "can't open file $webxml: $!";
my $webxml_contents = <FILE>;
close FILE;
my $servdec_match_regexp = '<!-- /ADDITIONAL SERVLET DECLARATIONS -->';
my $servmap_match_regexp = '<!-- /ADDITIONAL SERVLET MAPPINGS -->';
my $servdec_replace_regexp = "$servdec<!-- /ADDITIONAL SERVLET DECLARATIONS -->";
my $servmap_replace_regexp = "$servmap<!-- /ADDITIONAL SERVLET MAPPINGS -->";
$webxml_contents =~ s/$servmap_match_regexp/$servmap_replace_regexp/s;
$webxml_contents =~ s/$servdec_match_regexp/$servdec_replace_regexp/s;
open(FILE, "> $webxml") || die "can't open file $webxml: $!";
print FILE $webxml_contents;
close FILE;
}
sub generate_run {
my $host = shift;
my $disable_resin = ($hosts{$host}->{type} eq 'resin' ||
(exists $hosts{'localhost'} && $hosts{'localhost'}->{type} eq 'resin')) ? "" : "#";
my $disable_apache = ($hosts{$host}->{type} eq 'resin' ||
(exists $hosts{'localhost'} && $hosts{'localhost'}->{type} eq 'resin')) ? "#" : "";
&interpolate_file($runtime_home . "/bin/$container/run.sh.in",
$app_home . "/bin/run.sh",
{
'app-home' => $app_home,
'disable-apache' => $disable_apache,
'disable-resin' => $disable_resin,
});
chmod 0755, $app_home . "/bin/run.sh";
}
sub generate_run_tomcat {
my $host = shift;
&interpolate_file($runtime_home . "/bin/tomcat4/run-tomcat.sh.in",
$app_home . "/bin/run-tomcat.sh",
{
'java-home' => $java_home,
'app-home' => $app_home,
});
chmod 0755, $app_home . "/bin/run-tomcat.sh";
}
sub generate_run_resin {
my $host = shift;
&interpolate_file($runtime_home . "/bin/resin/run-resin.sh.in",
$app_home . "/bin/run-resin.sh",
{
'resin-home' => $resin_home,
'resin-conf' => "$app_home/conf/resin.conf",
'java-home' => $java_home,
'app-home' => $app_home,
});
chmod 0755, $app_home . "/bin/run-resin.sh";
}
sub generate_resin_front {
my $host = shift;
&interpolate_file($runtime_home . "/conf/$container/resin-front.conf.in",
$app_home . "/conf/resin-apache.conf",
{
'srun-begin1' => $#srun > -1 ? "" : "<!--",
'srun-host1' => $#srun > -1 ? $srun{$srun[0]}->{firewall} : "",
'srun-port1' => $#srun > -1 ? $srun{$srun[0]}->{connect} : "",
'srun-end1' => $#srun > -1 ? "" : "-->",
'srun-begin2' => $#srun > 0 ? "" : "<!--",
'srun-host2' => $#srun > 0 ? $srun{$srun[1]}->{firewall} : "",
'srun-port2' => $#srun > 0 ? $srun{$srun[1]}->{connect} : "",
'srun-end2' => $#srun > 0 ? "" : "-->",
'srun-begin3' => $#srun > 1 ? "" : "<!--",
'srun-host3' => $#srun > 1 ? $srun{$srun[2]}->{firewall} : "",
'srun-port3' => $#srun > 1 ? $srun{$srun[2]}->{connect} : "",
'srun-end3' => $#srun > 1 ? "" : "-->",
'srun-begin4' => $#srun > 2 ? "" : "<!--",
'srun-host4' => $#srun > 2 ? $srun{$srun[3]}->{firewall} : "",
'srun-port4' => $#srun > 2 ? $srun{$srun[3]}->{connect} : "",
'srun-end4' => $#srun > 2 ? "" : "-->",
'srun-begin5' => $#srun > 3 ? "" : "<!--",
'srun-host5' => $#srun > 3 ? $srun{$srun[4]}->{firewall} : "",
'srun-port5' => $#srun > 3 ? $srun{$srun[4]}->{connect} : "",
'srun-end5' => $#srun > 3 ? "" : "-->",
});
}
sub generate_resin_back {
my $host = shift;
&interpolate_file($runtime_home . "/conf/$container/resin-back.conf.in",
$app_home . "/conf/resin.conf",
{
'webapp-dir' => "$app_home/dist",
'threads' => $vars{'db-pool'} - 5,
'keepalive' => $vars{'db-pool'} - 6,
'http-begin' => exists $http{$host} ? "" : "<!--",
'http-end' => exists $http{$host} ? "" : "-->",
'http-port' => exists $http{$host} ? $http{$host} : 80,
'srun-begin' => exists $srun{$host} ? "" : "<!--",
'srun-end' => exists $srun{$host} ? "" : "-->",
'srun-host' => $host,
'srun-port' => exists $srun{$host} ? $srun{$host}->{port} : 6802,
});
}
sub generate_modjk {
&interpolate_file($runtime_home . "/conf/$container/mod_jk.conf.in",
$app_home . "/conf/mod_jk.conf", {
'app-home' => $app_home,
'webapp-dir' => "$app_home/dist",
});
}
sub generate_tomcat_apps {
&interpolate_file($runtime_home . "/conf/$container/tomcat-apps.xml.in",
$vars{'tomcat-conf-home'} . "/apps-acsj.xml", {
'app-home' => $app_home,
'webapp-dir' => "$app_home/dist",
});
}
sub generate_tomcat_env {
my $source_file;
my $target_file;
if ($windows_environment) {
$source_file = "tomcat-env.cmd.in";
$target_file = "tomcat-env.cmd";
} else {
$source_file = "tomcat-env.in";
$target_file = "tomcat-env";
}
&interpolate_file($runtime_home . "/conf/$container/$source_file",
$app_home . "/conf/$target_file", {
'app-home' => $app_home,
'webapp-dir' => "$app_home/dist",
'java-home' => "$java_home",
});
}
sub generate_tomcat_service {
&interpolate_file($runtime_home . "/bin/$container/tomcat-service-install.cmd.in",
$app_home . "/bin/tomcat-service-install.cmd", {
'app-home' => $app_home,
'webapp-dir' => "$app_home/dist",
'java-home' => "$java_home",
});
&interpolate_file($runtime_home . "/bin/$container/tomcat-service-uninstall.cmd.in",
$app_home . "/bin/tomcat-service-uninstall.cmd", {
'app-home' => $app_home,
'webapp-dir' => "$app_home/dist",
'java-home' => "$java_home",
});
}
sub generate_tomcat4_server_xml {
# This procedure only applies to Tomcat 4
return unless ($container eq 'tomcat4');
&interpolate_file($runtime_home . "/conf/$container/server.xml.in",
$app_home . "/conf/server.xml", {
'app-home' => $app_home,
'webapp-dir' => "$app_home/dist",
'java-home' => "$java_home",
});
&interpolate_file($runtime_home . "/conf/$container/web.xml.in",
$app_home . "/conf/web.xml", {
'app-home' => $app_home,
'webapp-dir' => "$app_home/dist",
'java-home' => "$java_home",
});
&interpolate_file($runtime_home . "/conf/$container/tomcat-users.xml.in",
$app_home . "/conf/tomcat-users.xml", {
'app-home' => $app_home,
'webapp-dir' => "$app_home/dist",
'java-home' => "$java_home",
});
}
sub generate_workers {
my $workers_file;
if ($windows_environment) {
$workers_file = 'workers.properties-win32.in';
} else {
$workers_file = 'workers.properties.in';
}
&interpolate_file($runtime_home . "/conf/$container/$workers_file",
$app_home . "/conf/workers.properties", {
'app-home' => $app_home,
'webapp-dir' => "$app_home/dist",
});
}
sub generate_tomcat_vhost {
&interpolate_file($runtime_home . "/conf/$container/httpd-tomcat-vhost.conf.in",
$app_home . "/conf/httpd-tomcat-vhost.conf", {
'app-home' => $app_home,
'webapp-dir' => "$app_home/dist",
});
}
sub generate_resin_vhost {
my $host = shift;
&interpolate_file($runtime_home . "/conf/$container/httpd-resin-vhost.conf.in",
$app_home . "/conf/httpd-resin-vhost.conf", {
'app-home' => $app_home,
'port' => $http{$host},
'webapp-dir' => "$app_home/dist",
'resin-module' => "$resin_home/modules/apache/mod_caucho.so",
'resin-conf' => "$app_home/conf/resin-apache.conf",
});
}
# End of file