#!/usr/bin/perl -w
use strict ;

print "SUMMARY OF UPDATE ACTIONS\n" ;
print "  Updating to JDK 1.5.0_05 (from JDK 1.5.0_04)\n" ;
print "  Installing NetBeans 5.0 beta and Milestone 9 profiler\n\n" ;

print "\nUntaring JDK 1.5.0_05 and NetBeans 5.0 into /opt\n" ;
my $updateTARfile
    = '/candler/software/RH004install/Linux/Update/updt-10012005.tar.gz' ;
system '/bin/tar', '--get', '--gzip', '--directory', '/opt'
	, '--file', $updateTARfile ;
if ($? != 0) {
    print STDERR "tar failed -- bailing out\n" ;
    exit 1 ;
}

print "\nUpdating alternatives (and /usr/local/bin) for Java\n" ;
my $javaVersion = '1.5.0_05';
my $javaPriority = 15005 ;
my $javaBinDir = "/opt/jdk${javaVersion}/bin" ;
my @altCommand = ( '/usr/sbin/alternatives',
		   '--altdir', '/usr/local/etc/alternatives',
		   '--admindir', '/usr/local/lib/alternatives',
		   '--install', '/usr/local/bin/java', 'java',
		   "${javaBinDir}/java", $javaPriority ) ;

# This is the messy part....
if (!opendir (BINDIR, $javaBinDir)) {
  printf STDERR "Unable to read directory ${javaBinDir}\n" ;
  exit 1 ;
}
while (my $nextfile = readdir(BINDIR)) {
  if (($nextfile ne '.') && ($nextfile ne '..')
      && ($nextfile ne 'java') && ($nextfile ne 'java-rmi.cgi')) {
      push @altCommand,
           ('--slave', "/usr/local/bin/${nextfile}",
	    $nextfile, "${javaBinDir}/${nextfile}") ;
  }
}
closedir BINDIR ;
system @altCommand ;
if ($? != 0) {
    print STDERR "alternatives failed -- bailing out\n" ;
    exit 1 ;
}

# Not sure why this is necessary....
# This should *not* be required in future updates
if (-l '/usr/lib/netscape/plugins/libjavaplugin_oji.so') {
    print "\nRemoving /usr/lib/netscape/plugins/libjavaplugin_oji.so\n" ;
    unlink '/usr/lib/netscape/plugins/libjavaplugin_oji.so' ;
}

print "\nUpdating browser Java plugin\n" ;
my $oldJavaVersion = '1.5.0_04' ;
my $mozJavaPlugin  = '/usr/lib/mozilla/plugins/libjavaplugin_oji.so' ;
my $jdkJavaPlugin 
    = "/opt/jdk${javaVersion}/jre/plugin/i386/ns7/libjavaplugin_oji.so" ;
if (-l $mozJavaPlugin) {
    unlink $mozJavaPlugin ;
} else {
    print STDERR "Missing old Java Plugin: ${mozJavaPlugin}\n" ;
}
if (! symlink($jdkJavaPlugin, $mozJavaPlugin)) {
    print STDERR "Unable to create symbolic link\n" ;
    print STDERR " from ${mozJavaPlugin}\n" ;
    print STDERR " to ${jdkJavaPlugin}\n" ;
}

print "\nCreating symbolic link /usr/local/bin/netbeans5\n" ;
if (! symlink('/opt/netbeans-5.0beta/bin/netbeans',
	      '/usr/local/bin/netbeans5')) {
    print STDERR "Unable to create symbolic line for netbeans5.0\n" ;
}

print "\nUpdating NetBeans configuration file\n" ;
my $netbeansConf = '/opt/netbeans-4.1/etc/netbeans.conf' ;
my $netbeansConfSave = "${netbeansConf}-jdk${oldJavaVersion}" ;
if (-e $netbeansConfSave) {
    print STDERR "JDK ${oldJavaVersion} configuration already saved?\n" ;
} elsif (! link($netbeansConf, $netbeansConfSave)) {
    print STDERR "Unable to create link to ${netbeansConf}\n" ;
} elsif (! unlink($netbeansConf)) {
    print STDERR "Unable to unlink ${netbeansConf}\n" ;
} elsif ( !open(OLDCNFG, $netbeansConfSave)) {
    print STDERR "Unable to open ${netbeansConfSave} for reading\n" ;
} elsif ( !open(NEWCNFG, '>'. $netbeansConf)) {
    print STDERR "Unable to open ${netbeansConf} for writing\n" ;
} else {
    while (my $line = <OLDCNFG>) {
        $line =~ s/${oldJavaVersion}/${javaVersion}/g ;
        print NEWCNFG $line ;
    }
    close OLDCNFG ;
    close NEWCNFG ;
}

print "\nRemove the old alternatives for JDK ${oldJavaVersion}\n" ;
system '/usr/sbin/alternatives',
    '--altdir',   '/usr/local/etc/alternatives',
    '--admindir', '/usr/local/lib/alternatives',
    '--remove',   'java',  "/opt/jdk${oldJavaVersion}/bin/java";
if ($? != 0) {
    print STDERR "Removing alternatives failed\n" ;
}

### Cleaning up ... This should *not* be required in future updates
print "\nCleaning up some really old alternatives -- ignore failures\n" ;
system '/usr/sbin/alternatives',
    '--altdir',   '/usr/local/etc/alternatives',
    '--admindir', '/usr/local/lib/alternatives',
    '--remove',   'java',  '/usr/java/jdk1.5.0_02/bin/java' ;
system '/usr/sbin/alternatives',
    '--altdir',   '/usr/local/etc/alternatives',
    '--admindir', '/usr/local/lib/alternatives',
    '--remove',   'java',  '/usr/java/jdk1.5.0_03/bin/java' ;
system '/usr/sbin/alternatives',
    '--altdir',   '/usr/local/etc/alternatives',
    '--admindir', '/usr/local/lib/alternatives',
    '--remove',   'netbeans',  '/opt/netbeans-4.0/bin/netbeans' ;

print "\nRemove directory /opt/jdk${oldJavaVersion}\n" ;
system '/bin/rm', '-r', '-f', "/opt/jdk${oldJavaVersion}" ;
if ($? != 0) {
    print STDERR "Removing /opt/jdk${oldJavaVersion} failed\n" ;
}
