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