Author: arkurth
Date: Thu May 17 19:57:36 2012
New Revision: 1339829

URL: http://svn.apache.org/viewvc?rev=1339829&view=rev
Log:
VCL-503
Updated OS.pm::execute to be allow it to be called as a regular function (not 
required to be called as an object reference).

Modified:
    incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm?rev=1339829&r1=1339828&r2=1339829&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm Thu May 17 19:57:36 
2012
@@ -1813,30 +1813,78 @@ sub get_file_contents {
 
 sub execute {
 #return execute_new(@_);
-       my $self = shift;
-       unless (ref($self) && $self->isa('VCL::Module')) {
-               notify($ERRORS{'CRITICAL'}, 0, "subroutine can only be called 
as an object method");
-               return;
+               my $self = shift;
+               ($argument) = @_;
+               
+               #notify($ERRORS{'DEBUG'}, 0, "called as an object method: " . 
ref($self));
+               
+               # Get the computer name from the reservation data
+               $computer_name = $self->data->get_computer_node_name();
+               if (!$computer_name) {
+                       notify($ERRORS{'WARNING'}, 0, "called as an object 
method, failed to retrieve computer name from reservation data");
+                       return;
+               }
+               #notify($ERRORS{'DEBUG'}, 0, "retrieved computer name from 
reservation data: $computer_name");
+       }
+       
+       # Check the argument type
+       if (ref($argument)) {
+               if (ref($argument) eq 'HASH') {
+                       #notify($ERRORS{'DEBUG'}, 0, "first argument is a hash 
reference:\n" . format_data($argument));
+                       
+                       $computer_name = $argument->{node} if (!$computer_name);
+                       $command = $argument->{command};
+                       $display_output = $argument->{display_output};
+                       $timeout_seconds = $argument->{timeout};
+                       $max_attempts = $argument->{max_attempts};
+                       $port = $argument->{port};
+                       $user = $argument->{user};
+                       $password = $argument->{password};
+                       $identity_key = $argument->{identity_key};
+                       $ignore_error = $argument->{ignore_error};
+               }
+               else {
+                       notify($ERRORS{'WARNING'}, 0, "invalid argument 
reference type passed: " . ref($argument) . ", if a reference is passed as the 
argument it may only be a hash or VCL::Module reference");
+                       return;
+               }
+       }
+       else {
+               # Argument is not a reference, computer name must be the first 
argument unless this subroutine was called as an object method
+               # If called as an object method, $computer_name will already be 
populated
+               if (!$computer_name) {
+                       $computer_name = shift;
+                       #notify($ERRORS{'DEBUG'}, 0, "first argument is a 
scalar, should be the computer name: $computer_name, remaining arguments:\n" . 
format_data(\@_));
+               }
+               else {
+                       #notify($ERRORS{'DEBUG'}, 0, "first argument should be 
the command:\n" . format_data(\@_));
+               }
+               
+               # Get the remaining arguments
+               ($command, $display_output, $timeout_seconds, $max_attempts, 
$port, $user, $password, $identity_key, $ignore_error) = @_;
        }
        
-       # Get the command argument
-       my $command = shift;
+       if (!$computer_name) {
+               notify($ERRORS{'WARNING'}, 0, "computer name could not be 
determined");
+               return;
+       }
        if (!$command) {
                notify($ERRORS{'WARNING'}, 0, "command argument was not 
specified");
                return;
        }
        
-       # Get 2nd display output argument if supplied, or set default value
-       my $display_output = shift || '0';
-       
-       # Get the computer node name
-       my $computer_name = $self->data->get_computer_node_name() || return;
-       
-       # Get the identity keys used by the management node
-       my $management_node_keys = $self->data->get_management_node_keys() || 
'';
+       my $arguments = {
+               node => $computer_name,
+               command => $command,
+               identity_paths => $identity_key,
+               user => $user,
+               port => $port,
+               output_level => $display_output,
+               max_attempts => $max_attempts,
+               timeout_seconds => $timeout_seconds,
+       };
        
        # Run the command via SSH
-       my ($exit_status, $output) = run_ssh_command($computer_name, 
$management_node_keys, $command, '', '', $display_output);
+       my ($exit_status, $output) = run_ssh_command($arguments);
        if (defined($exit_status) && defined($output)) {
                if ($display_output) {
                        notify($ERRORS{'OK'}, 0, "executed command: '$command', 
exit status: $exit_status, output:\n" . join("\n", @$output));


Reply via email to