Warning: This file has been marked up for HTML

#
# This is a Perl script to test cluster operations
#
#use File::Path;

#
# Set the datastream for a file handle to the passed in value.
#
sub SetDataStream(*$)
{
   my $fh = $_[0];
   my $dataStream = $_[1];

   my $result;
   my $command;

   $command = "<virtualIO><datastream name=\"$dataStream\"/></virtualIO>";
   seek $fh, 0, 0;
   if (!syswrite($fh, $command, length($command)))   
   {
      $result .= "Unable to write datastream command.  ";
      seek $fh, 0, 0;
      if (sysread($fh, $error, 1000)) 
      {
         $result .= $error;
      }
      $result .= "\n";
   }
   return $result;
}

#
# Write a command to a file and get the result
#
sub WriteCommand(*$)
{
   my $fh = $_[0];
   my $command = $_[1];

   my $result;

   print("command=$command\n");
   seek $fh, 0, 0;
   if (!syswrite($fh, $command, length($command)))
   {
      $result .= "Unable to write command.  ";
      seek $fh, 0, 0;
      if (sysread($fh, $error, 1000)) 
      {
         $result .= $error;
      }
      $result .= "\n";
   }
   else
   {
      seek $fh, 0, 0;
      $readLen = 999;
      while ($readLen)
      {
         $readLen = sysread($fh, $reply, 1000);
         $result .= $reply;
      }
   }
   print("result=$result\n");
   return $result;
}


#
# Parse the result of cluster operation
#
sub ParseResult($)
{
   my $xml = $_[0];
   my $result = "";

   if ($xml =~ /<failed>(.*)<\/failed>/s)
   {
      $result = $1;
      return "Failed: $1\n";
   }
   else
   {
      return "Success";
   }
}


#
# Offline Resource
#
sub OfflineResource($$)
{
   my $result;
   my $ret;
   my $server = $_[0];
   my $resName = $_[1];

   $result = "Offlining resource $resName via $server\n";
   if (!($ret = SetDataStream(RESFILE, "command")))
   {
      $result .= $ret;
      my $ncsResult = WriteCommand(RESFILE, 
               "<ncsRequest><offline>".
               "<resource>$resName</resource>".
               "</offline></ncsRequest>");
      $result .= ParseResult($ncsResult);
   }
   return $result;
}


#
# Migrate Resource
#
sub MigrateResource($$$)
{
   my $result;
   my $ret;
   my $server = $_[0];
   my $resName = $_[1];
   my $nodeName = $_[2];

   $result = "Migrating resource $resName to $nodeName via $server\n";
   if (!($ret = SetDataStream(RESFILE, "command")))
   {
      $result .= $ret;
      my $ncsResult = WriteCommand(RESFILE, 
               "<ncsRequest><migrate>".
               "<resource>$resName</resource>".
               "<node>$nodeName</node>".
               "</migrate></ncsRequest>");
      $result .= ParseResult($ncsResult);
   }
   return $result;
}


#
# Online Resource
#
sub OnlineResource($$$)
{
   my $result;
   my $ret;
   my $server = $_[0];
   my $resName = $_[1];
   my $nodeName = $_[2];

   $result = "Online resource $resName to $nodeName via $server\n";
   if (!($ret = SetDataStream(RESFILE, "command")))
   {
      $result .= $ret;
      my $ncsResult = WriteCommand(RESFILE, 
               "<ncsRequest><online>".
               "<resource>$resName</resource>".
               "<node>$nodeName</node>".
               "</online></ncsRequest>");
      $result .= ParseResult($ncsResult);
   }
   return $result;
}


#
# Resource Alert
#
sub ResourceAlert($$$)
{
   my $result;
   my $ret;
   my $server = $_[0];
   my $resName = $_[1];
   my $alert = $_[2];

   $result = "Resource $resName alert $alert via $server\n";
   if (!($ret = SetDataStream(RESFILE, "command")))
   {
      $result .= $ret;
      my $ncsResult = WriteCommand(RESFILE, 
               "<ncsRequest><alert>".
               "<resource>$resName</resource>".
               "$alert".
               "</alert></ncsRequest>");
      $result .= ParseResult($ncsResult);
   }
   return $result;
}


#
# Node Join
#
sub NodeJoin($)
{
   my $result;
   my $ret;
   my $server = $_[0];

   $result = "Node Join $server\n";
   if (!($ret = SetDataStream(NODEFILE, "command")))
   {
      $result .= $ret;
      my $ncsResult = WriteCommand(NODEFILE, 
               "<ncsRequest>".
               "<join/></ncsRequest>");
      $result .= ParseResult($ncsResult);
   }
   return $result;
}


#
# Node Leave
#
sub NodeLeave($)
{
   my $result;
   my $ret;
   my $server = $_[0];

   $result = "Node Leave $server\n";
   if (!($ret = SetDataStream(NODEFILE, "command")))
   {
      $result .= $ret;
      my $ncsResult = WriteCommand(NODEFILE, 
               "<ncsRequest>".
               "<leave/></ncsRequest>");
      $result .= ParseResult($ncsResult);
   }
   return $result;
}


#
# Main
#
{
   if ($#ARGV < 0 || $#ARGV > 0 || $ARGV[0] eq "/?" || $ARGV[0] eq "-?") 
   {
      print "USAGE: cluster.pl server\n".
         "Example: cluster server1 \n".
         "If running from a server use \".\" for the server name.";
      exit;
   }

   my $server = $ARGV[0];

   if ($server eq ".")
   {
      open(RESFILE, "+<_admin:\\Novell\\Cluster\\Resource.cmd") 
         or die "Error opening Cluster management file ($!) on server";
      open(NODEFILE, "+<_admin:\\Novell\\Cluster\\Node.cmd") 
         or die "Error opening Cluster management file ($!) on server";
   }
   else
   {
      open(RESFILE, "+<\\\\$server\\_admin\\Novell\\Cluster\\Resource.cmd") 
         or die "Error opening Cluster management file ($!)";
      open(NODEFILE, "+<\\\\$server\\_admin\\Novell\\Cluster\\Node.cmd") 
         or die "Error opening Cluster management file ($!)";
   }

   MAIN: while(TRUE) 
   {
      do 
      {
         print   "1. Migrate resource\n".
            "2. Online resource\n".
            "3. Offline resource\n".
            "4. Resource alert yes\n".
            "5. Resource alert no\n".
            "6. Node join cluster\n".
            "7. Node leave cluster\n".
            "Select action: ";
         chomp($action = <STDIN>);
      } while ($action != 0  && ($action < 1 || $action > 7));

      if ($action == 1)
      {
         print "Resource name: ";
         chomp(my $resName = <STDIN>);
         print "Node  name: ";
         chomp(my $nodeName = <STDIN>);
         my @results = MigrateResource($server, $resName, $nodeName);
         print "---------------------------\n\n";
         print @results;
         print "\n---------------------------\n\n";
      }
      elsif ($action == 2) 
      {
         print "Resource name: ";
         chomp(my $resName = <STDIN>);
         print "Node  name: ";
         chomp(my $nodeName = <STDIN>);
         my @results = OnlineResource($server, $resName, $nodeName);
         print "---------------------------\n\n";
         print @results;
         print "\n---------------------------\n\n";
      }
      elsif ($action == 3) 
      {
         print "Resource name: ";
         chomp(my $resName = <STDIN>);
         my @results = OfflineResource($server, $resName);
         print "---------------------------\n\n";
         print @results;
         print "\n---------------------------\n\n";
      }
      elsif ($action == 4) 
      {
         print "Resource name: ";
         chomp(my $resName = <STDIN>);
         my @results = ResourceAlert($server, $resName, "<yes/>");
         print "---------------------------\n\n";
         print @results;
         print "\n---------------------------\n\n";
      }
      elsif ($action == 5) 
      {
         print "Resource name: ";
         chomp(my $resName = <STDIN>);
         my @results = ResourceAlert($server, $resName, "<no/>");
         print "---------------------------\n\n";
         print @results;
         print "\n---------------------------\n\n";
      }
      elsif ($action == 6) 
      {
         my @results = NodeJoin($server);
         print "---------------------------\n\n";
         print @results;
         print "\n---------------------------\n\n";
      }
      elsif ($action == 7) 
      {
         my @results = NodeLeave($server);
         print "---------------------------\n\n";
         print @results;
         print "\n---------------------------\n\n";
      }
      else
      {
         last MAIN;
      }
   }
   close(RESFILE);
   close(NODEFILE);
}