#!/usr/bin/perl 

#Master control script; ltp_master
#       3/12/02 William Jay Huie (creation)
#       3/28/02 William Jay Huie minor updates
#This will upload the ltprun script to the test system and kick off this script
#uses the Net:Telnet and Net::Ftp modules from www.cpan.org
#the ltprun script is a shell script to eliminate the need to write a script
#to install these modules on all the target systems

#FIXME: One problem is that the tests need to be run as root as as of now
#this means that LTP_USER needs to be root, which means root needs to be
#able to telnet and ftp into the machine. Couldn't figure out how to add 
#a su -c to the LTP_CMD_LINE variable, ssh will probably be the solution
#but for now this works

use Net::Telnet ();
use Net::FTP ();

#Leave this set to keep perl from buffering IO
$| = 1;

#CHANGEME:
#change these for different defaults
#Think carefully because things like ltprun.out are relied upon in the ltprun
#     script, so you need to change them there too, or better yet make them 
#     cmd line parms
#$LTP_USER = "ltp";
#$LTP_PASS = "ltp";
$LTP_USER = "root";
$LTP_PASS = "password";
$LTP_RUN = "ltprun";
#CHANGEME:
#Can't use ~/bin so have to explicitly hardcode this directory
$LTP_RUN_DIR = "/home/wjhuie/bin/";
$LTP_CMD_LINE = "chmod +x $LTP_RUN && nohup ./$LTP_RUN &> $LTP_RUN.out &";

#print "For this to work root must be able to ftp and telnet into the machines\n";
#print "Check #LTP_RUN_DIR/ltp_master for root password: $LTP_PASS\n";

#print "FIXME: Need to change this to su to root, not login over telnet\n";
#print "       Or run in some other way like ssh\n";

if ( $ARGV[0] eq "-f" )
{
   if ( -f $ARGV[1] )
   {
      open(FILE, $ARGV[1]) or die "Can't open $ARGV[1]";
      for ($i = 0; chomp($hosts[$i] = <FILE>); $i++) { ; }
      $#hosts--;
      close(FILE);
   }
   else { die "Please specify host list file with option -f\n"; }
}
elsif (@ARGV)
{  @hosts = @ARGV; }
else
{
   print "HOSTS separate with [ENTER] finish with [^D]\n";
   chomp(@hosts = <STDIN>);
}

$t = new Net::Telnet (Timeout => 30, Prompt => '/.+[\$#] $/'
#                     ,Dump_Log => "ltp_control.log"
#Remove the # on the line above and a copy of the
#       data exchange will be saved to the file 'ms.log'
                      );

#FIXME: Need a better retry system, this would loop forever
#$retry = 0;

for ($j = 0; $j <= $#hosts; $j++)
{
   chdir "$LTP_RUN_DIR" or die "Can't change to $LTP_RUN_DIR";
   print "\nAttempting to Upload $LTP_RUN to: $hosts[$j]";

   $ftp = Net::FTP->new($hosts[$j], Debug => 0) or 
      do { print "\n\tCouldn't connect to: $hosts[$j] --- skipping\n"; next; };
   $ftp->login($LTP_USER, $LTP_PASS) or die "\nUnable to login";
   $ftp->type('I') or die "\nUnable to set type to Binary";
   $ftp->put($LTP_RUN) or die "\nUnable to put $LTP_RUN";
   $ftp->quit;
   print "\nUploading $LTP_RUN Done";

   print "\nConnecting to: $hosts[$j]";
   $t->open($hosts[$j]);
   $t->errmode("return");
   $t->login($LTP_USER, $LTP_PASS) or
                 do { print "\n\tFailed Login to $hosts[$j]! "; next;
#perhaps work in some sort of retry, but this way will loop forever
#                      if ($retry) { $j--; } next;
                    };
   @l = $t->cmd("$LTP_CMD_LINE");

   if ($j == 0)
   {
      if ($l[0]) { print " >\n@l"; @base_output = @l; }
      else { printf "\nReturned empty Buffer!\n"; }
   }
   $a = join("",@l);
   $b = join("",@base_output);
   if ($a ne $b)
   { print "!>\n@l\n"; }

   $t->buffer_empty();
   $t->close();
   print "\t Command Completed";
}
print "\nAll Done!\n";

#Use snippit below in results script to convert timing info 
#     from tar file name into human readable format
#$foo = $ARGV[0];
#($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($foo);
#print "$foo\n";
#print "Hour: $hour Min: $min Sec: $sec\n";

