Author: arkurth
Date: Thu May  7 20:18:24 2009
New Revision: 772761

URL: http://svn.apache.org/viewvc?rev=772761&view=rev
Log:
VCL-23
Windows_mod.pm
-Modified delete_files_by_pattern(). It now runs chmod before attempting to 
delete a file in case root doesn't have permission to do so
-Modified reboot(), wait_for_ping(), wait_for_no_ping(), and wait_for_ssh(). 
Changed timing to work better with VMWare images, which take less time to 
reboot.
-Fixed bug in get_private_interface_names() and get_public_interface_names(). 
It was ignoring the adapters under VMWare because they had VM in the interface 
name.
-Added kill_process() subroutine.

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

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows_mod.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows_mod.pm?rev=772761&r1=772760&r2=772761&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows_mod.pm 
(original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows_mod.pm Thu May 
 7 20:18:24 2009
@@ -854,19 +854,23 @@
                notify($ERRORS{'WARNING'}, 0, "base directory and pattern must 
be specified as arguments");
                return;
        }
+       
+       # Make sure base directory has trailing / or else find will fail
+       $base_directory =~ s/[\/\\]*$/\//;
 
        notify($ERRORS{'DEBUG'}, 0, "attempting to delete files under 
$base_directory matching pattern $pattern");
-
-
+       
        # Assemble command
-       my $command = "/bin/find.exe \"$base_directory\" -mindepth 1 -iregex 
\"$pattern\" -print0 | xargs -0 rm -rvf";
-       my ($exit_status, $output) = run_ssh_command($computer_node_name, 
$management_node_keys, $command, '', '', 0);
-       if (defined($exit_status) && $exit_status == 0) {
-               notify($ERRORS{'OK'}, 0, "files have been deleted under 
'$base_directory' matching pattern '$pattern'");
-       }
-       elsif ($exit_status) {
-               notify($ERRORS{'WARNING'}, 0, "failed to delete files under 
$base_directory matching pattern $pattern, exit status: $exit_status, 
output:\...@{$output}");
-               return;
+       # Use find to locate all the files under the base directory matching 
the pattern specified
+       # chmod 777 each file then call rm
+       my $command = "/bin/find.exe \"$base_directory\" -mindepth 1 -iregex 
\"$pattern\" -exec chmod 777 {} \\; -exec rm -rvf {} \\;";
+       my ($exit_status, $output) = run_ssh_command($computer_node_name, 
$management_node_keys, $command, '', '', 1);
+       if (defined($exit_status)) {
+               my @deleted = grep(/removed /, @$output);
+               my @not_deleted = grep(/cannot remove/, @$output);
+               notify($ERRORS{'OK'}, 0, scalar @deleted . "/" . scalar 
@not_deleted . " files deleted deleted under '$base_directory' matching 
'$pattern'");
+               notify($ERRORS{'DEBUG'}, 0, "files/directories which were 
deleted:\n" . join("\n", @deleted)) if @deleted;
+               notify($ERRORS{'DEBUG'}, 0, "files/directories which were NOT 
deleted:\n" . join("\n", @not_deleted)) if @not_deleted;
        }
        else {
                notify($ERRORS{'WARNING'}, 0, "failed to run SSH command to 
delete files under $base_directory matching pattern $pattern");
@@ -2259,8 +2263,8 @@
        }
 
        # Wait for reboot is true
-       notify($ERRORS{'OK'}, 0, "sleeping for 30 seconds while 
$computer_node_name begins to boot");
-       sleep 30;
+       notify($ERRORS{'OK'}, 0, "sleeping for 5 seconds while 
$computer_node_name begins to reboot");
+       sleep 5;
 
        # Make multiple attempts to wait for the reboot to complete
        my $wait_attempt_limit = 2;
@@ -2280,17 +2284,17 @@
                        }
                } ## end if ($wait_attempt > 1)
 
-               # Wait maximum of 2 minutes for the computer to become 
unresponsive
-               if (!$self->wait_for_no_ping(2)) {
+               # Wait maximum of 3 minutes for the computer to become 
unresponsive
+               if (!$self->wait_for_no_ping(3)) {
                        # Computer never stopped responding to ping
                        notify($ERRORS{'WARNING'}, 0, "$computer_node_name 
never became unresponsive to ping");
                        next WAIT_ATTEMPT;
                }
 
                # Computer is unresponsive, reboot has begun
-               # Wait for 30 seconds before beginning to check if computer is 
back online
-               notify($ERRORS{'DEBUG'}, 0, "$computer_node_name reboot has 
begun, sleeping for 30 seconds");
-               sleep 30;
+               # Wait for 15 seconds before beginning to check if computer is 
back online
+               notify($ERRORS{'DEBUG'}, 0, "$computer_node_name reboot has 
begun, sleeping for 15 seconds");
+               sleep 15;
 
                # Wait maximum of 4 minutes for the computer to come back up
                if (!$self->wait_for_ping(4)) {
@@ -2363,10 +2367,10 @@
 
        # Looping configuration variables
        # Seconds to wait in between loop attempts
-       my $attempt_delay = 15;
+       my $attempt_delay = 5;
        # Total loop attempts made
        # Add 1 to the number of attempts because if you're waiting for x 
intervals, you check x+1 times including at 0
-       my $attempts = ($total_wait_minutes * 4) + 1;
+       my $attempts = ($total_wait_minutes * 12) + 1;
 
        notify($ERRORS{'OK'}, 0, "waiting for $computer_node_name to respond to 
ping, maximum of $total_wait_minutes minutes");
 
@@ -2418,10 +2422,10 @@
 
        # Looping configuration variables
        # Seconds to wait in between loop attempts
-       my $attempt_delay = 15;
+       my $attempt_delay = 5;
        # Total loop attempts made
        # Add 1 to the number of attempts because if you're waiting for x 
intervals, you check x+1 times including at 0
-       my $attempts = ($total_wait_minutes * 4) + 1;
+       my $attempts = ($total_wait_minutes * 12) + 1;
 
        notify($ERRORS{'OK'}, 0, "waiting for $computer_node_name to become 
unresponsive, maximum of $total_wait_minutes minutes");
 
@@ -2477,10 +2481,10 @@
 
        # Looping configuration variables
        # Seconds to wait in between loop attempts
-       my $attempt_delay = 15;
+       my $attempt_delay = 5;
        # Total loop attempts made
        # Add 1 to the number of attempts because if you're waiting for x 
intervals, you check x+1 times including at 0
-       my $attempts = ($total_wait_minutes * 4) + 1;
+       my $attempts = ($total_wait_minutes * 12) + 1;
 
        notify($ERRORS{'OK'}, 0, "waiting for $computer_node_name to respond to 
ssh, maximum of $total_wait_minutes minutes");
 
@@ -4060,14 +4064,15 @@
                        notify($ERRORS{'DEBUG'}, 0, "interface does not have an 
ip address: $interface_name");
                        next;
                }
-
+               
                # Split the ip address up
                my @octets = split(/\./, $ip_address);
 
                # Figure out if this is a private or public address
 
                # Private: 10.0.0.0 10.255.255.255 16,777,216
-               if (($interface_name . $description) =~ 
/loopback|virtual|pseudo|vmware|afs/i) {
+               if ($interface_name =~ /loopback|virtual|pseudo|vmware|afs/i) {
+                       notify($ERRORS{'DEBUG'}, 0, "interface ignored because 
of name: $interface_name, description: $description, address: $ip_address");
                        next;
                }
                elsif (($octets[0] == 10) ||
@@ -4138,7 +4143,8 @@
 
                # Figure out if this is a public or public address
                # Igore loopback and other interface names
-               if (($interface_name . $description) =~ 
/loopback|virtual|pseudo|vmware|afs/i) {
+               if ($interface_name =~ /loopback|virtual|pseudo|vmware|afs/i) {
+                       notify($ERRORS{'DEBUG'}, 0, "interface ignored because 
of name: $interface_name, description: $description, address: $ip_address");
                        next;
                }
                # Private: 10.0.0.0 10.255.255.255 16,777,216
@@ -5883,7 +5889,69 @@
        else {
                return 1;
        }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 kill_process
+
+ Parameters  : String containing task name pattern
+ Returns     : If successful: true
+               If failed: false
+ Description : Runs taskkill.exe to kill processes with names matching a
+                                       pattern. Wildcards can be specified 
using *, but task name
+                                       patterns cannot begin with a *.
+               
+               Example pattern: notepad*
+
+=cut
+
+sub kill_process {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine can only be called 
as a VCL::Module module object method");
+               return; 
+       }
+       
+       # Get the task name pattern argument
+       my $task_pattern = shift;
+       unless ($task_pattern) {
+               notify($ERRORS{'WARNING'}, 0, "task name pattern argument was 
not specified");
+               return; 
+       }
+       
+       my $management_node_keys = $self->data->get_management_node_keys();
+       my $computer_node_name   = $self->data->get_computer_node_name();
+       
+       # Typical output:
+       # Task was killed, exit status = 0:
+       # SUCCESS: The process with PID 3476 child of PID 5876 has been 
terminated.
+       
+       # No tasks match pattern, exit status = 0:
+       # INFO: No tasks running with the specified criteria.
        
+       # Bad search filter, exit status = 1:
+       # ERROR: The search filter cannot be recognized.
+       
+       # Attempt to kill task
+       my $taskkill_command = "\$SYSTEMROOT/system32/taskkill.exe /F /T /FI 
\"IMAGENAME eq $task_pattern\"";
+       my ($taskkill_exit_status, $taskkill_output) = 
run_ssh_command($computer_node_name, $management_node_keys, $taskkill_command, 
'', '', '1');
+       if (defined($taskkill_exit_status) && $taskkill_exit_status == 0 && (my 
@killed = grep(/SUCCESS/, @$taskkill_output))) {
+               notify($ERRORS{'OK'}, 0, scalar @killed . "processe(s) killed 
matching pattern: $task_pattern\n" . join("\n", @killed));
+       }
+       elsif (defined($taskkill_exit_status) && $taskkill_exit_status == 0 && 
grep(/No tasks running/i, @{$taskkill_output})) {
+               notify($ERRORS{'DEBUG'}, 0, "process does not exist matching 
patterh: $task_pattern");
+       }
+       elsif (defined($taskkill_exit_status)) {
+               notify($ERRORS{'WARNING'}, 0, "unable to kill process matching 
$task_pattern\n" . join("\n", @{$taskkill_output}));
+               return;
+       }
+       else {
+               notify($ERRORS{'WARNING'}, 0, "failed to run ssh command to 
kill process matching $task_pattern");
+               return;
+       }
+       
+       return 1;
 }
 
 #/////////////////////////////////////////////////////////////////////////////


Reply via email to