#initial attempt at an automation script: ltprun
#       3/12/02 William Jay Huie (creation)
#       3/28/02 William Jay Huie minor updates
#this will be kicked off by ltp_master from the master control machine which
#uploads this script and then telnets into each machine and kick this script off
#perhaps by passing a uniq ID to name the LTP_OUTPUT_TAR file by, or
#allowing the script to create a unique name itself (reccommended for now)
#Check ltp_master for details
#FIXME: One problem is that the tests need to be run as root and this script
#       doesn't as of yet su
#
#CHANGEME:
LTP_HOST=ltp_host.somewhere.org
#This is the user to get the ltp.tgz file from, not who we're running as,
#     that's ocntrolled by ltp_master
LTP_USER=ltp
LTP_PASS=ltp
LTP_TARFILE=ltp.tgz
LTP_RUNALL_OUT=runall.output
LTP_LOGFILE=ltp-logfile
LTP_RUN_OUTPUT=ltprun.out
SAR_OUTFILE=sar.data

#This script passes the -l ~/ltp/ltp-logfile option to runalltests.sh

if [ -z $1 ]; then
   SHORT_HOSTNAME=`hostname | perl -e 'while(<>){ m/(\w+)[.\\$]?/ && print $1;}'`
   TIMESTAMP=`date +%s`
   LTP_OUTPUT_TAR="$SHORT_HOSTNAME-$TIMESTAMP-ltpoutput.tgz"
else
   LTP_OUTPUT_TAR=$1
fi

download_ltp()
{
   echo "Attempting to download the LTP testcases";
   cd ~
   rm -Rf ltp $LTP_TARFILE
   ftp -n $LTP_HOST << END_GET
   	user $LTP_USER $LTP_PASS
	bin
	get $LTP_TARFILE
	bye
END_GET

   if [ -s $LTP_TARFILE ]; then
      echo "              downloaded sucessfully";
   else
      echo "FAILED        download of LTP Testcases"; return 0;
   fi
   return 1;
}

untar_ltp()
{
   echo "Untarring $LTP_TARFILE now";
   cd ~
   tar -zxf $LTP_TARFILE &> /dev/null
   if [ $? != "0" ]; then
      echo "Problems untarring the archive"; return 0;
   else
      echo "          successfully untarred $LTP_TARFILE";
   fi
   return 1;
}

build_ltp()
{
   cd ~/ltp
   echo "Building LTP Testsuite version: `cat VERSION`";
   make clean install &> /dev/null
   if [ $? != "0" ]; then
      echo "FAILED   LTP Testsuite compilation"; return 0;
   else
      echo "         LTP Testsuite compilation successful"
   fi
   return 1;
}

run_ltp()
{
   cd ~/ltp
   rm -f $LTP_RUNALL_OUT $LTP_LOGFILE $SAR_OUTFILE
   echo "Trying to start sar"
   sar -o $SAR_OUTFILE 60 0 &
   echo "Running LTP testsuite"
   ./runalltests.sh -l ~/ltp/$LTP_LOGFILE &> $LTP_RUNALL_OUT
   echo "Done running tests"
   killall -9 sadc
   echo "Killing sar if it is running"
   return 1;
}

#FIXME:
#collect results has a hack to copy the &>ltprun file into the ~/ltp dir then
#tar it up with everything else, but this seems to work so far.
collect_results()
{
   echo "Collecting LTP output"
   cd ~/ltp
   cp ~/$LTP_RUN_OUTPUT .
   tar --ignore-failed-read -czf ~/$LTP_OUTPUT_TAR $LTP_RUNALL_OUT $LTP_LOGFILE $LTP_RUN_OUTPUT $SAR_OUTFILE

   if [ -s ~/$LTP_OUTPUT_TAR ]; then
      echo "LTP output tarfile created sucessfully";
   else
      echo "FAILED        tar of LTP results"; return 0;
   fi
   return 1;
}

upload_results()
{
   echo "Uploading LTP output"
   cd ~
   ftp -n $LTP_HOST << END_PUT
	user $LTP_USER $LTP_PASS
	bin
	put $LTP_OUTPUT_TAR
	bye
END_PUT
#FIXME! Right now don't have a way to verify the upload worked, but
#we'd like to know so we can delete the OUTPUT_TAR file
#   rm -f $LTP_OUTPUT_TAR
    rm -f $LTP_TARFILE
}

#Start the work!

download_ltp
if [ $? = 1 ]; then
   untar_ltp
   if [ $? = 1 ]; then
      build_ltp
      if [ $? = 1 ]; then
         run_ltp
      fi
   fi
fi

#Want to upload results even if things didn't run
collect_results
upload_results

echo "Done"
