#!/usr/bin/perl

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

use Cpanel::Form;
use Carp qw ( croak );
use strict;
use POSIX;
use IPC::Open3;

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 $systemtype = "i586";
if ( $machine eq "x86_64" ) {
	$systemtype = "amd64";
}

my $javaversion = "1_5_0_05";
my $javafile = "jdk-${javaversion}-linux-${systemtype}.bin";
my $mirror = "http://layer1.cpanel.net/buildapache/1/";


my $linkedname = $javaversion;
$linkedname =~ s/\-//g;
$linkedname =~ s/\_{1}/\./;
$linkedname =~ s/\_{1}/\./;
my $install = 0;

if ( ! -e "/usr/local/jdk/bin/java" ) {
  $install = 1;
} else {
	my $version = `/usr/local/jdk/bin/java -version 2>&1`;
	if ( $version =~ /"([^"]+)/) {
		if ( $1 ne $linkedname ) {
			$install = 1;
		}
	}
}


if ( $install == 1 ) {
	print "Java is not currently installed or is the wrong version, now (re)installing java on this system\n";
	chdir("/usr/local");
	$ENV{PATH}="/usr/local:$ENV{PATH}";
	downloadfile($javafile,$mirror,1);
	
	chmod(0700,$javafile);
	if (my $pid = fork()) {
	      waitpid($pid,0);
	} else {
	      open3(\*JF,\*RDR,\*RDR,"./$javafile"); # Dan's Fix!
	      while(<RDR>) {
		      print;
		      if (/replace\s+/) { 
			      print JF "A\n";
		      } elsif (/above license terms/) {
			      print JF "yes\n";
		      }
	      }
	      close(RDR);
	      close(JF);
	      exit();
	}
	if ( -e '/usr/local/jdk' ) {
		if ( -l '/usr/local/jdk' ) {
			unlink("jdk")
				|| croak "Cannot unlink /usr/local/jdk";
		} else {
			my $random = getranddata(12,0);
			print "ERROR: /usr/local/jdk was found and is not a symlink!\n";
			print "Moving /usr/local/jdk to /usr/local/jdk." . $random . "\n";
			system('mv','/usr/local/jdk','/usr/local/jdk.' . $random)
				|| croak "Cannot move /usr/local/jdk";
		}
	}
			
	symlink("jdk${linkedname}","jdk");
	unlink("/usr/local/${javafile}");
} else {
	print "Java is currently up to date\n";
}

sub downloadfile {
	my $file = shift;
	my $mirror = shift;
	my $md5check = shift;
	my $md5checksum;
	if ( $md5check == 1 ) {
		my $md5size = 0;
		my $md5try = 1;
		while( $md5size == 0 ) {
			if ( $md5try == 5 ) {
				croak "ERROR: Attempted to download md5sum check file 5 times and failed! Exiting now!\n";
			} 
			elsif ( $md5try == 1 ) {
				print "Downloading md5sum check file...\n";
			}
			else {
				print "\nDownload failed for md5sum check file, trying attempt # " . ($md5try + 1) . "\n";
			}
			system("wget","-q","-O",$file . ".md5",$mirror . $file . ".md5");
			if ( -e "$file.md5" ) {
				$md5size = (stat(_))[7];
			}
			$md5try++;
		}
		open(MD5,$file . ".md5");
		while (<MD5>) {
			$md5checksum = $_;
			chomp($md5checksum);
			unlink("/usr/local/" . $javafile . ".md5");
			if ( $md5checksum eq "" ) {
				croak "ERROR: Unable to determine the md5 checksum value for $file";
			}
		}
		close(MD5);
	}
	my $size = 0;
	my $try = 1;
	while ( $size == 0 ) {
		if ( $try == 5 ) {
			croak "ERROR: Attempted to download $file 5 times and failed! Exiting now!\n";
		} 
		elsif ( $try == 1 ) {
			print "Downloading $file...\n";
		}
		else {
			print "\nDownload failed, trying attempt # " . ($try + 1) . "\n";
		}
		system("wget","-q","-O",$file,$mirror . $file);
		if ( -e $file ) {
			$size = (stat(_))[7];
		}
		$try++;
	}
	if ( $md5check == 1 ) {
		my $realmd5sum = `md5sum $file`;
		chomp($realmd5sum);
		if ( $realmd5sum ne $md5checksum ) {
			croak "ERROR: md5sum mismatch (actual: $realmd5sum) (expected: $md5checksum)\n";
		}
	}
}	
		