#!/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";

