From fba82fb8ca675144e278101dfb7aa3a641a01102 Mon Sep 17 00:00:00 2001 From: lissav Date: Tue, 27 Nov 2007 14:22:04 +0000 Subject: [PATCH] Added runcmd subroutine to support dsh and cfm git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@83 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- perl-xCAT-2.0/xCAT/Utils.pm | 115 ++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/perl-xCAT-2.0/xCAT/Utils.pm b/perl-xCAT-2.0/xCAT/Utils.pm index 2f7439f06..18d0e8633 100644 --- a/perl-xCAT-2.0/xCAT/Utils.pm +++ b/perl-xCAT-2.0/xCAT/Utils.pm @@ -408,4 +408,119 @@ sub get_site_attribute return $values; } + +#------------------------------------------------------------------------------- + +=head3 runcmd + Run the given cmd and return the output in an array (already chopped). + Alternately, if this function is used in a scalar context, the output + is joined into a single string with the newlines separating the lines. + + Arguments: + command, exitcode and reference to output + Returns: + see below + Globals: + $::RUNCMD_RC + Error: + Normally, if there is an error running the cmd,it will display the + error and exit with the cmds exit code, unless exitcode + is given one of the following values: + 0: display error msg, DO NOT exit on error, but set + $::RUNCMD_RC to the exit code. + -1: DO NOT display error msg and DO NOT exit on error, but set + $::RUNCMD_RC to the exit code. + -2: DO the default behavior (display error msg and exit with cmds + exit code. + number > 0: Display error msg and exit with the given code + + Example: + my $outref = xCAT::Utils->runcmd($cmd, -2, 1); + + Comments: + If refoutput is true, then the output will be returned as a + reference to an array for efficiency. + + +=cut + +#------------------------------------------------------------------------------- +sub runcmd + +{ + + my ($class, $cmd, $exitcode, $refoutput) = @_; + $::RUNCMD_RC = 0; + if (!$xCAT::Utils::NO_STDERR_REDIRECT) + { + if (!($cmd =~ /2>&1$/)) { $cmd .= ' 2>&1'; } + + } + if (!$xCAT::Utils::NO_MESSAGES) + { + xCAT::MsgUtils->message("V", "Running Command: $cmd\n"); + + } + my $outref = []; + @$outref = `$cmd`; + if ($?) + { + $::RUNCMD_RC = $? >> 8; + my $displayerror = 1; + my $rc; + if (defined($exitcode) && length($exitcode) && $exitcode != -2) + { + if ($exitcode > 0) + { + $rc = $exitcode; + } # if not zero, exit with specified code + elsif ($exitcode <= 0) + { + $rc = ''; # if zero or negative, do not exit + if ($exitcode < 0) { $displayerror = 0; } + } + } + else + { + $rc = $::RUNCMD_RC; + } # if exitcode not specified, use cmd exit code + if ($displayerror) + { + my $errmsg = ''; + if (xCAT::Utils->isLinux() && $::RUNCMD_RC == 139) + { + $errmsg = "Segmentation fault $errmsg"; + } + else + { + $errmsg = join('', @$outref); + chomp $errmsg; + + } + if (!$xCAT::Utils::NO_MESSAGES) + { + xCAT::MsgUtils->message("E", + "Command failed: $cmd. Error message: $errmsg.\n"); + } + $xCAT::Utils::errno = 29; + } + } + if ($refoutput) + { + chomp(@$outref); + return $outref; + } + elsif (wantarray) + { + chomp(@$outref); + return @$outref; + } + else + { + my $line = join('', @$outref); + chomp $line; + return $line; + } + +} 1;