You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by ar...@apache.org on 2010/12/08 20:37:49 UTC

svn commit: r1043634 - /incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm

Author: arkurth
Date: Wed Dec  8 19:37:49 2010
New Revision: 1043634

URL: http://svn.apache.org/viewvc?rev=1043634&view=rev
Log:
VCL-422
Updated Windows.pm::clean_hard_drive to detect if cleanmgr.exe exists.  This utility is not installed by default on some newer versions of Windows.  It gets installed with the Desktop Optimization feature.  If not installed, a warning would be displayed during capture.  This update should prevent the warning from appearing.

Also updated to code to launch cleanmgr.exe and immediately return. This should prevent a situation where an image capture process would hang indefinitely if cleanmgr.exe encounters a problem such as a corrupt Recycle Bin.  When this happens, the utility displays a warning on the screen.

Added Windows.pm::is_process_running.  This is called by clean_hard_drive to detect when cleanmgr.exe is finished.  It waits 2 minutes and displays a warning if cleanmgr.exe is still running, then proceeds with the capture.

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

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm?rev=1043634&r1=1043633&r2=1043634&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm Wed Dec  8 19:37:49 2010
@@ -6589,25 +6589,84 @@ EOF
 	}
 	
 	# Run cleanmgr.exe
-	my $command = $system32_path . '/cleanmgr.exe /SAGERUN:01';
-	my ($status_cleanmgr, $output_cleanmgr) = run_ssh_command($computer_node_name, $management_node_keys, $command);
-	if (defined($status_cleanmgr) && $status_cleanmgr == 0) {
-		notify($ERRORS{'OK'}, 0, "ran cleanmgr.exe");
+	# The cleanmgr.exe file may not be present - it is not installed by default on Windows Server 2008 and possibly others
+	my $cleanmgr_command = "/bin/cygstart.exe $system32_path/cleanmgr.exe /SAGERUN:01";
+	my ($cleanmgr_exit_status, $cleanmgr_output) = run_ssh_command($computer_node_name, $management_node_keys, $cleanmgr_command);
+	if (!defined($cleanmgr_output)) {
+		notify($ERRORS{'WARNING'}, 0, "failed to run ssh command to run cleanmgr.exe");
+		return;
 	}
-	elsif (defined($status_cleanmgr)) {
-		notify($ERRORS{'WARNING'}, 0, "failed to run cleanmgr.exe, exit status: $status_cleanmgr, output:\n@{$output_cleanmgr}");
-		return 0;
+	elsif (grep(/not found/i, @$cleanmgr_output)) {
+		notify($ERRORS{'OK'}, 0, "cleanmgr.exe is not present on $computer_node_name, this is usually because the Desktop Experience feature is not installed");
 	}
 	else {
-		notify($ERRORS{'WARNING'}, 0, "unable to run ssh command to run cleanmgr.exe");
-		return 0;
+		# Wait for cleanmgr.exe to finish
+		my $message = 'waiting for cleanmgr.exe to finish';
+		my $total_wait_seconds = 120;
+		notify($ERRORS{'OK'}, 0, "started cleanmgr.exe, waiting up to $total_wait_seconds seconds for it to finish");
+		
+		if ($self->code_loop_timeout(sub{!$self->is_process_running(@_)}, ['cleanmgr.exe'], $message, $total_wait_seconds, 5)) {
+			notify($ERRORS{'DEBUG'}, 0, "cleanmgr.exe has finished");
+		}
+		else {
+			notify($ERRORS{'WARNING'}, 0, "cleanmgr.exe has not finished after waiting $total_wait_seconds seconds, the Recycle Bin may be corrupt");
+		}
 	}
-
+	
 	return 1;
 } ## end sub clean_hard_drive
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 is_process_running
+
+ Parameters  : $process_identifier
+ Returns     : boolean
+ Description : Determines if a process is running identified by the argument.
+               The argument should be the name of an executable. Wildcards (*)
+               are allowed.
+
+=cut
+
+sub is_process_running {
+	my $self = shift;
+	if (ref($self) !~ /windows/i) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method, arguments:\n" . format_data(\@_));
+		return;
+	}
+	
+	my $management_node_keys = $self->data->get_management_node_keys();
+	my $computer_node_name   = $self->data->get_computer_node_name();
+	my $system32_path        = $self->get_system32_path() || return;
+	
+	my $process_identifier = shift;
+	if (!defined($process_identifier)) {
+		notify($ERRORS{'WARNING'}, 0, "process identifier argument was not supplied");
+		return;
+	}
+	
+	my $command = "$system32_path/tasklist.exe /FI \"IMAGENAME eq $process_identifier\"";
+	my ($status, $output) = run_ssh_command($computer_node_name, $management_node_keys, $command, '', '', 0);
+	if (!defined($output)) {
+		notify($ERRORS{'WARNING'}, 0, "failed to run ssh command to determine if process is running: $process_identifier");
+		return;
+	}
+	elsif (grep(/No tasks/i, @$output)) {
+		notify($ERRORS{'DEBUG'}, 0, "process is NOT running: $process_identifier");
+		return 0;
+	}
+	elsif (grep(/PID/, @$output)) {
+		notify($ERRORS{'DEBUG'}, 0, "process is running: $process_identifier");
+		return 1;
+	}
+	else {
+		notify($ERRORS{'WARNING'}, 0, "unexpected output returned from command to determine if process is running: '$command', output:\n" . join("\n", @$output));
+		return;
+	}
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 start_service
 
  Parameters  :