blob: 8999167429c6b353993c46b1dd1e5945aa656c9a [file] [log] [blame]
#!/usr/bin/perl
#LTP results gathering script: ltp_check
# 3/12/02 William Jay Huie (creation)
# 3/28/02 William Jay Huie minor fixes, increased results parsing
# 5/01/02 William Jay Huie parsing changes
# 5/17/02 Casey Abell added sar results
#This will log into the LTP_HOST machine, which may be different then the
#machine used to run the ltp_master script
#This script will check for *ltpoutput.tgz files created by the ltprun script
#and download them each to their own directory and do a bit of processing
#the results gathering probably needs to be extended but hopefully this is a good
#first go at it
use Net::FTP ();
#CHANGEME:
#For some reason doesn't work if you do ~/ltp/results, so you need to code the
#explicit path for LTP_RES_DIR unless someone can tell me why
$LTP_RES_DIR="/home/wjhuie/ltp/results";
#CHANGEME:
$LTP_HOST="ltp_host.somewhere.org";
#This is who has the *ltpoutput.tgz files, where the results are uploaded
# not necessarially the user id that ran the test
$LTP_USER="ltp";
$LTP_PASS="ltp";
$LTP_LOGFILE="ltp-logfile";
$LTP_RUN_OUTPUT="ltprun.out";
$LTP_RUNALL_OUT="runall.output";
$RESULTS_OUT="results.out";
$FAILS_OUT="failures.list";
$SAR_OUTFILE="sar.data";
@res_dirs;
$count = 0;
$RES = 0;
$FAILS = 0;
%hash;
sub download_results()
{
print "Attempting to download the LTP results\n";
$dir = system("ls $LTP_RES_DIR &> /dev/null") / 256;
if ($dir)
{
print "Making a results directory in $LTP_RES_DIR\n";
`mkdir -p $LTP_RES_DIR`;
chdir "$LTP_RES_DIR" or die "Can't change to $LTP_RES_DIR\n";
}
else
{ chdir "$LTP_RES_DIR" or die "Can't change to $LTP_RES_DIR\n"; }
$ftp = Net::FTP->new($LTP_HOST, Debug => 0) or die "Can't connect to ftp: $LTP_HOST";
$ftp->login($LTP_USER, $LTP_PASS) or die "Unable to login";
$ftp->type('I') or die "Unable to set type to Binary";
@files = $ftp->ls("*ltpoutput.tgz");
$num_files = $#files + 1;
print "New results files found $num_files:\n";
for ($i = 0; $i < $num_files; $i++) { print "\t$files[$i]\n"; }
for ($i = 0; $i < $num_files; $i++)
{
print "Downloading: $files[$i]\t";
if ($ftp->get($files[$i]))
{
print "Successful\n";
$ftp->delete($files[$i]);
}
else
{ print "FAILED\n"; }
}
$ftp->quit;
@res = `ls $LTP_RES_DIR/*.tgz 2> /dev/null`;
if (@res)
{
$num = $#res + 1;
print " download of LTP results finished\n";
print "$num unprocessed results files found\n";
chomp(@res);
return 1;
}
else
{ print " no apparent results to process\n"; return 0; }
}
sub untar_results()
{
for ($i = 0; $i < $num; $i++)
{
if ( $res[$i] =~ m/\s*(\w+)-((\w+)-)*ltpoutput.tgz/ )
{
$hostname = $1;
$epoch_time = $3;
$english_time = localtime($epoch_time);
$dir = "$LTP_RES_DIR/$hostname/$english_time";
if ($english_time)
{
$new_dir = $dir;
$new_dir =~ s/ /_/g;
print "New results: $hostname @ $english_time\n";
`mkdir -p '$new_dir'`;
chdir "$new_dir" or die "Can't change to $new_dir\n";
`tar -zxf $res[$i]`;
`mv $res[$i] $new_dir`;
$res_dirs[$count] = $new_dir; $count++;
}
else
{
print "No timestamp on results file, skipping for now\n";
#Should come up with a soultion for this, check/create $hostname
# then some unique identifier but for now we'll complain and ignore
}
}
}
return 1;
}
sub gather_results()
{
print "Gathering $count result(s):\n";
for ($i = 0; $i < $count; $i++)
{
print "\nResults for: $res_dirs[$i]\n";
chdir "$res_dirs[$i]" or die "Can't change to $res_dirs[$i]\n";
if ( !( -f $LTP_RUNALL_OUT && -f $LTP_LOGFILE ) )
{
print "$LTP_RUNALL_OUT or $LTP_LOGFILE seems to be missing\n";
print " check the tarfile and perhaps $LTP_RUN_OUTPUT\n";
print "Skipping\n";
next;
}
chomp($stat = `tail -n1 $LTP_RUNALL_OUT`);
print "\t\t$stat\n";
$num_success = `grep "stat=0" $LTP_LOGFILE | wc -l`;
if ( $num_success =~ /\s*(\d+)\s*/ ) { $num_success = $1; }
@fails = `grep "stat=" $LTP_LOGFILE | grep -v "stat=0"`;
$num_fail = $#fails + 1;
# gather the same fail cases together and have a counter for each different fail case.
foreach $each (@fails) {
if ($each =~ /(.)*tag=(\w+)\sstime=(.+)/){
$case = $2;
# print "$case\n";
if (exists $hash{$case}) {
# print "$hash{$case} before\n";
$counter = $hash{$case}+1;
$hash{$case} = $counter;
# print "$hash{$case} later\n";
}
else {
$hash{$case}=1;
}
}
}
$pass_percent = sprintf("%.2f",
($num_success / ($num_success + $num_fail)) * 100);
$ltp_ver = `grep "version" $LTP_RUN_OUTPUT`;
if ( $ltp_ver =~ m/.*version: (.*)/ ) { $ltp_ver = $1; }
$line = "Pass $pass_percent % : $num_success succeeded : $num_fail failed";
print "$line\n";
$line1 = `sar -f $SAR_OUTFILE |tail -1`;
if ($line1 =~ /(.+)/) {
@sarstats1 = split(/\s+/, $line1);
print "Cpu user = $sarstats1[2]%\n";
print "Cpu nice = $sarstats1[3]%\n";
print "Cpu system = $sarstats1[4]%\n";
$line2 = `sar -r -f $SAR_OUTFILE |tail -1`;
@sarstats2 = split(/\s+/, $line2);
print "Memory used = $sarstats2[3]%\n";
print "Swap used = $sarstats2[9]%\n";
$line3 = `sar -c -f $SAR_OUTFILE |tail -1`;
@sarstats3 = split(/\s+/, $line3);
print "Processes created per second = $sarstats3[1]%\n";
}
if (open RES, ">$RESULTS_OUT")
{
print ". -> Results stored in $RESULTS_OUT\n";
if (!open FAILS, ">$FAILS_OUT") { print "Error opening $FAILS_OUT\n"; }
$num =
#The <<<test_start>>> doesn't always get into the runalltest.sh output capture
#because some output will appear before its corresponding block
#So for now relying on last thing from ver_linux to know when to stop copying
# system("awk '/<<<test_start>>>/ { exit NR-1; }' $LTP_RUNALL_OUT") / 256;
system("awk '/bogomips/ { exit NR; }' $LTP_RUNALL_OUT") / 256;
@system_info = `head -n $num $LTP_RUNALL_OUT`;
if ($ltp_ver) { print RES "$ltp_ver : "; }
print RES "$line\n\n";
if ($line1 =~ /(.+)/) {
print RES "Cpu user = $sarstats1[2]%\n";
print RES "Cpu nice = $sarstats1[3]%\n";
print RES "Cpu system = $sarstats1[4]%\n";
print RES "Memory used = $sarstats2[3]%\n";
print RES "Swap used = $sarstats2[9]%\n";
print RES "processes created per second = $sarstats3[1]%\n\n";
}
print RES "@system_info\n";
print RES "$stat:\n";
#print out each failed case information.
foreach $case(keys %hash){
print RES "failed case=$case\tnumber of failures=$hash{$case}\n";
}
#end of new ouput section
$runall = `cat $LTP_RUNALL_OUT`;
# reset hash table values to 0
foreach $case(keys %hash){
$hash{$case}=0;
}
for ($j = 0; $j < $num_fail; $j++)
{
if ( $fails[$j] =~ m/^tag=(\w+?) / )
{
$test_case = $1;
# each failure case will be printed out only once
if ((exists $hash{$test_case})&&( $hash{$test_case}==0 )) {
$hash{$test_case}=1;
if (FAILS) { print FAILS "$test_case\n"; }
print RES "\nTrying to find $test_case output";
if ( $runall =~
#modified because some output is appearing before tagline
m/((^$test_case.*?)*<<<test_start>>>.tag=$test_case.*?<<<test_end>>>)/ms )
{
print RES "\n-------------------------\n";
print RES "$1";
print RES "\n-------------------------\n";
}
else
{
print RES "\n-------------------------\n";
print RES "Unable to locate output for $test_case!";
print RES "\n-------------------------\n";
}
}
}
}
close(RES); close(FAILS);
}
else
{ print "Can't open $RESULTS_OUT, test failures are:\n @fails\n"; }
}
return 1;
}
if (!download_results)
{ exit 0; }
if (!untar_results)
{ exit 0; }
if (!gather_results)
{ exit 0; }