226 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			226 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
| #!/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;
 | |
| 
 | |
| }
 | |
| 
 |