| #!/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 -n 1 $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 -n 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 -n 1`; |
| @sarstats2 = split(/\s+/, $line2); |
| print "Memory used = $sarstats2[3]%\n"; |
| print "Swap used = $sarstats2[9]%\n"; |
| |
| $line3 = `sar -c -f $SAR_OUTFILE |tail -n 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; } |