#!/opt/SUNWstade/bin/perl -I/opt/SUNWstade/lib


use strict;
use Getopt::Std;
use Data::Dumper;
use Util::Http;

$|=1;

$SIG{INT} = \&killTest;
$SIG{TERM} = \&killTest;

my $renv     = System->get_renv();
my $ping_to  = $renv->{'timeout.ping'} || 10;
my $http_to  = $renv->{'timeout.http'} || 60;

my $RETRYS = 10;    #how many times to retry the t3 if no reply
my $RETRYWAIT = 3;  #how many sec's to wait between retrys


my $TESTNAME="ondg";
my $DEVICETYPE="device";
my $ERROR = 0;
my @FaultyFRU=undef;
my @error_tests;
my @pass_tests;
my $externalTest= "none";
my $OffLineQuestion = "WARNING - Volume data will be offline ". 
                      "while OFDG is running.\n Continue ? [N]: ";
my %Options;
my $ok = getopts('qseykruh?vdlfno:', \%Options);
my $numargs=keys(%Options);

#check to see if usage needs to be displayed
if( !$ok || $numargs < 1 || $Options{"u"} eq 1 ||
   $Options{"h"} eq 1 || $Options{"?"} eq 1 ){
  printUsage();
  if(!$ok){
     exit(1);
  }else{
     exit(0);
  }
}

#check to see if user needs to be told this is a offline test
if ($Options{"y"} ne 1){
  print $OffLineQuestion."\n";
  my $ans=<STDIN>;
  while(($ans =~ /[Yy]/) != 1){
    if($ans eq "\n" || $ans =~ /[Nn]/){
      print "Not Continuing\n";
      exit();
    }  
    print $OffLineQuestion."\n";
    $ans=<STDIN>;
  }
  print "Continuing\n";
}


#parse all -o options or any ondg specific options
#disable all Options and specify valid parameters
#ondgEchoStart=<controller>,<fabric>,<pat1>,<pat2>,<size>
#<controller> :=    1 - primary
#        2 - alternate master
#<fabric> :=    1 - ELS ECHO to be sent to fabric controller
#        0 - ELS Echo to be sent to itself.
#    must be set to 1 for ISP2200
#<pat1> := Any 4 byte hex number.
#<pat2> := Any 4 byte hex humber.
#<size> := data size
#    max size is 220 bytes if <fabric> is set to 1
#    max size is 2k bytes if <fabric> is set to 0

my %ondgParameters=undef; 
@ondgParameters{ "dev",
		 "controller",
		 "internal10bit",
		 "internal1bit",
		 "external",
		 "sim",
		 "userpattern",
		 "pattern",
		 "loopdatasize",
		 "echodatasize",
		 "iterations",
		 "usr",
		 "passwd"
		}=
		(undef, "u1ctr", "Disable", "Disable", "Enable", "Front", "0x7e7e7e7e",
		   "critical", "0xfff8","0xdc", "1000", "root", undef);

#split up indivdual ondg specific parameters
#these are variable needed to do this:
my $i;
my $key;
my $value;
my $match;
my $validOption;

my @tmpParams = split(/\|/,$Options{"o"});
#loop through params
foreach $i (@tmpParams){ 
  ($key, $value) = split(/=/,$i);
  # Remove any spaces from key and values.
  $key =~ s/\s*//g;
  $value=~ s/\s*//g;


  $match=undef;
  foreach $validOption (keys(%ondgParameters)){
    if ($key eq $validOption){
      $match = $validOption;
    }
  }
  #if the key does not match a valid option then the match does not get defined
  if(! (defined($match))){
     print "$key is an invalid option.\n".
           "$TESTNAME did not execute.\n". 
           "$TESTNAME exiting.\n";
	   printUsage();
     exit(1);
  } else  { #finally stick the value in the @#$'n hash
    $ondgParameters{$key}=$value; 
  }
}

   my $verbose = $Options{"v"};
   my $short_print = $Options{"q"};

   my $optstring = $Options{"o"};

   #remove password from output
   $optstring =~ s/passwd=[^\s\=\|]+/passwd=xxxxxxx/; #remove passwd from output

   if($verbose){
      print "Called with options: $optstring\n";
   }

#if debug print out parameters
if($Options{"d"}){ 
  print "INPUT PARAMETERS:\n";
  while (($key,$value) = each(%ondgParameters)){
    print "key: $key value:$value \n";
  }
}

#Done Parsing -o options
#looks Like we are ready to start issuing commands to the $DEVICETYPE
#So let's declare a $DEVICETYPEConnection to use

while(! (defined($ondgParameters{dev}) )){
  print "$ondgParameters{dev}\n";
  print "Please Enter the IPaddress or name of the $DEVICETYPE you whish to test:\n";
  chomp($ondgParameters{dev}=<STDIN>);
}

if(! (defined($ondgParameters{usr})) ){
  print "Please Enter User Name for $ondgParameters{dev}\n";
  chomp($ondgParameters{usr}=<STDIN>);
}

if(! (defined($ondgParameters{passwd})) ){
  print "Please Enter the password for $ondgParameters{dev}\n";
  chomp($ondgParameters{passwd}=<STDIN>);
}
my $pattern_array = undef;
if($ondgParameters{pattern}=~/all/){
  if($Options{"v"}){
    print "Using all patterns\n";
  }
  $pattern_array=pattern_array();
}elsif($ondgParameters{pattern}=~/user/){
  if($Options{"v"}){
    print "Using pattern $ondgParameters{userpattern}\n";
  }
  push(@$pattern_array, $ondgParameters{userpattern});
}else{
  if($Options{"v"}){
    print "Using critical patterns\n";
  }
  $pattern_array=critical_pattern_array();
}

print "Pinging $ondgParameters{dev}\n";
if(Util->ping($ondgParameters{dev})){
  print "Pinging $ondgParameters{dev} successful!  \n";
}else{
  print "Pinging $ondgParameters{dev} Failed!  \n";
  print "Probable_Cause(s)\n";
  print "<Device is not powered on>\n";
  print "<Ethernet is disconnected from device>\n";
  print "<Misconfigured TCP/IP settings in array>\n";
  print "<Malfunctioning Controller>\n";
  print "<Malfunctioning Array>\n";
  print "Recommended_Action(s)\n";
  print "<Check power to Array>\n";
  print "<Check ethernet connections>\n";
  print "<Check ethernet connections to alternate master if available>\n";
  print "<Verify TCP/IP settings in array>\n";
  print "<Replace Controller>\n";
  print "<Replace Array>\n";
  exit(-1);
}
my @url;
my ($err, $text); 
my @output;
my $tokens;
push(@url,"http://$ondgParameters{dev}/system.htm");
push(@url,"http://$ondgParameters{dev}/sysdata.htm");
push(@url,"http://$ondgParameters{dev}/frudata.htm");
push(@url,"http://$ondgParameters{dev}/fruprop.htm");
foreach my $url (@url){
  ($err, $text) = Util::Http->get($url, 20, 
              { password => "$ondgParameters{usr}:$ondgParameters{passwd}" } );
  if (!defined($text)) {
    print "Error: unable to retrieve data From device\n";
    print $Util::Html::ERROR;
    printHttpError();
    exit(-1);
  }
  foreach my $line (split(/\n/,$text)){
     $line = Util->trim($line);
     if($line =~ /^\;/){
      (my $junk, $line, my $junk1) = split(/;/, $line);
      (my $token1,my $token2,my $result)=split(/,/,$line);
      $tokens->{"$token1.$token2"}=$result;
      push(@{$tokens->{controllers}}, $token1)if($line =~ /fruCtlrRole/);
    }
  }
  #push(@output, split(/\n/,$text));
}
my @looppaths;
#push External first so it runs first
if($ondgParameters{external}=~/enable/i){
  push(@looppaths,2);
}
if($ondgParameters{internal10bit}=~/enable/i){
  push(@looppaths,0);
}
if($ondgParameters{internal1bit}=~/enable/i){
  push(@looppaths,1);
}



my @controller;
if($ondgParameters{controller}=~/all/i){
  foreach my $ctr (@{$tokens->{controllers}}){
    $ctr=~/u(\d)ctr/;
    push(@controller,$1);
  }
}else{
  if( "@{$tokens->{controllers}}" =~ /$ondgParameters{controller}/ &&
       $ondgParameters{controller} =~ /u\dctr/){
    $ondgParameters{controller}=~/u(\d)ctr/;
    push(@controller,$1);
  }else{
    print "$ondgParameters{controller} is not a valid controller ID\n";
    print "Valid Controller ID's for $ondgParameters{dev} are: ".
          "@{$tokens->{controllers}}\n";
  }
}
my @sims;
if($ondgParameters{sim}=~/all/i){
  push(@sims,2);
  push(@sims,1);
  push(@sims,0);
}elsif($ondgParameters{sim}=~/-a/i){
  push(@sims,0);
}elsif($ondgParameters{sim}=~/-b/i){
  push(@sims,1);
}else{
    push(@sims,2);
}
if(("@sims" =~ /2/) && ("@looppaths" =~ /2/)){
#sysFctopCurrent
#     Property of System
#     Type        
#        Enum { "loop", "fabric_loop", "p2p", "fabric_p2p", "no_connection" }
#     Access	 read-only
#     Description The current negotiated Fibre Channel topology.
#		 	"loop": Arbitrated loop
#			"fabric_loop": Fabric loop
#			"p2p": Point-to-Point
#			"fabric_p2p": Fabric Point-to-Point
#			"no_connection": No connection
#
  print "$ondgParameters{dev} has firmware revision ".
        $tokens->{"sys.sysRevision"}." \n";
  if($tokens->{"sys.sysRevision"} < "030100"){ #block diag from runnig on 3.0fw
    print $tokens->{"sys.sysRevision"} ."revision firmware does not support ".
          "this diagnostic. Upgrade to 3.1 Firmware or higher to enable this ".
          "this diagnostic\n";
    exit(1);
  }
  print "$ondgParameters{dev} is currently in ".$tokens->{"sys.sysFctopCurrent"} ." mode\n";
  if($tokens->{"sys.sysFctopCurrent"} =~ /loop/){
    $externalTest="loop";
  }elsif($tokens->{"sys.sysFctopCurrent"} =~ /p2p/){
    if($tokens->{"sys.sysRevision"} < "030100"){
      print "WARNING: $ondgParameters{dev} is connected in ".
      $tokens->{"sys.sysFctopCurrent"} ." mode.\n The diagnostics ".
      "available for the installed firmware are not capable of testing ".
      $tokens->{"sys.sysFctopCurrent"}." links,".
      " and the external ports will not be tested. Upgrade to Firmware 3.1 ".
      "or higher to get echo functionality.\n";
      $externalTest="none"; 
    }else{
      $externalTest="echo"; 
    }
  }elsif($tokens->{"sys.sysFctopCurrent"} =~ /no_connection/){
    print "WARNING:".
          " $ondgParameters{dev} does not detect any external data paths!\n".
	  "External Tests on the Front End SIMS will fail!\n";
    $externalTest="loop";
  }  
}
foreach my $looppath (@looppaths){
  foreach my $ctrlnum (@controller){
    foreach my $sim (@sims){
      foreach my $pattern (@$pattern_array){
        if($sim==2&& $looppath==2){ #external test, check that port is online
          if ($tokens->{"u".$ctrlnum."p1.portStatus"}eq"offline"){
            print "Test failed\n"; 
            print "Unit $ctrlnum external port is offline!\n";
            print "Probable_Cause(s)\n";
            print "<Connection to Controller is faulty>\n";
            if ($tokens->{"u".$ctrlnum."ctr.fruRevision"}<51 &&
                $tokens->{sysModel} ne "T300"){
              print "<loopback cable installed, ".
                    " u".$ctrlnum."ctr does not support loopback cable tests>\n"
            }
            print "Recommended_Action(s)\n";
            print "<Verify/Replace optical components (SFP/GBIC/Fiber) ".
                  "connecting array to adjacent device>\n";
            if ($tokens->{"u".$ctrlnum."ctr.fruRevision"}<51 &&
                $tokens->{sysModel} ne "T300"){
              print "<Verify you donot have a loopback cable installed>\n";
            }
            print "<Re-run Test, if problem persists Replace Controller>\n";
            exit(-1);
          }
        }
        if($externalTest eq "echo" && $sim==2&& $looppath==2){
          run_echo($ctrlnum, $pattern, $ondgParameters{echodatasize}, 
                   $ondgParameters{iterations});
        }elsif($externalTest eq "none" && $sim==2&& $looppath==2){
          print "Skipping Testing of the ".simName($sim)
               ." sim of u".$ctrlnum."ctr\n";
        }else{
         run_looptest($ctrlnum,$sim,$looppath,$pattern,
	             $ondgParameters{loopdatasize},$ondgParameters{iterations});
        #sleep(20); # let T3/4 simmer
        }
        
        #sleep(10); # let T3/4 simmer
      }
    }
  }
}

if($ERROR eq 0){
  if($verbose){
     print "Test Passed\n";
   }
  exit(0);
}else{
  if($verbose){
     print "Test failed\n" 
  }
  exit(-1);
}
#Taken form email sent from Rick McNeal
#ondgEchoStatus and ondgLoopStatus return the following strings
#    never_run - test has never been run since last reboot
#    in_progress - test is currently running
#    complete,0xXX - test completed and the return status
#        0 - Good status
#        0x4002 - DMA error
#        0x4005 - Command error: host busy, not connected to F-port 
#                 or no buffer available
#        0x4006 - Command parameter error sunc as frame size/transfer
#                 count is greater than spec
#        0x400B - Link down error.
#    bad_arg_count - bad argument count when command was started 
sub interpret_ondg_result{
  my($result, $test, $sim, $other)=@_;
  Util->trim($result);
  my $out;
  if($result eq "0" || $result eq "0x0"|| $result eq "0x4000"){
    $out->{status} = "Good status\n";
    $out->{pass} = 0;
  }elsif ($result=~/0x4002/i){
    $out->{status} = "DMA error\n";
    $out->{status}.="Probable_Cause(s)\n";
    $out->{status}.="<Malfunctioning Controller>\n";
    $out->{status}.="<Malfunctioning Array>\n";
    $out->{status}.="Recommended_Action(s)\n";
    $out->{status}.="<Replace Controller>\n";
    $out->{status}.="<Replace Array>\n";
    $out->{pass} = 0x4002;
  }elsif ($result=~/4005/i){
    if($test eq "loop" && $sim eq "2"){
      $out->{status} = "Command error: host busy, not connected".
                       " in FC-AL mode \n";
      $out->{status}.="Probable_Cause(s)\n";
      $out->{status}.="<Connection to Controller is faulty>\n";
      $out->{status}.="<Controller is not connected in FC-AL mode>\n";
      $out->{status}.="Recommended_Action(s)\n";
      $out->{status}.="<Verify/Correct connection mode to adjacent device is FC-AL mode>\n";
      $out->{status}.="<Verify/Replace optical components (SFP/GBIC/Fiber) to adjacent device>\n";
    $out->{status}.="<Re-run Test, if problem persists Replace Controller>\n";
    }elsif($test eq "loop"){
      $out->{status} = "Command error: host busy, Back End Loop Error\n";
      $out->{status}.="Probable_Cause(s)\n";
      $out->{status}.="<[".simName($sim).
                      " Loop] Controller/LoopCard/LoopCable is faulty>\n";
      $out->{status}.="Recommended_Action(s)\n";
      $out->{status}.="<Verify Loop Cable is properly installed>\n";
      $out->{status}.="<Replace Controller/LoopCard/LoopCable>\n";
    }elsif($test eq "echo"){
      $out->{status} = "Command error: host busy, not connected".
                       " in point to point mode \n";
      $out->{status}.="Probable_Cause(s)\n";
      $out->{status}.="<Connection to Controller is faulty>\n";
      $out->{status}.="<Controller is not connected in point to point mode>\n";
      $out->{status}.="<Remote device does not support returning of echo frames>\n";
      $out->{status}.="Recommended_Action(s)\n";
      $out->{status}.="<Verify/Correct connection mode to adjacent device is point to point mode>\n";
      $out->{status}.="<Verify/Replace optical components (SFP/GBIC/Fiber) to adjacent device>\n";
    $out->{status}.="<Re-run Test, if problem persists Replace Controller>\n";
    }else{ 
      $out->{status} = "Command error: host busy, or no buffer available\n";
    }
    $out->{pass} = 0x4005;
  }elsif ($result=~/0x4006/i){
    $out->{status} = "Command parameter error such as frame size/transfer".
           " count is greater than spec\n";
    $out->{status}.="Probable_Cause(s)\n";
    $out->{status}.="<Bad Parameters>\n";
    $out->{status}.="Recommended_Action(s)\n";
    $out->{status}.="<Check Options>\n";
    $out->{pass} = 0x4006;
  }elsif ($result=~/0x400B/i){
    $out->{status} = "Link down error\n";
    $out->{status}.="Probable_Cause(s)\n";
    $out->{status}.="<Link under test is down>\n";
    $out->{status}.="<Bad Fiber Cable between device and switch/HBA>\n";
    $out->{status}.="<Malfunctioning HBA/Switch conneted to the Array>\n";
    $out->{status}.="<Malfunctioning Array Controller SFP>\n";
    $out->{status}.="<Malfunctioning Array Controller>\n";
    $out->{status}.="Recommended_Action(s)\n";
    $out->{status}.="<Verify link under test is not down>\n";
    $out->{status}.="<Verify Switch/HBA connected to Array is configured properly>\n";
    $out->{status}.="<Run Link Test>\n";
    $out->{status}.="<Verify/Replace optical components (SFP/GBIC/Fiber) to adjacent device>\n";
    $out->{status}.="<Replace Array Controller>\n";
    $out->{pass} = 0x400B;
  }elsif ($result=~/0x400C/i){
    $out->{status} = "Frame error\n";
    $out->{status}.="Probable_Cause(s)\n";
    $out->{status}.="<Bad Fiber Cable between device and switch/HBA>\n";
    $out->{status}.="<Link under test is down>\n";
    $out->{status}.="<Malfunctioning Array>\n";
    $out->{status}.="Recommended_Action(s)\n";
    $out->{status}.="<Verify link under test is not down>\n";
    $out->{status}.="<Verify Switch/HBA connected to Array is configured properly>\n";
    $out->{status}.="<Re-run Test, if problem persists replace array controller>\n";
    $out->{pass} = 0x400C;
  }elsif ($result=~/0x2/i){
    $out->{status}.="Probable_Cause(s)\n";
    $out->{status}.="<Controller Diabled>\n";
    $out->{status}.="Recommended_Action(s)\n";
    $out->{status}.="<Enable Controller>\n";
    $out->{pass} = 0x2;
  }elsif ($result=~/bad_arg_count/i){
    $out->{status} = "Bad argument count when command was started\n";
    $out->{status}.="Probable_Cause(s)\n";
    $out->{status}.="<Test Parameters are wrong>\n";
    $out->{status}.="Recommended_Action(s)\n";
    $out->{status}.="<Verify test parameters>\n";
    $out->{pass} = -1;
  }else{
    $out->{status} = "Unknown Error: $result\n";
    $out->{status}.="Probable_Cause(s)\n";
    $out->{status}.="Unknown";
    $out->{status}.="Recommended_Action(s)\n";
    $out->{status}.="<Re-run Test, if problem persists replace array>\n";
    $out->{pass} = -1;
  }
  return $out;
}

sub printHttpError{
  print "Probable_Cause(s)\n";
  print "<Invalid Password or Login>\n";
  print "<htm files are not on array>\n";
  print "<Ethernet is disconnected from device>\n";
  print "<Malfunctioning Array>\n";
  print "Recommended_Action(s)\n";
  print "<Enter correct Login and Password>\n";
  print "<Check power to Array>\n";
  print "<Check ethernet connections>\n";
  print "<Check ethernet connections to alternate master if available>\n";
  print "<Verify TCP/IP settings in array>\n";
  print "<Verify current htm files are in the /web directory on array>\n";
  print "<Replace Controller>\n";
  print "<Replace Array>\n";
}

sub printUsage {
  print "Usage: $TESTNAME [-yruvdlfn] [-o sysID=,enc_id={1|2},lun=]\n";
  print "Standard arguments:\n";
  print "-y      provide affirmative answer to following question:\n";
  print "\t$OffLineQuestion\n";
  print "-k      Try to abort any test currently running on $DEVICETYPE\n";
  print "-r      run on error\n";
  print "-u      list usage\n";
  print "-v      verbose mode\n";
  print "-d      debug mode \n";
  print "\n$TESTNAME specific arguments [defaults]:\n";
  print "dev=<$DEVICETYPE name or IP address>\n";
  print "controller={u1ctr|u2ctr|...|u6ctr} specify the controller to run on\n";
  print "sim={front|backend-a|backend-b|all} the chip to run loop test from\n";
  print "internal10bit=<Enable|Disable> Enable internal 10bit bus loop test\n";
  print "internal1bit=<Enable|Disable> Enable internal 1bit bus loop test\n";
  print "external=<Enable|Disable> Enable external loop test\n";
  print "\tfor front sim:\n";
  print "\t\tloop if connected in loop mode\n";
  print "\t\techo if connected in fabric mode\n";
  print "pattern=0x00000000-0xFFFFFFFF|critical|all, any 4 Byte Hex Number\n";
  print "echodatasize=<size> := 0x10, data size\n";
  print "\t max size is 220 bytes\n";
  print "loopdatasize=<size> := 0x10, data size\n";
  print "\t max size is 65528 bytes in multiples of 8\n";
  print "iterations=<number> Loopback/Echo iteration count",
  print "usr=<admin username>\n";
  print "passwd=<$DEVICETYPE admin Password>\n";
}
sub critical_pattern_array(){

my @out= 
 (
 "0x7e7e7e7e",
 "0x1e1e1e1e",
 "0xf1f1f1f1",
 "0xb5b5b5b5",
 "0x4a4a4a4a",
 "0x78787878",
 "0xe7e7e7e7",
 "0xaa55aa55",
 "0x7f7f7f7f",
 "0x0f0f0f0f",
 "0x00ff00ff",
 "0x25252525",
 );
 return \@out;
 }

sub pattern_array(){

my @out= 
 (
 "0x7e7e7e7e",
 "0x1e1e1e1e",
 "0xf1f1f1f1",
 "0xb5b5b5b5",
 "0x4a4a4a4a",
 "0x78787878",
 "0xe7e7e7e7",
 "0xaa55aa55",
 "0x7f7f7f7f",
 "0x0f0f0f0f",
 "0x00ff00ff",
 "0x25252525",

 "0xffffffff",
 "0xfefefefe",
 "0xfdfdfdfd",
 "0xfcfcfcfc",
 "0xfbfbfbfb",
 "0xfafafafa",
 "0xf9f9f9f9",
 "0xf8f8f8f8",
 "0xf7f7f7f7",
 "0xf6f6f6f6",
 "0xf5f5f5f5",
 "0xf4f4f4f4",
 "0xf3f3f3f3",
 "0xf2f2f2f2",
 "0xf0f0f0f0",
 "0x7d7d7d7d",
 "0x7c7c7c7c",
 "0x7b7b7b7b",
 "0x7a7a7a7a",
 "0x79797979",
 "0x77777777",
 "0x76767676",
 "0x75757575",
 "0x74747474",
 "0x73737373",
 "0x72727272",
 "0x71717171",
 "0x70707070",
 "0xefefefef",
 "0xeeeeeeee",
 "0xedededed",
 "0xecececec",
 "0xebebebeb",
 "0xeaeaeaea",
 "0xe9e9e9e9",
 "0xe8e8e8e8",
 "0xe6e6e6e6",
 "0xe5e5e5e5",
 "0xe4e4e4e4",
 "0xe3e3e3e3",
 "0xe2e2e2e2",
 "0xe1e1e1e1",
 "0xe0e0e0e0",
 "0x6f6f6f6f",
 "0x6e6e6e6e",
 "0x6d6d6d6d",
 "0x6c6c6c6c",
 "0x6b6b6b6b",
 "0x6a6a6a6a",
 "0x69696969",
 "0x68686868",
 "0x67676767",
 "0x66666666",
 "0x65656565",
 "0x64646464",
 "0x63636363",
 "0x62626262",
 "0x61616161",
 "0x60606060",
 "0xdfdfdfdf",
 "0xdededede",
 "0xdddddddd",
 "0xdcdcdcdc",
 "0xdbdbdbdb",
 "0xdadadada",
 "0xd9d9d9d9",
 "0xd8d8d8d8",
 "0xd7d7d7d7",
 "0xd6d6d6d6",
 "0xd5d5d5d5",
 "0xd4d4d4d4",
 "0xd3d3d3d3",
 "0xd2d2d2d2",
 "0xd1d1d1d1",
 "0xd0d0d0d0",
 "0x5f5f5f5f",
 "0x5e5e5e5e",
 "0x5d5d5d5d",
 "0x5c5c5c5c",
 "0x5b5b5b5b",
 "0x5a5a5a5a",
 "0x59595959",
 "0x58585858",
 "0x57575757",
 "0x56565656",
 "0x55555555",
 "0x54545454",
 "0x53535353",
 "0x52525252",
 "0x51515151",
 "0x50505050",
 "0xcfcfcfcf",
 "0xcececece",
 "0xcdcdcdcd",
 "0xcccccccc",
 "0xcbcbcbcb",
 "0xcacacaca",
 "0xc9c9c9c9",
 "0xc8c8c8c8",
 "0xc7c7c7c7",
 "0xc6c6c6c6",
 "0xc5c5c5c5",
 "0xc4c4c4c4",
 "0xc3c3c3c3",
 "0xc2c2c2c2",
 "0xc1c1c1c1",
 "0xc0c0c0c0",
 "0x4f4f4f4f",
 "0x4e4e4e4e",
 "0x4d4d4d4d",
 "0x4c4c4c4c",
 "0x4b4b4b4b",
 "0x49494949",
 "0x48484848",
 "0x47474747",
 "0x46464646",
 "0x45454545",
 "0x44444444",
 "0x43434343",
 "0x42424242",
 "0x41414141",
 "0x40404040",
 "0xbfbfbfbf",
 "0xbebebebe",
 "0xbdbdbdbd",
 "0xbcbcbcbc",
 "0xbbbbbbbb",
 "0xbabababa",
 "0xb9b9b9b9",
 "0xb8b8b8b8",
 "0xb7b7b7b7",
 "0xb6b6b6b6",
 "0xb4b4b4b4",
 "0xb3b3b3b3",
 "0xb2b2b2b2",
 "0xb1b1b1b1",
 "0xb0b0b0b0",
 "0x3f3f3f3f",
 "0x3e3e3e3e",
 "0x3d3d3d3d",
 "0x3c3c3c3c",
 "0x3b3b3b3b",
 "0x3a3a3a3a",
 "0x39393939",
 "0x38383838",
 "0x37373737",
 "0x36363636",
 "0x35353535",
 "0x34343434",
 "0x33333333",
 "0x32323232",
 "0x31313131",
 "0x30303030",
 "0xafafafaf",
 "0xaeaeaeae",
 "0xadadadad",
 "0xacacacac",
 "0xabababab",
 "0xaaaaaaaa",
 "0xa9a9a9a9",
 "0xa8a8a8a8",
 "0xa7a7a7a7",
 "0xa6a6a6a6",
 "0xa5a5a5a5",
 "0xa4a4a4a4",
 "0xa3a3a3a3",
 "0xa2a2a2a2",
 "0xa1a1a1a1",
 "0xa0a0a0a0",
 "0x2f2f2f2f",
 "0x2e2e2e2e",
 "0x2d2d2d2d",
 "0x2c2c2c2c",
 "0x2b2b2b2b",
 "0x2a2a2a2a",
 "0x29292929",
 "0x28282828",
 "0x27272727",
 "0x26262626",
 "0x24242424",
 "0x23232323",
 "0x22222222",
 "0x21212121",
 "0x20202020",
 "0x9f9f9f9f",
 "0x9e9e9e9e",
 "0x9d9d9d9d",
 "0x9c9c9c9c",
 "0x9b9b9b9b",
 "0x9a9a9a9a",
 "0x99999999",
 "0x98989898",
 "0x97979797",
 "0x96969696",
 "0x95959595",
 "0x94949494",
 "0x93939393",
 "0x92929292",
 "0x91919191",
 "0x90909090",
 "0x1f1f1f1f",
 "0x1d1d1d1d",
 "0x1c1c1c1c",
 "0x1b1b1b1b",
 "0x1a1a1a1a",
 "0x19191919",
 "0x18181818",
 "0x17171717",
 "0x16161616",
 "0x15151515",
 "0x14141414",
 "0x13131313",
 "0x12121212",
 "0x11111111",
 "0x10101010",
 "0x8f8f8f8f",
 "0x8e8e8e8e",
 "0x8d8d8d8d",
 "0x8c8c8c8c",
 "0x8b8b8b8b",
 "0x8a8a8a8a",
 "0x89898989",
 "0x88888888",
 "0x87878787",
 "0x86868686",
 "0x85858585",
 "0x84848484",
 "0x83838383",
 "0x82828282",
 "0x81818181",
 "0x80808080",
 "0x0e0e0e0e",
 "0x0d0d0d0d",
 "0x0c0c0c0c",
 "0x0b0b0b0b",
 "0x0a0a0a0a",
 "0x09090909",
 "0x08080808",
 "0x07070707",
 "0x06060606",
 "0x05050505",
 "0x04040404",
 "0x03030303",
 "0x02020202",
 "0x01010101",
 "0x00000000"
);
  return \@out;
}

sub testType{
  my($num, $other) = @_;
  if($num == 0){
    return "Internal 10bit";
  }elsif($num == 1){
    return "Internal 1bit";
  }elsif($num == 2){
    return "External Loop";
}

sub simName{
  my($num, $other) = @_;
  if($num == 0){
    return "Back End-A";
  }elsif($num == 1){
    return "Back End-B";
  }elsif($num == 2){
    return "Front End";}
  }
}
sub ctrlName{
  my($num, $other) = @_;
  if($num == 1){
    return "Primary";
  }elsif($num == 2){
    return "Alternate";
  }
}
sub killTest{
  print "Test Stopped\n"; 
  exit($ERROR);
}

sub run_echo{
  my ($ctrlnum, $pattern, $size, $iter, $args)=@_;
  my $results=undef;
  my $result=undef;
  my $url = "http://" . $ondgParameters{dev} . "/ofdgoper.htm";
  my ($err, $text) = Util::Http->get($url, 20,
             { password => "$ondgParameters{usr}:$ondgParameters{passwd}" } );
  my @output = split(/\n/, $text);
  foreach my $line (@output){
    if($line =~ /ondgEchoStatus/){
      (my $token1,my $token2,$result)=split(/;/,$line);
      if($result =~/in_progress/){
        print "Test in Progress, Cannot Start Test\n";
        exit(1);
      }
    }
  }
  print "Running Echo test with pattern $pattern out u"
        . $ctrlnum."ctr \n";

  $results=undef;
  $result=undef;
  #try to run this comand
  #http://auggie.central/update?ondgEchoStart=1,1,0xfeedface,0xdeedbeef,0x10
  my $command="ondgEchoStart=$ctrlnum,".
              "1,$pattern,$pattern,$size,$iter";
  my $url = "http://" . $ondgParameters{dev} . "/update?";
    #print "Issuing Command \"$command\"\n";
  my ($err, $val) = Util::Http->post($url, $command,
         20, { password => "$ondgParameters{usr}:$ondgParameters{passwd}" } );
  if($err){
    print "Error:$err Value:$val\n";
  }
  if($Options{"d"}){
    print Dumper($err)."\n";
  }
  my $url = "http://" . $ondgParameters{dev} . "/ofdgoper.htm";
  my $result;
  my @tokens;
  my @output;
  for(my $num_trys=0; $num_trys<=$RETRYS; $num_trys++){
    sleep($RETRYWAIT);
    my ($err, $text) = Util::Http->get($url, 20,
             { password => "$ondgParameters{usr}:$ondgParameters{passwd}" } );
    if (!defined($text)) {
      print $Util::Html::ERROR;
      next;
    }
   @output = split(/\n/, $text);
    foreach my $line (@output){
      if($line =~ /ondgEchoStatus/){
        $line=Util->trim($line);
        (my $junk, $line, my $junk1) = split(/;/, $line);
        @tokens =split(/,/,$line);
	$result=@tokens[3];
        if(@tokens[2] =~/in_progress/){
          if($Options{"v"}){
            print "Test in Progress\n"
          }
          sleep($RETRYWAIT);
        }elsif(defined($result)){
          $num_trys=$RETRYS; #found our answer, stop looking
        }
      }
    }
  }
  if(defined($result)){
    my ($status, $return_code)=split(/,/,$result);
    $results = interpret_ondg_result($return_code || $status, "echo", "2"); 
    if($results->{pass} == 0){
      if($Options{"v"}){
        print "PASS: Echo test out u".$ctrlnum."ctr controller passed\n";
      }
    }else{
      print "ERROR $return_code: The Echo test out  u".$ctrlnum."ctr failed!\n";
      $ERROR = $return_code;
      print $results->{status};
      exit(1);
    }
  }else{
    print "Device timed out while echo test was running!\n";
    print "Probable_Cause(s)\n";
    print "<Ethernet is disconnected from device>\n";
    print "<Device was powered off>\n";
    print "<Misconfigured TCP/IP settings in array>\n";
    print "<Malfunctioning Controller>\n";
    print "<Malfunctioning Array>\n";
    print "Recommended_Action(s)\n";
    print "<Check power to Array>\n";
    print "<Check ethernet connections>\n";
    print "<Check ethernet connections to alternate master if available>\n";
    print "<Verify TCP/IP settings in array>\n";
    print "<Replace Controller>\n";
    print "<Replace Array>\n";
    exit(-1);
  }
}

sub run_looptest{
  my ($ctrlnum,$sim,$looppath,$pattern,$size,$iter,$args)=@_;
  my $results=undef;
  my $result=undef;

  my $url = "http://" . $ondgParameters{dev} . "/ofdgoper.htm";
  my ($err, $text) = Util::Http->get($url, 20,
             { password => "$ondgParameters{usr}:$ondgParameters{passwd}" } );
  my @output = split(/\n/, $text);
  foreach my $line (@output){
    if($line =~ /ondgLoopStatus/){
      (my $token1,my $token2,$result)=split(/;/,$line);
      if($result =~/in_progress/){
        print "Test in Progress, Cannot Start Test\n";
        exit(1);
      }
    }
  }
  print "Running ".testType($looppath)." test with pattern $pattern"
        . " on the ".simName($sim)." sim of u".$ctrlnum."ctr\n";
  #try to run this comand
  #http://auggie.central/update?ondgLoopStart=1,0,1,0xfeedface,0xdeedbeef,0x10,5
  $results=undef;
  $result=undef;
  my $command="ondgLoopStart=$ctrlnum,$sim,$looppath,$pattern,$pattern,".
              "$size,$iter";
    #print "Issuing Command \"$command\"\n";
  my $url = "http://" . $ondgParameters{dev} . "/update?";
  my ($err, $val) = Util::Http->post($url, $command,
         20, { password => "$ondgParameters{usr}:$ondgParameters{passwd}" } );
  if($err){
    print "Error:$err Value:$val\n";
  }
  if($Options{"d"}){
    print Dumper($err)."\n";
  }
  my $url = "http://" . $ondgParameters{dev} . "/ofdgoper.htm";
  my $result;
  my @tokens;
  my @output;
  for(my $num_trys=0; $num_trys<=$RETRYS; $num_trys++){
    sleep($RETRYWAIT);
    my ($err, $text) = Util::Http->get($url, 20,
             { password => "$ondgParameters{usr}:$ondgParameters{passwd}" } );
    if (!defined($text)) {
      print $Util::Html::ERROR;
      next;
    }
    @output = split(/\n/, $text);
    foreach my $line (@output){
      if($line =~ /ondgLoopStatus/){
        $line=Util->trim($line);
        (my $junk, $line, my $junk1) = split(/;/, $line);
        @tokens =split(/,/,$line);
        $result=@tokens[3];
        if(@tokens[2] =~/in_progress/){
          if($Options{"v"}){
            print "Test in Progress\n"
          }
          sleep($RETRYWAIT);
        }elsif(defined($result)){
          $num_trys=$RETRYS; #found our answer, stop looking
        }
      }
    }
  }
  if(defined($result)){
    my ($status, $return_code)=split(/,/,$result);
    $results = interpret_ondg_result($return_code || $status, "loop", $sim); 
    if($results->{pass} == 0){
      if($Options{"v"}){
        print "PASS: ".testType($looppath)." test on the ".simName($sim).
              " sim of u".$ctrlnum."ctr\n";
      }
    }else{
      print "ERROR: $return_code: The "
      .testType($looppath)." test on the ".simName($sim).
            " sim of u". $ctrlnum."ctr failed!\n";
      $ERROR = $return_code;
      print $results->{status};
      exit(2);
    }
  }else{
    print "Device timed out while loop test was running!\n";
    print "Probable_Cause(s)\n";
    print "<Ethernet is disconnected from device>\n";
    print "<Device was powered off>\n";
    print "<Misconfigured TCP/IP settings in array>\n";
    print "<Malfunctioning Controller>\n";
    print "<Malfunctioning Array>\n";
    print "Recommended_Action(s)\n";
    print "<Check power to Array>\n";
    print "<Check ethernet connections>\n";
    print "<Check ethernet connections to alternate master if available>\n";
    print "<Verify TCP/IP settings in array>\n";
    print "<Replace Controller>\n";
    print "<Replace Array>\n";
    exit(-1);
  }
}
