#!/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; }