#!/usr/athena/bin/perl
#
# update.pl -- upgrade a Redhat-Athena system from RPMS in some directory.
#   It will only upgrade packages which are already installed.
#   It also takes into account Athena-isms for things like login, sendmail.cf,
#   etc.
#
#   This program will also check the RedHat version and verify that
#   that we are updating from the proper set of RPMS.
#

# Matrix of known RedHat Versions
%rhversions = (
	       "release 4.2 (Biltmore)", "4.2",
#	       "release 5.1 (Manhattan)", "5.1",
	       "Red Hat Linux release 5.2 (Apollo)", "5.2",
	       );

$rhversfile = "/etc/redhat-release";
open (RHVERS, "<$rhversfile") || die "Cannot open $rhversfile";

$rhvers = <RHVERS>;
chop $rhvers;
close (RHVERS);

if ($rhversions{$rhvers}) {
    $rhversion = $rhversions{$rhvers};
} else {
    print "Unknown RedHat version: $rhvers\n";
    exit 1;
}

$rpmdir =
    "/afs/sipb.mit.edu/project/linux/redhat/redhat-$rhversion/i386/updates";
$athrpmdir = "/afs/sipb.mit.edu/project/linux/packages/$rhversion/RPMS/i386";


sub ListDir {
    local (@allfiles);

    opendir (THISDIR, $_[0]);
    @allfiles = grep (!/^\./, readdir (THISDIR));
    closedir (THISDIR);
    return sort map { "$_[0]/$_" } @allfiles;
}

sub FindRPMS {
    local (@rpmlist);
    local ($rpm, $name, $inst);

    @rpmlist = ();

    foreach $rpm (@_) {
	next if ($rpm =~ m@/(kernel|(athena-)?afs)-@);
        next unless ($rpm =~ m@([^/]*)-[0-9][^/]*-[^/]*\.[^/]*\.rpm@);
	$name = $1;

	$inst = `rpm -q $name 2>/dev/null`;
	chop $inst;
	if ($rpm =~ m@/\Q$inst\E\.[a-z0-9]+\.rpm$@) {
	    print STDERR "$inst already installed -- skipping.\n";
	    next;
	}
	## print STDERR "[$name $inst]\n";
	push (@rpmlist, $rpm) if ($inst || $name eq 'xserver-wrapper'
				  || $name eq 'mktemp');
    }
    ## print STDERR join(' ', @rpmlist), "\n";
    return @rpmlist;
}

sub InstallRPMS {
# Sigh.  --nodeps shouldn't be necessary, but some packages have broken
# dependency info.
    system ("rpm", "-Uvh", "--replacefiles", "--nodeps", @_) if @_;
}

sub RemoveHacks {
    if ($rhversion eq "4.2") {
	if ( -f "/bin/login.redhat" ) {
	    unlink ("/bin/login");
	    rename ("/bin/login.redhat", "/bin/login");
	}
    }
}

sub InstallHacks {
    if ($rhversion eq "4.2") {
	if ( -f "/bin/athena/login" && ! -f "/bin/login.redhat" ) {
	    rename ("/bin/login", "/bin/login.redhat");
	    system ("cd /bin; ln -s athena/login");
	}
# Another security hole found in X servers.  Film at 11.    
	chmod 0755, </usr/X11R6/bin/XF86*>;
    }
}

# chdir $rpmdir || die "Cannot cd to $rpmdir";
die "Must be run as root" if ($< && $>);

# print STDERR &FindRPMS(&ListDir($rpmdir)), "\n";

&RemoveHacks;
@rpms=FindRPMS(ListDir($rpmdir), ListDir($athrpmdir));
@rpm_rpm = grep(m@/rpm-\d@, @rpms);
if (@rpm_rpm) {
    InstallRPMS(@rpm_rpm);
    system('rpm', '--rebuilddb');
}
InstallRPMS(grep(!m@/rpm-\d@, @rpms));
&InstallHacks;
