#!/usr/bin/perl

BEGIN {
   push(@INC,"/scripts");
   push(@INC,"/usr/local/cpanel");
}

use Cpanel::Form;
use Sys::Hostname qw(hostname);
use POSIX;
use IPC::Open3;
require "regsrep.pl";
use strict;
use SafeFile;


my($hostname) = hostname();
my($sysname, $nodename, $release, $version, $machine) = POSIX::uname();

if ($sysname =~ /freebsd/i) { 
	print "FreeBSD cannot be supported due to lack of java support from Sun Microsystems.\n";
	exit();
}

my $javafile = "j2sdk-1_4_2_05-linux-i586.bin";
my $mirror = "http://mirrors.mix5.com";
my $jkfile = "jakarta-tomcat-connectors-jk-1.2-src-current.tar.gz";
my $nobodygid = (getgrnam('nobody'))[2];
my $tcpass = getranddata(12,0);
my $installdir = `pwd`;
chomp($installdir);
my $jsvcfile = "daemon-1.0.tar.gz";

if ( ! -e "/usr/local/jdk/bin" ) {
  chdir("/usr/local");
  $ENV{PATH}="/usr/local:$ENV{PATH}";
  if (! -e $javafile) {
	  system("wget","-O","$javafile","http://layer1.cpanel.net/buildapache/1/$javafile");
  }
  chmod(0700,$javafile);
  if (my $pid = fork()) {
	waitpid($pid,0);
  } else {
	open3(\*JF,\*RDR,">&STDERR","./$javafile");
	while(<RDR>) {
		print;
		if (/replace\s+/) { 
			print JF "A\n"; 
		} elsif (/above license terms/) {
			print JF "yes\n";
		}
	}
	close(RDR);
	close(JF);
	exit();
  }
	unlink("jdk");  
  symlink("j2sdk1.4.2_05","jdk");
  unlink("/usr/local/j2sdk-1_4_2_05-linux-i586.bin");
}

my $javapath = "/usr/local/jdk/bin/java";
my $tomcatfile = "jakarta-tomcat-5.0.28.tar.gz";
$ENV{JAVA_HOME}= "/usr/local/jdk";


print "Installing TomCat\n";
system("rm","-Rf","/usr/local/jakarta");
system("mkdir","/usr/local/jakarta");
chdir("/usr/local/jakarta");
system("wget","-O","$tomcatfile","http://layer1.cpanel.net/buildapache/1/$tomcatfile");
system("tar","-zxf","$tomcatfile");
system("ln","-s","/usr/local/jakarta/jakarta-tomcat-5.0.28","/usr/local/jakarta/tomcat");

chdir("/usr/src/");
system("wget","-O","${jkfile}","http://layer1.cpanel.net/buildapache/1/${jkfile}");
system("tar","-zxf","jakarta-tomcat-connectors-jk-1.2-src-current.tar.gz");
chdir("/usr/src/jakarta-tomcat-connectors-jk-1.2.6-src/jk/native");
system("./configure --with-apxs=/usr/local/apache/bin/apxs");
system("make");
chdir("/usr/src/jakarta-tomcat-connectors-jk-1.2.6-src/jk/native/apache-1.3");
system("/usr/local/apache/bin/apxs -i -a -n jk mod_jk.so");
system("libtool","--finish","/usr/local/apache/libexec");

system("cp","-f","/usr/src/jakarta-tomcat-connectors-jk-1.2.6-src/jk/conf/workers.properties","/usr/local/apache/conf/");
system("cp","-f","/usr/src/jakarta-tomcat-connectors-jk-1.2.6-src/jk/conf/workers2.properties","/usr/local/apache/conf/");

# workers.properties
print "Configuring workers.properties...";
regsrep("/usr/local/apache/conf/workers.properties","^[\s\t]*workers.tomcat_home=/var/tomcat3","workers.tomcat_home=/usr/local/jakarta/tomcat");
regsrep("/usr/local/apache/conf/workers.properties","^[\s\t]*workers.java_home=/opt/IBMJava2-13","workers.java_home=/usr/local/jdk/jre");
regsrep("/usr/local/apache/conf/workers.properties",
	'^[\s\t]*worker.inprocess.jvm_lib=.*jvm.dll',
	'#worker.inprocess.jvm_lib=\$(workers.java_home)\$(ps)jre\$(ps)bin\$(ps)classic\$(ps)jvm.dll');
regsrep("/usr/local/apache/conf/workers.properties",
	'^[\s\t]*#worker.inprocess.jvm_lib=.*libjvm.so',
	'worker.inprocess.jvm_lib=$(workers.java_home)$(ps)jre$(ps)lib$(ps)i386$(ps)classic$(ps)libjvm.so');
print "Done\n";

# workers2.properties
print "Configuring workers2.properties...";
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*\[logger\]','#[logger]');
regsrep("/usr/local/apache/conf/workers2.properties","^[\s\t]*level=DEBUG","#level=DEBUG");
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*\[lb:lb\]','#[lb:lb]');
regsrep("/usr/local/apache/conf/workers2.properties","^[\s\t]*info=Default load balancer.","#info=Default load balancer.");
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*\[lb:lb_1\]','#[lb:lb_1]');
regsrep("/usr/local/apache/conf/workers2.properties","^[\s\t]*info=A second load balancer.","#info=A second load balancer.");
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*\[channel.socket:localhost:8019\]','#[channel.socket:localhost:8019]');
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*info=A second tomcat instance.','#info=A second tomcat instance.');
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*tomcatId=localhost:8019','#tomcatId=localhost:8019');
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*lb_factor=1','#lb_factor=1');
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*group:lb:lb','#group:lb:lb');
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*group:lb:lb_1','#group:lb:lb_1');
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*\[channel.un:/opt/33/work/jk2.socket\]','#[channel.un:/opt/33/work/jk2.socket]');
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*info=A second channel connecting to localhost:8019 via unix socket','#info=A second channel connecting to localhost:8019 via unix socket');
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*\[channel.jni:jni\]','#\[channel.jni:jni\]');
regsrep("/usr/local/apache/conf/workers2.properties",'^[\s\t]*info=The jni channel, used if tomcat is started inprocess','#info=The jni channel, used if tomcat is started inprocess');
print "Done\n";


print "Configuring tomcat-user.xml...";
regsrep('/usr/local/jakarta/tomcat/conf/tomcat-users.xml','^[\s\t]*</tomcat-users>','  <user name="root"   password="' . "${tcpass}" . '" roles="admin,manager" />' . "\n" . '</tomcat-users>');
print "Done\n";

print "Installing jsvc...";
chdir("/usr/local/jakarta/tomcat/bin/");
system("tar","-zxf","jsvc.tar.gz");
chdir("/usr/local/jakarta/tomcat/bin/jsvc-src/");
system("chmod","+x","configure");
system("./configure");
system("make");
system("cp","jsvc","/usr/local/jakarta/tomcat/bin");
chdir("/usr/local");
print "Done\n";


print "Installing starttomcat and stoptomcat files...";
chdir("${installdir}/scripts");
system("cp","starttomcat","/usr/sbin");
system("cp","stoptomcat","/usr/sbin");
system("cp","jk.conf","/usr/local/apache/conf");
chmod("0700","/usr/sbin/starttomcat");
chmod("0700","/usr/sbin/stoptomcat");
chown("root:root","/usr/sbin/starttomcat");
chown("root:root","/usr/sbin/stoptomcat");
print "Done\n";

print "Adding TomCat user...";
nooutputsystem("useradd","tomcat","-g","${nobodygid}","-r");
print "Done\n";

print "Adding includes to httpd.conf...";
system("cp","${installdir}/scripts/jk.conf","/usr/local/apache/conf/");
addinclude();
print "Done\n";

print "Adding TomCat to chkserv.d...";
system("cp","-f","${installdir}/scripts/tomcat","/etc/chkserv.d");
system("/etc/init.d/chkservd","restart");
print "Done\n";

print "Setting up the web.xml...";
setupwebxml();
print "Done\n";

print "Setting up rc.local...";
my $rcl = '/etc/rc.d/rc.local';
if (! -e "/etc/rc.d/rc.local" && -e "/etc/rc.local") {
	$rcl = '/etc/rc.local';
}
my $rlock = SafeFile::safeopen(\*RCL,"+<",$rcl);
my @RCL=<RCL>;
if ((grep(/starttomcat/,@RCL))[0] eq "") {
	print RCL "/usr/sbin/starttomcat\n\n";
}
SafeFile::safeclose(\*RCL,$rlock);
print "Done\n";

print "Finishing Install...";
system("chown","-R","tomcat:nobody","/usr/local/jakarta");
system("rm","-rf","/usr/src/jakarta-tomcat-connectors-jk-1.2.6-src");
unlink("/usr/src/jakarta-tomcat-connectors-jk-1.2-src-current.tar.gz");
unlink("/usr/local/jakarta/${tomcatfile}");
symlink("/usr/local/jdk/lib/tools.jar","/usr/local/jakarta/tomcat/common/lib/tools.jar");
mkdir("/usr/local/jakarta/tomcat/samples",0755);
opendir(TESTS,"${installdir}/tests");
while(my $file = readdir(TESTS)) {
	next if ($file =~ /^\./);
	system("cp","-f","${installdir}/tests/${file}","/usr/local/jakarta/tomcat/samples");
}
closedir(TESTS);
print "Done\n";



print "Restarting httpd...";
doomedprocess("httpd");
sleep(3);
system("/scripts/restartsrv_httpd","restart");
print "Done\n";

print "Starting TomCat...";
system("/scripts/gentomcatlist");
sleep(8);
print "Done\n";

print "Install Complete\n";

print "The admin url is http://${hostname}:8080/\n";
print "The admin user is root\n";
print "The admin password is ${tcpass}\n";

sub addinclude {
   my $conflock = SafeFile::safeopen(\*HC,"+<","/usr/local/apache/conf/httpd.conf");
   my $line = 0;
   my $addmodule = 0;
   my (@HC);
   while(<HC>) {
      next if (/Include/ && /jk.conf/);
      $line++;
      if (/^[\s\t]*AddModule/) { $addmodule = $line; }
      push(@HC,$_);
   }
   seek(HC,0,0);
   my $line = 0;
   foreach(@HC) {
      $line++;
      if ($line == ($addmodule + 1)) {
         print HC "Include \"/usr/local/apache/conf/jk.conf\"\n\n";
      }
      print HC $_;
   }
   truncate(HC,tell(HC));
   SafeFile::safeclose(\*HC,$conflock);
}


sub setupwebxml {
 
my $smap .= <<EOM;
    <servlet-mapping>
        <servlet-name>httpservlet</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
                                                                                                                                                       
    <servlet-mapping>
        <servlet-name>httpservlets</servlet-name>
        <url-pattern>/servlets/*</url-pattern>
    </servlet-mapping>
EOM
 
my $s .= <<EOM;
   <servlet>
        <servlet-name>httpservlet</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
 
    <servlet>
        <servlet-name>httpservlets</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
EOM
 
   my $conflock = SafeFile::safeopen(\*HC,"+<","/usr/local/jakarta/tomcat/conf/web.xml");
   my $line = 0;
   my $incomment = 0;
   my $endsmapline = 0;
   my $endsline = 0;
   my (@HC);
   while(<HC>) {
      $line++;
        if (/[\s\t]*\<!/) { $incomment = 1; }
        if (/[\s\t]*[\-]+\>/) { $incomment = 0;  }
        if (!$incomment) {
              if (/^[\s\t]*\<\/servlet\-mapping\>/) { $endsmapline = $line; }
              if (/^[\s\t]*\<\/servlet\>/) { $endsline = $line; }
        }
        push(@HC,$_);
   }
   seek(HC,0,0);
   my $line = 0;
   foreach(@HC) {
      $line++;
      if ($line == ($endsmapline + 1)) {
         print HC "$smap\n";
      }
      if ($line == ($endsline + 1)) {
         print HC "$s\n";
      }
      print HC $_;
   }
   truncate(HC,tell(HC));
   SafeFile::safeclose(\*HC,$conflock);
}


                                                                                                                                                         
sub doomedprocess {
   my($process) = @_;
   nooutputsystem("/scripts/ckillall","-TERM",$process);
   nooutputsystem("killall","-TERM",$process);
   nooutputsystem("/scripts/ckillall","-9",$process);
   nooutputsystem("killall","-9",$process);
}
                                                                                                                                                         
sub nooutputsystem {
   my(@unsafecmd) = @_;
   my(@cmd);
   while ($unsafecmd[$#unsafecmd] eq "") { pop(@unsafecmd); }
   foreach(@unsafecmd) {
      my @cmds = split(/ /, $_);
      foreach(@cmds) { push(@cmd,$_); }
   }
   my $pid;
   if ($pid = fork()) {
#master
   } else {
      close(STDOUT);
      close(STDERR);
      close(STDIN);
      open(STDIN,"<","/dev/null");
      open(STDOUT,">","/dev/null");
      open(STDERR,">","/dev/null");
      exec(@cmd);
   }
   waitpid($pid,0);
}
                                                                                                                                                         
                                                                                                                                                         

