# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
#-------------------------------------------------------

=head1
  xCAT plugin package to handle xCATWorld

   Supported command:
         xCATWorld->xCATWorld
         xCATWorld->xCATWorld

=cut

#-------------------------------------------------------
package xCAT_plugin::xCATWorld;
use Sys::Hostname;
use xCAT::Table;

use xCAT::Utils;
use xCAT::TableUtils;
use xCAT::ServiceNodeUtils;
use xCAT::MsgUtils;
use Getopt::Long;
use strict;
1;

#-------------------------------------------------------

=head3  handled_commands

Return list of commands handled by this plugin

=cut

#-------------------------------------------------------

sub handled_commands
{
    return {xCATWorld => "xCATWorld"};
}

#-------------------------------------------------------

=head3  preprocess_request

  Check and setup for hierarchy , if your command must run
  on service nodes. Otherwise preprocess_request not necessary   

=cut

#-------------------------------------------------------
sub preprocess_request
{
    my $req = shift;
    my $callback  = shift;
    my $subreq = shift;
     $::CALLBACK = $callback;
    #if already preprocessed, go straight to request
    if (($req->{_xcatpreprocessed}) and ($req->{_xcatpreprocessed}->[0] == 1) ) { return [$req]; }
    my $nodes    = $req->{node};
    my $service  = "xcat";

    # find service nodes for requested nodes
    # build an individual request for each service node
    if ($nodes) {
     my $sn = xCAT::ServiceNodeUtils->get_ServiceNode($nodes, $service, "MN");
     my @requests;
      # build each request for each service node

      foreach my $snkey (keys %$sn)
      {
            my $n=$sn->{$snkey};
            my $reqcopy = {%$req};
            $reqcopy->{node} = $sn->{$snkey};
            $reqcopy->{'_xcatdest'} = $snkey;
            $reqcopy->{_xcatpreprocessed}->[0] = 1;
            push @requests, $reqcopy;

      }
      return \@requests;  # return requests for all Service nodes
    } else {
      return [$req];   # just return original request
    }
}

#-------------------------------------------------------

=head3  process_request

  Process the command

=cut

#-------------------------------------------------------
sub process_request
{

    my $request  = shift;
    my $callback = shift;
    my $subreq    = shift;
    my $nodes    = $request->{node};
    my $command  = $request->{command}->[0];
    my $args     = $request->{arg};
    my $envs     = $request->{env};
    my %rsp;
    my @nodes=@$nodes; 
    @ARGV = @{$args};    # get arguments
    $::CALLBACK=$callback; 
    # do your processing here
    # return info
    Getopt::Long::Configure("posix_default");
    Getopt::Long::Configure("no_gnu_compat");
    Getopt::Long::Configure("bundling");
    my %options = ();
if (
        !GetOptions(
            'h|help'                   => \$options{'help'},
            'v|version'                => \$options{'version'},
            'V|Verbose'                => \$options{'verbose'}
        )
      )
    {  
        xCAT::DSHCLI->usage_dsh;
        exit 1;
    }
    if ($options{'help'})
    {
        &usage;
        exit 0;
    }

   if ($options{'version'})
    {
        my $version = xCAT::Utils->Version();
        #$version .= "\n";
        my $rsp={};
        $rsp->{data}->[0] = $version;        
        xCAT::MsgUtils->message("I",$rsp,$callback, 0);
        exit 0;
    }
    # Here you call plugin to plugin
    # call another plugin
    # save your callback function

   my $out=xCAT::Utils->runxcmd( { command => ['xdsh'],
                                    node    => \@nodes,
                                    arg     => [ "-v","ls /tmp" ]
                             }, $subreq, 0,1);


    my $host=hostname();
    my $rsp={};
    $rsp->{data}->[0] = "Hello World from $host! I can process the following nodes:";
    xCAT::MsgUtils->message("I", $rsp, $callback, 0);
    foreach my $node (@nodes)
    {
        $rsp->{data}->[0] .= "$node\n";
    }
    xCAT::MsgUtils->message("I", $rsp, $callback, 0);
    return;

}
#-------------------------------------------------------------------------------

=head3
      usage

        puts out  usage message  for help

        Arguments:
          None

        Returns:

        Globals:

        Error:
                None


=cut

#-------------------------------------------------------------------------------

sub usage
{
## usage message
      my $usagemsg  = " xCATWorld -h \n xCATWorld -v \n xCATWorld -V \n";
      $usagemsg .= " xCATWorld  <noderange> ";
###  end usage mesage
        my $rsp = {};
        $rsp->{data}->[0] = $usagemsg;
        xCAT::MsgUtils->message("I", $rsp, $::CALLBACK);
  return;
}