blob: 49fda6fbd211d43a5b40f9d63c2579e64f4d0d6a [file] [log] [blame]
#!/usr/bin/perl
use CGI qw(:standard);
# keep a copy of each 'uname -a' string so we don't have to search for it every time.
%uname_cache = {};
# When something goes wrong before we start output, use this
# function so there is still output
sub failure {
print header("text/html"),start_html;
print "$_[0]\n";
print end_html;
exit;
}
# get the UNAME line for a host, date, suite
sub get_result_uname {
my($inhost, $indate, $insuite, $filename);
my(@possible_files, $pf, $line);
my($host, $datestr, $suite, $type, $gz);
# build a filename
$inhost = $_[0];
$indate = $_[1];
if ($#_ >= 2) {
$insuite = $_[2];
} else {
$insuite = "*";
}
# check to see if we've done this already
if (exists($uname_cache{"$inhost.$indate"})) {
return $uname_cache{"$inhost.$indate"};
}
$filename = "$inhost.$indate.$insuite.*";
@possible_files = <${filename}>;
if ($#possible_files < 1) {
return "";
}
foreach $pf (@possible_files) {
($host, $datestr, $suite, $type, $gz) = split(/\./, $pf);
if ($type eq "summary") {
next;
} elsif ($type eq "scanner") {
open (UF, $pf) || next;
while ($line = <UF>) {
if ($line =~ /^UNAME/) {
close(UF);
$line =~ s/UNAME *//;
$line =~ s/$inhost//;
$uname_cache{"$inhost.$indate"} = $line;
return $line;
}
}
} elsif ($type eq "driver") {
if ($gz) {
open (UF, "gunzip -c $pf|") || next;
} else {
open (UF, "$pf") || next;
}
while ($line = <UF>) {
if ($line =~ /^UNAME/) {
close(UF);
$line =~ s/UNAME="(.*)"/\1/;
$line =~ s/$inhost//;
$uname_cache{"$inhost.$indate"} = $line;
return $line;
}
}
} else {
next;
}
}
return "";
}
# Create the headers row, adding links for sorting options
sub print_headers {
print "\n<tr>";
for($i = 0; $i <= $#rso; $i++) {
print "<th><a href=\"browse.cgi?sort=";
for ($j = 0; $j <= $#rso; $j++) {
if ($j == $i) { $rsd[$j] = $rsd[$j] * -1; }
if ($rsd[$j] == -1) { print "-"; }
if ($j == $i) { $rsd[$j] = $rsd[$j] * -1; }
print $rso[$j];
if ($j < $#rso) { print ","; }
}
print "\">$rso[$i]</a>\n";
}
print "</tr>\n";
}
############
# main() #
############
# Most of the work is done in this directory
unless (chdir("/usr/tests/ltp/results")) {
failure("Could not get to the results directory\n");
}
@extra_path = split(/\//, $ENV{PATH_INFO});
# rso = Result Sort Order
# rsd = Result Sort Direction
#@rso = (HOST,SUITE, DATE, UNAME);
@rso = (SUITE, HOST, DATE, UNAME);
@rsd = (1, 1, -1, 1);
# allow the user to specify the sort order
if ($sort_order = param("sort")) {
@so = split(/,/, $sort_order);
print $so;
@rso = ();
for($i = 0; $i <= $#so; $i++) {
# parse the field
if ($so[$i] =~ /host/i) { push(@rso, HOST); }
elsif ($so[$i] =~ /date/i) { push(@rso, DATE); }
elsif ($so[$i] =~ /suite/i) { push(@rso, SUITE); }
elsif ($so[$i] =~ /uname/i) { push(@rso, UNAME); }
# parse the direction
if ($so[$i] =~ /-/) { $rsd[$i] = -1; }
else { $rsd[$i] = 1; }
}
}
if ($#extra_path > 0) {
} else {
%results = ();
# run through the files in the results directory
@driver_files = <*driver*>;
foreach $df (@driver_files) {
($host, $datestr, $suite, $type, $gz) = split(/\./, $df);
$a_rec = ();
$a_rec->{HOST} = $host;
$a_rec->{DATE} = $datestr;
$a_rec->{SUITE} = $suite;
$a_rec->{DRIVER_FILE} = $df;
$a_rec->{UNAME} = get_result_uname($host, $datestr);
$results{ $a_rec->{DRIVER_FILE} } = $a_rec;
}
# write the HTML file
print header("text/html"),start_html;
print "This is a demo page for browsing the Linux LTP results. Select the results you want to compare and click the \"Compare\" button.", p, h2("Warning"), "The results are placed in a large table which may take a long time to render on some browsers", p;
@ri = values %results;
@ri = sort { ($a->{$rso[0]} cmp $b->{$rso[0]})*$rsd[0]
|| ($a->{$rso[1]} cmp $b->{$rso[1]})*$rsd[1]
|| ($a->{$rso[2]} cmp $b->{$rso[2]})*$rsd[2]
|| ($a->{$rso[3]} cmp $b->{$rso[3]})*$rsd[3] } @ri;
$last = ();
$last->{$rso[0]} = "";
$last->{$rso[1]} = "";
$last->{$rso[2]} = "";
$lasthost = "";
$lastdate = "";
$lastsuite = "";
#$lastindent = 0;
$thisindent = 0;
print "<form method=get action=\"reconsile.cgi\">";
print "<table border=1>\n";
#print "<tr><th>Hostname<th>Date<th>Suite</tr>\n";
print_headers();
foreach $rp ( @ri ) {
$this = ();
$this->{$rso[0]} = $rp->{$rso[0]};
$this->{$rso[1]} = $rp->{$rso[1]};
$this->{$rso[2]} = $rp->{$rso[2]};
$this->{$rso[3]} = $rp->{$rso[3]};
# figure out the first column that is different
for ($i = 0; $i <= $#rso; $i++) {
if ($last->{$rso[$i]} ne $this->{$rso[$i]}) {
$thisindent = $i;
last;
}
}
print "<tr>\n";
for ($i = 0; $i < $thisindent; $i++) {
print "<td>";
}
for ($i = $thisindent; $i <= $#rso; $i++) {
print "<td>";
if ($i == $#rso) {
print "<a href=\"results.cgi?get_df=$this->{HOST}.$this->{DATE}.$this->{SUITE}.scanner\">";
}
print "$this->{$rso[$i]}";
if ($i == $#rso) {
print "</a>";
}
if ($i == $#rso) {
# last column
print " <input type=checkbox name=results value=\"$this->{HOST}.$this->{DATE}.$this->{SUITE}\">";
}
}
print "</tr>\n";
# make sure we update the $last... variables
$last->{$rso[0]} = $this->{$rso[0]};
$last->{$rso[1]} = $this->{$rso[1]};
$last->{$rso[2]} = $this->{$rso[2]};
}
print "</table>\n";
print "<input type=submit name=compare value=\"Compare\">\n";
print "<input type=reset>\n";
print "</form>";
print end_html;
}