#!/usr/bin/perl
# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
#  
#  
# Licensed Materials - Property of IBM 
#  
# (C) COPYRIGHT International Business Machines Corp. 2004,2019 
# All Rights Reserved 
#  
# US Government Users Restricted Rights - Use, duplication or 
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 
#  
# IBM_PROLOG_END_TAG 
# sccsid = "@(#)99   1.18   src/rsct/rm/LPRM/cli/bin/runlpcmd.perl, LPRM, rsct_rady, rady2035a 11/12/15 16:38:36"

# Run a LP command in the RMC IBM.LPCommands class

use strict;
use locale;
BEGIN
  {
 # this enables us to redirect where it looks for other RSCT files during development
 $::rsctroot = $ENV{'RSCT_ROOT'} || '/opt/rsct';
 $::rsctpm = "$::rsctroot/pm";
 $::rsctmsgmaps = "$::rsctroot/msgmaps";
  }

use lib $::rsctpm;
use Getopt::Std;
use CT_cli_utils qw(printIMsg printEMsg);
use LPRM_cli_utils qw(process_api_error process_exit_code remove_api_error);
use LPRM_cli_include qw($DELIMITERI $DELIMITERO);
use Socket;

$main::PROGNAME = 'runlpcmd';
$main::MSGCAT = 'lprmcli.cat';
$main::LSMSG = '/opt/rsct/bin/ctdspmsg';

# For the usage, see sensorcli.msg
sub usage { printIMsg('IMsgRunlpcmdUsageFixed2');  exit (scalar(@_) ? $_[0] : 1); }

# Parse the cmd line args and check them
#if (! getopts('an:hvV') ) { &usage; }
if (! getopts('an:NhTV') ) { &usage(3); }
#if (scalar(@ARGV) < 1 || $::opt_h) { &usage; }
if ($::opt_h) { &usage(0); }
if (scalar(@ARGV) < 1) { &usage(4); }
if ($::opt_a && $::opt_n) { &usage(5); }
#if ($::opt_V) { $::opt_v = 1; }

my $selectstr="";

if (defined($::opt_N))
   {
    my $name = shift @ARGV;
    $selectstr = "Name='$name'";

   }
else
   {
    my $runcmdname = shift @ARGV;
    $selectstr = "RunCmdName='$runcmdname'";
   }

if ($::opt_a || defined($::opt_n))
  {
 #todo: support symbolic names for values 2 and 3
 if ($ENV{CT_MANAGEMENT_SCOPE}!=2 && $ENV{CT_MANAGEMENT_SCOPE}!=3) { $ENV{CT_MANAGEMENT_SCOPE}=4; }
  }
else { $ENV{CT_MANAGEMENT_SCOPE}=1; }

if (defined($::opt_n))
  {
        my @nodes = split(/[, ]+/,$::opt_n);
        if (length($selectstr)) { $selectstr .= ' && '; }
        $selectstr .= q/NodeNameList IN ('/ . join("','",@nodes) . q/')/;
  }

if (length($selectstr)) { $selectstr = qq("$selectstr"); }

my $clparams = "";
if (scalar(@ARGV) <1)
  {
    #$clparams = '\" \"'; #to run command without any parameters
    $clparams = "\\\"\\\"";
  }
else
  {
     $clparams = "@ARGV";
     if (!length($clparams))
         { $clparams = "\\\"\\\""; }
  }

my $cmd = "";
if ($::opt_T) {print STDERR "$main::PROGNAME: calling runact-api to run LP comamnd\n ";}
if (defined($::opt_N))
   { 
    $cmd = qq(/usr/bin/runact-api -I $DELIMITERI -D $DELIMITERO -s IBM.LPCommands${DELIMITERI}${selectstr}${DELIMITERI}RunRootCommand${DELIMITERI}CLParams${DELIMITERI}"$clparams" 2>&1);
   }
else
   { 
    $cmd = qq(/usr/bin/runact-api -I $DELIMITERI -D $DELIMITERO -P IBM.LPCommands${DELIMITERI}x${DELIMITERI}1${DELIMITERI}${selectstr}${DELIMITERI}RunRootCommand${DELIMITERI}CLParams${DELIMITERI}"$clparams" 2>&1);
   }

if ($::opt_V) { $main::PROGNAME = 'lslpcmd'; printIMsg('IMsgRmcCmd', $cmd); $main::PROGNAME = 'runlpcmd'; }
#if ($::opt_v) { $main::PROGNAME = 'lslpcmd'; printIMsg('IMsgRmcCmd', $cmd); $main::PROGNAME = 'runlpcmd'; }

my @output = `$cmd`;

#my $rc = $? >> 8;
my $rc = $?;
$rc = process_exit_code($rc);

# if RC (rc from LP Command) not 0, then print stderr and RC 
# if RC (rc from LPCommand) is 0, then print stdout

if ($rc && !$::opt_a && !$::opt_n) #print the error
  {
        if ($::opt_T) {print STDERR "$main::PROGNAME: runact-api returned $rc\n ";}
        #if (!$::opt_V) { $output[0] =~ s/.*::.*::.*::.*::.*:://; }
        #if (!$::opt_v) { $output[0] =~ s/.*::.*::.*::.*::.*:://; }
        #print @output;
        process_api_error($DELIMITERO,$rc,@output);
        exit $rc;
  }
else # if rc == 0, then there may be a valid stderr/stdout  
 {
  # print errors and remove them from the output
  process_api_error($DELIMITERO,$rc,@output);
  @output = remove_api_error(@output);
  my $firsttime=1;
  foreach my $outelt(@output){
  if ($::opt_a || $::opt_n)
      {
       if (!$firsttime)
          {print "-------------------\n";}
       else
          {$firsttime = 0;}
       if ($rc && $outelt =~ /^ERROR.*/)
         { 
           if (!$::opt_V) { $outelt =~ s/.*${DELIMITERO}.*${DELIMITERO}.*${DELIMITERO}.*${DELIMITERO}.*${DELIMITERO}//; } 
           print $outelt; 
           next;
         }
      }
  my $RCpos = rindex($outelt,"${DELIMITERO}RC${DELIMITERO}")+ length("${DELIMITERO}RC${DELIMITERO}");
  my $lpRC = substr($outelt, $RCpos) ;
  #check the return code from LP command, if non-zero print stderr and RC
  #if ($lpRC != 0)
  #   {
  #    my $errPos = index($output[0],"::Stderr::")+ length("::");
  #    my $stderr = substr($output[0],$errPos,($RCpos-6)-($errPos));
  #    print $stderr."\n";
  #    print "RC = $lpRC\n";
  #   } 
  #else # if return code from LP command is 0, print stdout if any.
  #   {

  #116914 print stderr, stdout and RC 
  #116914 first print stderr

  my $errPos = index($outelt,"${DELIMITERO}Stderr${DELIMITERO}")+ length("${DELIMITERO}Stderr${DELIMITERO}");
  #my $stderr = substr($outelt,$errPos,($RCpos-6)-($errPos));
  my $stderr = substr($outelt,$errPos,($RCpos - length("${DELIMITERO}RC${DELIMITERO}") - $errPos));

  #print STDERR $stderr."\n";
  my @displayerr = split(/\\n/,$stderr);
  foreach my $errvar(@displayerr)
    {print STDERR "$errvar\n";}

  #now print STOUT

  my $outPos = index($outelt,"${DELIMITERO}Stdout${DELIMITERO}") + length("${DELIMITERO}Stdout${DELIMITERO}");
  my $stdout = substr($outelt, $outPos ,index($outelt,"${DELIMITERO}Stderr${DELIMITERO}")-$outPos);
  my @displayout = split(/\\n/,$stdout); 
  foreach my $outvar(@displayout)
         {print "$outvar\n";}

  #Now print RC
  print "RC = $lpRC";

  #print "$stdout\n"; not formatted
  #   }
 }#end of for 
}
exit $rc;