#!/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 = ; 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 () { 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 .= . "\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 .= . "\n"; close(FILE); } closedir DIR; open(FILE, "< $webxml") || die "can't open file $webxml: $!"; my $webxml_contents = ; close FILE; my $servdec_match_regexp = ''; my $servmap_match_regexp = ''; my $servdec_replace_regexp = "$servdec"; my $servmap_replace_regexp = "$servmap"; $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-begin2' => $#srun > 0 ? "" : "", 'srun-begin3' => $#srun > 1 ? "" : "", 'srun-begin4' => $#srun > 2 ? "" : "", 'srun-begin5' => $#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-port' => exists $http{$host} ? $http{$host} : 80, 'srun-begin' => 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