#!/usr/bin/perl

my ($standard,$current,$expected)=@ARGV;

$standard=~s/[^\/\w\.]//g;
$current=~s/[^\/\w\.]//g;
$expected=~s/[^\/\w\.]//g;
my %svhash;
my %sbhash;
my %chash;

my @oldrpms;
my @badversionrpms;
my @newrpms;
my @externalrpms;
my @barerpms;
my @developrpms;

open IN, "<$standard";
while(<IN>) {
    chop;
    my ($name,$version,$buildtime)=split(/\s+/);
    $svhash{$name}=$version;
    $sbhash{$name}=$buildtime;
}
close IN;

open IN, "<$current";
while(<IN>) {
    chop;
    my ($name,$version,$buildtime)=split(/\s+/);
    $chash{$name}=1;
    if ($svhash{$name}) {
	unless ($svhash{$name} eq $version) {
	    push @badversionrpms,"$name is version $version, should be $svhash{$name}\n";
	}
	if ($sbhash{$name}<$buildtime) {
	    push @newrpms,"$name was built ".localtime($buildtime)." when the expected build time was ".localtime($sbhash{$name})."\n";
	}
	if ($sbhash{$name}>$buildtime) {
	    push @oldrpms,"$name was built ".localtime($buildtime)." when the expected build time was ".localtime($sbhash{$name})."\n";
	}
    }
    else {
	push @externalrpms,"$name (built ".localtime($buildtime).") is an RPM not expected to ever be on a LON-CAPA system\n";
    }
}
close IN;

open IN,"<$expected";
while(<IN>) {
    chop;
    next unless /^[YN] \w/;
    /(.).(.*)/;
    my $type=$1;
    my $package=$2;
    $package=~s/\-[^\-]*\-[^\-]*$//;
    if (!$chash{$package}) {
	push @barerpms,"$package is missing and is of basic necessity to a LON-CAPA system\n" if $type eq 'Y';
	push @developrpms,"$package is missing and may be useful for a LON-CAPA system\n" if $type eq 'N';
    }
}
close IN;

my $date=`date`; chop $date;
my $hostname=`hostname`; chop $hostname;
print <<END;
<html>
<head>
<title>LON-CAPA Software RPM Status Page</title>
</head>
<body>
<font size="+2">LON-CAPA Software RPM Status Page
(done on $date for $hostname)</font>
<br />Michigan State University
<br />Learning Online with CAPA
<br />Contact korte\@lon-capa.org
<ul>
<li>Important warnings</li>
<li>About this file</li>
<li>Bad RPM Versions</li>
<li>Out-of-date RPMS</li>
<li>Newer than expected RPMS</li>
<li>RPMS external to LON-CAPA</li>
<li>RPMS from the "bare minimum" set that you are missing</li>
<li>RPMS from the "development" set that you are missing</li>
</ul>
<font size="+2">Important warnings</font>
<p>
<b>Never install LON-CAPA-setup</b> on a running LON-CAPA machine.
This RPM package contains pre-installation files such as 
/etc/group and /etc/passwd.  You will lose all access to your
machine if you install this RPM.
</p>
<p>
If you are doing CVS-based upgrades of your LON-CAPA
software, then you do not need to upgrade your LON-CAPA-base
RPM.  Upgrading with the LON-CAPA-base RPM
will cause you to lose many of your system-specific
configuration settings.
</p>
<p>
DO NOT UPGRADE YOUR KERNEL UNLESS YOU KNOW WHAT YOU ARE DOING.
Kernel upgrading involves packages beginning with the word
"kernel".
</p>
<font size="+2">About this file</font>
<p>
This file is generated dynamically by <tt>make rpmstatuspost</tt>
when this command is entered in the CVS:loncom/build directory.
</p>
<p>
Managing software packages on any system, testing different
sets of software packages, tracking their dependencies, and maintaining
configuration information is an inexact science.  While the LON-CAPA
recommended set of RPMs is a tested set with no missing dependencies,
we still highly recommend that RPM upgrades are only performed
by those with significant knowledge about standard Linux operating
systems.
</p>
END
    print <<END;
<font size="+2">Differing RPM Versions</font>
<pre>
END
foreach my $rpminfo (@badversionrpms) {
    print $rpminfo;
}
print <<END;
</pre>
END
print <<END;
<font size="+2">Out-of-date RPMS</font>
<pre>
END
foreach my $rpminfo (@oldrpms) {
    print $rpminfo;
}
print <<END;
</pre>
END
print <<END;
<font size="+2">Newer than expected RPMS</font>
<pre>
END
foreach my $rpminfo (@newrpms) {
    print $rpminfo;
}
print <<END;
</pre>
END
print <<END;
<font size="+2">RPMS external to LON-CAPA</font>
<pre>
END
foreach my $rpminfo (@externalrpms) {
    print $rpminfo;
}
print <<END;
</pre>
END
print <<END;
<font size="+2">RPMS from the "bare minimum" set that you are missing</font>
<pre>
END
foreach my $rpminfo (@barerpms) {
    print $rpminfo;
}
print <<END;
</pre>
END
print <<END;
<font size="+2">RPMS from the "development" set that you are missing</font>
<pre>
END
foreach my $rpminfo (@developrpms) {
    print $rpminfo;
}
print <<END;
</pre>
END
