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 2012/01/19 21:07:44 UTC
svn commit: r1233553 - in
/incubator/vcl/trunk/managementnode/lib/VCL/Module: OS.pm OS/Linux.pm
OS/Windows.pm
Author: arkurth
Date: Thu Jan 19 20:07:44 2012
New Revision: 1233553
URL: http://svn.apache.org/viewvc?rev=1233553&view=rev
Log:
VCL-339
Added OS.pm::create_currentimage_txt. This will be called by the libvirt capture subroutine and will eventually replace the code in utils.pm.
VCL-503
Updated OS.pm::execute_new. Added $identity_key argument.
VCL-553
Updated OS.pm::wait_for_reboot to accept the same arguments as the other wait_* subroutines: $total_wait_seconds, $attempt_delay_seconds, $attempt_limit. Updated reboot subroutines in Linux.pm and Windows.pm. Also added a $pre_configure argument to Windows.pm to allow the caller to control whether or not the pre-reboot safety tasks are done or if the computer is simply rebooted.
VCL-402
Updated typo in Windows.pm::pre_capture. It wasn't calling disable_login_screensaver for VMs.
Other
Added check to Windows.pm::create_directory to check for '~' being passed as the argument. If this was the case, a /root/~ subdirectory was being created.
Modified:
incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm
incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.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=1233553&r1=1233552&r2=1233553&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm Thu Jan 19 20:07:44 2012
@@ -132,6 +132,51 @@ sub get_source_configuration_directories
#/////////////////////////////////////////////////////////////////////////////
+=head2 create_currentimage_txt
+
+ Parameters : None
+ Returns : boolean
+ Description : Creates the currentimage.txt file on the computer.
+
+=cut
+
+sub create_currentimage_txt {
+ my $self = shift;
+ if (ref($self) !~ /VCL::Module/i) {
+ notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
+ return;
+ }
+
+ my $image_id = $self->data->get_image_id();
+ my $image_name = $self->data->get_image_name();
+ my $image_prettyname = $self->data->get_image_prettyname();
+ my $imagerevision_id = $self->data->get_imagerevision_id();
+ my $imagerevision_date_created = $self->data->get_imagerevision_date_created();
+ my $computer_id = $self->data->get_computer_id();
+ my $computer_host_name = $self->data->get_computer_host_name();
+
+ my $file_contents = <<EOF;
+$image_name
+id=$image_id
+prettyname=$image_prettyname
+imagerevision_id=$imagerevision_id
+imagerevision_datecreated=$imagerevision_date_created
+computer_id=$computer_id
+computer_hostname=$computer_host_name
+EOF
+
+ # Create the file
+ if ($self->create_text_file('~/currentimage.txt', $file_contents)) {
+ return 1;
+ }
+ else {
+ notify($ERRORS{'WARNING'}, 0, "failed to create currentimage.txt file on $computer_host_name");
+ return;
+ }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
=head2 get_currentimage_txt_contents
Parameters : None
@@ -150,26 +195,22 @@ sub get_currentimage_txt_contents {
return;
}
- my $management_node_keys = $self->data->get_management_node_keys();
my $computer_node_name = $self->data->get_computer_node_name();
# Attempt to retrieve the contents of currentimage.txt
my $cat_command = "cat ~/currentimage.txt";
- my ($cat_exit_status, $cat_output) = run_ssh_command($computer_node_name, $management_node_keys, $cat_command);
- if (defined($cat_exit_status) && $cat_exit_status == 0) {
- notify($ERRORS{'DEBUG'}, 0, "retrieved currentimage.txt contents from $computer_node_name:\n" . join("\n", @$cat_output));
+ my ($cat_exit_status, $cat_output) = $self->execute($cat_command);
+ if (!defined($cat_output)) {
+ notify($ERRORS{'WARNING'}, 0, "failed to execute command to failed to retrieve currentimage.txt from $computer_node_name");
+ return;
}
- elsif (defined($cat_exit_status)) {
+ elsif ($cat_exit_status ne '0') {
notify($ERRORS{'WARNING'}, 0, "failed to retrieve currentimage.txt from $computer_node_name, exit status: $cat_exit_status, output:\n@{$cat_output}");
return;
}
else {
- notify($ERRORS{'WARNING'}, 0, "failed to run ssh command to failed to retrieve currentimage.txt from $computer_node_name");
- return;
+ notify($ERRORS{'DEBUG'}, 0, "retrieved currentimage.txt contents from $computer_node_name:\n" . join("\n", @$cat_output));
}
-
- notify($ERRORS{'DEBUG'}, 0, "found " . @{$cat_output} . " lines in currentimage.txt on $computer_node_name");
-
return @{$cat_output};
} ## end sub get_currentimage_txt_contents
@@ -224,9 +265,10 @@ sub get_current_image_name {
=head2 wait_for_reboot
- Parameters : Maximum number of seconds to wait (optional), delay between attempts (optional)
- Returns : If computer is pingable before the maximum amount of time has elapsed: 1
- Description :
+ Parameters : $total_wait_seconds, $attempt_delay_seconds, $attempt_limit
+ Returns : boolean
+ Description : Waits for the computer to become unresponsive, respond to ping,
+ then respond to SSH.
=cut
@@ -237,63 +279,107 @@ sub wait_for_reboot {
return;
}
- my $computer_node_name = $self->data->get_computer_node_name();
+ my $computer_node_name = $self->data->get_computer_node_name();
+
+ # Attempt to get the total number of seconds to wait from the arguments
+ my $total_wait_seconds_argument = shift;
+ if (!defined($total_wait_seconds_argument) || $total_wait_seconds_argument !~ /^\d+$/) {
+ $total_wait_seconds_argument = 300;
+ }
- # Make multiple attempts to wait for the reboot to complete
- my $wait_attempt_limit = shift;
+ # Seconds to wait in between loop attempts
+ my $attempt_delay_seconds_argument = shift;
+ if (!defined($attempt_delay_seconds_argument) || $attempt_delay_seconds_argument !~ /^\d+$/) {
+ $attempt_delay_seconds_argument = 15;
+ }
- if (!defined($wait_attempt_limit)) {
- $wait_attempt_limit = 2;
+ # Number of power reset attempts to make if reboot fails
+ my $attempt_limit = shift;
+ if (!defined($attempt_limit) || $attempt_limit !~ /^\d+$/) {
+ $attempt_limit = 2;
+ }
+ elsif (!$attempt_limit) {
+ $attempt_limit = 1;
}
- WAIT_ATTEMPT:
- for (my $wait_attempt = 1; $wait_attempt <= $wait_attempt_limit; $wait_attempt++) {
- if ($wait_attempt > 1) {
- # Computer did not become fully responsive on previous wait attempt
+ ATTEMPT:
+ for (my $attempt = 1; $attempt <= $attempt_limit; $attempt++) {
+ my $total_wait_seconds = $total_wait_seconds_argument;
+ my $attempt_delay_seconds = $attempt_delay_seconds_argument;
+
+ if ($attempt > 1) {
+ # Computer did not become responsive on previous attempt
notify($ERRORS{'OK'}, 0, "$computer_node_name reboot failed to complete on previous attempt, attempting hard power reset");
+
# Call provisioning module's power_reset() subroutine
if ($self->provisioner->power_reset()) {
- notify($ERRORS{'OK'}, 0, "reboot attempt $wait_attempt/$wait_attempt_limit: initiated power reset on $computer_node_name");
+ notify($ERRORS{'OK'}, 0, "reboot attempt $attempt/$attempt_limit: initiated power reset on $computer_node_name");
}
else {
notify($ERRORS{'WARNING'}, 0, "reboot failed, failed to initiate power reset on $computer_node_name");
return 0;
}
- } ## end if ($wait_attempt > 1)
+
+ # Add 2 minutes for each attempt to $total_wait_seconds in case argument supplied wasn't long enough
+ $total_wait_seconds += (120 * $attempt);
+ }
+
+ my $start_time = time;
+
+ notify($ERRORS{'DEBUG'}, 0, "waiting for $computer_node_name to reboot:
+ attempt: $attempt/$attempt_limit
+ maximum wait time: $total_wait_seconds seconds
+ wait delay: $attempt_delay_seconds");
- # Wait maximum of 3 minutes for the computer to become unresponsive
- if (!$self->wait_for_no_ping(180, 3)) {
+ # Wait for the computer to become unresponsive to ping
+ if (!$self->wait_for_no_ping($total_wait_seconds, $attempt_delay_seconds)) {
# Computer never stopped responding to ping
notify($ERRORS{'WARNING'}, 0, "$computer_node_name never became unresponsive to ping");
- next WAIT_ATTEMPT;
+ next ATTEMPT;
}
+ # Decrease $total_wait_seconds by the amount of time elapsed so far
+ my $no_ping_elapsed_seconds = (time - $start_time);
+ $total_wait_seconds -= $no_ping_elapsed_seconds;
+
# Computer is unresponsive, reboot has begun
- # Wait for 5 seconds before beginning to check if computer is back online
+ # Wait 5 seconds before beginning to check if computer is back online
notify($ERRORS{'DEBUG'}, 0, "$computer_node_name reboot has begun, sleeping for 5 seconds");
sleep 5;
- # Wait maximum of 6 minutes for the computer to come back up
- if (!$self->wait_for_ping(360, 5)) {
+ # Wait for the computer to respond to ping
+ if (!$self->wait_for_ping($total_wait_seconds, $attempt_delay_seconds)) {
# Check if the computer was ever offline, it should have been or else reboot never happened
notify($ERRORS{'WARNING'}, 0, "$computer_node_name never responded to ping");
- next WAIT_ATTEMPT;
+ next ATTEMPT;
}
- notify($ERRORS{'DEBUG'}, 0, "$computer_node_name is pingable, waiting for ssh to respond");
+ # Decrease $total_wait_seconds by the amount of time elapsed so far
+ my $ping_elapsed_seconds = (time - $start_time);
+ my $ping_actual_seconds = ($ping_elapsed_seconds - $no_ping_elapsed_seconds);
+ $total_wait_seconds -= $ping_elapsed_seconds;
+
+ notify($ERRORS{'DEBUG'}, 0, "$computer_node_name is pingable, waiting for SSH to respond");
# Wait maximum of 3 minutes for ssh to respond
- if (!$self->wait_for_ssh(180, 5)) {
- notify($ERRORS{'WARNING'}, 0, "ssh never responded on $computer_node_name");
- next WAIT_ATTEMPT;
+ if (!$self->wait_for_ssh($total_wait_seconds, $attempt_delay_seconds)) {
+ notify($ERRORS{'WARNING'}, 0, "$computer_node_name never responded to SSH");
+ next ATTEMPT;
}
- notify($ERRORS{'DEBUG'}, 0, "$computer_node_name responded to ssh");
+ # Decrease $total_wait_seconds by the amount of time elapsed so far
+ my $ssh_elapsed_seconds = (time - $start_time);
+ my $ssh_actual_seconds = ($ssh_elapsed_seconds - $ping_elapsed_seconds);
+
+ notify($ERRORS{'OK'}, 0, "$computer_node_name responded to SSH:
+ unresponsive: $no_ping_elapsed_seconds seconds
+ respond to ping: $ping_elapsed_seconds seconds ($ping_actual_seconds seconds after unresponsive)
+ respond to SSH $ssh_elapsed_seconds seconds ($ssh_actual_seconds seconds after ping)");
return 1;
- } ## end for (my $wait_attempt = 1; $wait_attempt <=...
+ }
# If loop completed, maximum number of reboot attempts was reached
- notify($ERRORS{'WARNING'}, 0, "reboot failed on $computer_node_name, made $wait_attempt_limit attempts");
+ notify($ERRORS{'WARNING'}, 0, "$computer_node_name reboot failed");
return 0;
}
@@ -1680,18 +1766,10 @@ sub execute {
sub execute_new {
my $argument = shift;
- my ($computer_name, $command, $display_output, $timeout_seconds, $max_attempts, $port, $user, $password);
-
- if (!ref($argument) || $argument->isa('VCL::Module')) {
- if ($argument->isa('VCL::Module')) {
- $computer_name = $argument->data->get_computer_node_name();
- }
- else {
- $computer_name = $argument;
- }
- ($command, $display_output, $timeout_seconds, $max_attempts, $port, $user, $password) = @_;
- }
- else {
+ my ($computer_name, $command, $display_output, $timeout_seconds, $max_attempts, $port, $user, $password, $identity_key);
+
+ # Check the argument type
+ if (ref($argument) && ref($argument) eq 'HASH') {
$computer_name = $argument->{node};
$command = $argument->{command};
$display_output = $argument->{display_output};
@@ -1700,6 +1778,26 @@ sub execute_new {
$port = $argument->{port};
$user = $argument->{user};
$password = $argument->{password};
+ $identity_key = $argument->{identity_key};
+ }
+ else {
+ if (ref($argument)) {
+ # Reference passed, not a hash reference, must be VCL Module reference
+ if ($argument->isa('VCL::Module')) {
+ $computer_name = $argument->data->get_computer_node_name();
+ }
+ 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
+ $computer_name = $argument;
+ }
+
+ # Get the remaining arguments
+ ($command, $display_output, $timeout_seconds, $max_attempts, $port, $user, $password, $identity_key) = @_;
}
if (!$computer_name) {
@@ -1713,10 +1811,15 @@ sub execute_new {
$display_output = 0 unless $display_output;
$timeout_seconds = 60 unless $timeout_seconds;
- $max_attempts = 1 unless $max_attempts;
+ $max_attempts = 3 unless $max_attempts;
$port = 22 unless $port;
$user = 'root' unless $user;
+ my $ssh_options = '-o StrictHostKeyChecking=no';
+ if ($identity_key) {
+ $ssh_options .= " -i $identity_key";
+ }
+
# Override the die handler
local $SIG{__DIE__} = sub{};
@@ -1737,6 +1840,9 @@ sub execute_new {
$attempt++;
$attempt_string = "attempt $attempt/$max_attempts: " if ($attempt > 1);
+ # Calling 'return' in the EVAL block doesn't exit this subroutine
+ # Use a flag to determine if null should be returned without making another attempt
+ my $return_null;
if (!$ENV{net_ssh_expect}{$computer_name}) {
eval {
@@ -1746,7 +1852,7 @@ sub execute_new {
port => $port,
raw_pty => 1,
no_terminal => 1,
- ssh_option => '-o StrictHostKeyChecking=no',
+ ssh_option => $ssh_options,
timeout => 3,
);
@@ -1758,10 +1864,7 @@ sub execute_new {
next ATTEMPT;
}
- if ($ssh->run_ssh()) {
- notify($ERRORS{'DEBUG'}, 0, ref($ssh) . " object forked SSH process to control $computer_name");
- }
- else {
+ if (!$ssh->run_ssh()) {
notify($ERRORS{'WARNING'}, 0, ref($ssh) . " object failed to fork SSH process to control $computer_name, $!");
next ATTEMPT;
}
@@ -1773,8 +1876,24 @@ sub execute_new {
# If true, sets the timeout to "inactivity timeout"
# If false sets it to "absolute timeout"
#$ssh->restart_timeout_upon_receive(1);
- $ssh->read_all();
+ my $initialization_output = $ssh->read_all();
+ #notify($ERRORS{'DEBUG'}, 0, "SSH initialization output:\n$initialization_output");
+ if (defined($initialization_output) && $initialization_output =~ /password:/i) {
+ if (defined($password)) {
+ notify($ERRORS{'WARNING'}, 0, "unable to connect to $computer_name, SSH is requesting a password but password authentication is not implemented, password is configured, output:\n$initialization_output");
+ $return_null = 1;
+ return;
+ }
+ else {
+ notify($ERRORS{'WARNING'}, 0, "unable to connect to $computer_name, SSH is requesting a password but password authentication is not implemented, password is not configured, output:\n$initialization_output");
+ $return_null = 1;
+ return;
+ }
+ }
};
+
+ return if ($return_null);
+
if ($EVAL_ERROR) {
if ($EVAL_ERROR =~ /^(\w+) at \//) {
notify($ERRORS{'DEBUG'}, 0, $attempt_string . "$1 error occurred initializing Net::SSH::Expect object for $computer_name");
Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm?rev=1233553&r1=1233552&r2=1233553&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm Thu Jan 19 20:07:44 2012
@@ -2655,7 +2655,7 @@ sub get_network_configuration {
=head2 reboot
- Parameters : $wait_for_reboot
+ Parameters :
Returns :
Description :
@@ -2669,15 +2669,7 @@ sub reboot {
}
my $computer_node_name = $self->data->get_computer_node_name();
-
- # Check if an argument was supplied
- my $wait_for_reboot = shift || 1;
- if ($wait_for_reboot) {
- notify($ERRORS{'DEBUG'}, 0, "rebooting $computer_node_name and waiting for SSH to become active");
- }
- else {
- notify($ERRORS{'DEBUG'}, 0, "rebooting $computer_node_name and NOT waiting");
- }
+ notify($ERRORS{'DEBUG'}, 0, "rebooting $computer_node_name");
my $reboot_start_time = time();
@@ -2728,13 +2720,7 @@ sub reboot {
}
}
- # Check if wait for reboot is set
- if (!$wait_for_reboot) {
- return 1;
- }
-
- my $wait_attempt_limit = 2;
- if ($self->wait_for_reboot($wait_attempt_limit)){
+ if ($self->wait_for_reboot()){
# Reboot was successful, calculate how long reboot took
my $reboot_end_time = time();
my $reboot_duration = ($reboot_end_time - $reboot_start_time);
@@ -2742,7 +2728,7 @@ sub reboot {
return 1;
}
else {
- notify($ERRORS{'WARNING'}, 0, "reboot failed on $computer_node_name, made $wait_attempt_limit attempts");
+ notify($ERRORS{'WARNING'}, 0, "reboot failed on $computer_node_name");
return 0;
}
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=1233553&r1=1233552&r2=1233553&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm Thu Jan 19 20:07:44 2012
@@ -436,9 +436,9 @@ sub pre_capture {
=cut
- if ($image_os_install_type =~ /vm/i) {
- if (!$self->disable_security_center_notifications()) {
- notify($ERRORS{'WARNING'}, 0, "unable to disable Security Center notifications");
+ if ($self->data->get_computer_vmhost_id(0)) {
+ if (!$self->disable_login_screensaver()) {
+ notify($ERRORS{'WARNING'}, 0, "unable to disable login screensaver");
}
}
@@ -1088,6 +1088,10 @@ sub create_directory {
notify($ERRORS{'WARNING'}, 0, "directory path argument was not specified");
return;
}
+
+ # If ~ is passed as the directory path, skip directory creation attempt
+ # The command will create a /root/~ directory since the path is enclosed in quotes
+ return 1 if $path eq '~';
notify($ERRORS{'DEBUG'}, 0, "attempting to create directory: '$path'");
@@ -3429,8 +3433,8 @@ sub create_eventlog_entry {
=head2 reboot
- Parameters : $wait_for_reboot
- Returns :
+ Parameters : $total_wait_seconds, $attempt_delay_seconds, $attempt_limit, $pre_configure
+ Returns : boolean
Description :
=cut
@@ -3441,48 +3445,62 @@ sub reboot {
notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
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;
- # Check if an argument was supplied
- my $wait_for_reboot = shift;
- if (!defined($wait_for_reboot) || $wait_for_reboot !~ /0/) {
- notify($ERRORS{'DEBUG'}, 0, "rebooting $computer_node_name and waiting for ssh to become active");
- $wait_for_reboot = 1;
+ # Check if an arguments were supplied
+
+ # Attempt to get the total number of seconds to wait from the arguments
+ my $total_wait_seconds = shift;
+ if (!defined($total_wait_seconds) || $total_wait_seconds !~ /^\d+$/) {
+ $total_wait_seconds = 300;
}
- else {
- notify($ERRORS{'DEBUG'}, 0, "rebooting $computer_node_name and NOT waiting");
- $wait_for_reboot = 0;
+
+ # Seconds to wait in between loop attempts
+ my $attempt_delay_seconds = shift;
+ if (!defined($attempt_delay_seconds) || $attempt_delay_seconds !~ /^\d+$/) {
+ $attempt_delay_seconds = 15;
}
+
+ # Number of power reset attempts to make if reboot fails
+ my $attempt_limit = shift;
+ if (!defined($attempt_limit) || $attempt_limit !~ /^\d+$/) {
+ $attempt_limit = 2;
+ }
+
+ my $pre_configure = shift;
+ $pre_configure = 1 unless defined $pre_configure;
+
+ my $computer_node_name = $self->data->get_computer_node_name();
+ my $system32_path = $self->get_system32_path() || return;
my $reboot_start_time = time();
notify($ERRORS{'DEBUG'}, 0, "reboot will be attempted on $computer_node_name");
# Check if computer responds to ssh before preparing for reboot
if ($self->wait_for_ssh(0)) {
- # Make sure SSH access is enabled from private IP addresses
- if (!$self->firewall_enable_ssh_private()) {
- notify($ERRORS{'WARNING'}, 0, "reboot not attempted, failed to enable ssh from private IP addresses");
- return 0;
- }
-
- # Set sshd service startup mode to auto
- if (!$self->set_service_startup_mode('sshd', 'auto')) {
- notify($ERRORS{'WARNING'}, 0, "reboot not attempted, unable to set sshd service startup mode to auto");
- return 0;
- }
-
- # Make sure ping access is enabled from private IP addresses
- if (!$self->firewall_enable_ping_private()) {
- notify($ERRORS{'WARNING'}, 0, "reboot not attempted, failed to enable ping from private IP addresses");
- return 0;
+ # Perform pre-reboot configuration tasks unless $pre_configure argument was supplied and is false
+ if ($pre_configure) {
+ # Make sure SSH access is enabled from private IP addresses
+ if (!$self->firewall_enable_ssh_private()) {
+ notify($ERRORS{'WARNING'}, 0, "reboot not attempted, failed to enable ssh from private IP addresses");
+ return 0;
+ }
+
+ # Set sshd service startup mode to auto
+ if (!$self->set_service_startup_mode('sshd', 'auto')) {
+ notify($ERRORS{'WARNING'}, 0, "reboot not attempted, unable to set sshd service startup mode to auto");
+ return 0;
+ }
+
+ # Make sure ping access is enabled from private IP addresses
+ if (!$self->firewall_enable_ping_private()) {
+ notify($ERRORS{'WARNING'}, 0, "reboot not attempted, failed to enable ping from private IP addresses");
+ return 0;
+ }
+
+ # Kill the screen saver process, it occasionally prevents reboots and shutdowns from working
+ $self->kill_process('logon.scr');
}
- # Kill the screen saver process, it occasionally prevents reboots and shutdowns from working
- $self->kill_process('logon.scr');
-
# Check if tsshutdn.exe exists on the computer
# tsshutdn.exe is the preferred utility, shutdown.exe often fails on Windows Server 2003
my $reboot_command;
@@ -3494,13 +3512,12 @@ sub reboot {
$reboot_command = "$system32_path/shutdown.exe /r /t 0 /f";
}
- my ($reboot_exit_status, $reboot_output) = run_ssh_command($computer_node_name, $management_node_keys, $reboot_command);
+ my ($reboot_exit_status, $reboot_output) = $self->execute($reboot_command);
if (!defined($reboot_output)) {
- notify($ERRORS{'WARNING'}, 0, "failed to execute ssh command to reboot $computer_node_name");
+ notify($ERRORS{'WARNING'}, 0, "failed to execute command to reboot $computer_node_name");
return;
}
-
- if ($reboot_exit_status == 0) {
+ elsif ($reboot_exit_status == 0) {
notify($ERRORS{'OK'}, 0, "executed reboot command on $computer_node_name");
}
else {
@@ -3532,31 +3549,18 @@ sub reboot {
}
} ## end else [ if ($self->wait_for_ssh(0))
- # Check if wait for reboot is set
- if (!$wait_for_reboot) {
+ # Wait for the reboot to complete
+ my $result = $self->wait_for_reboot($total_wait_seconds, $attempt_delay_seconds, $attempt_limit);
+ my $reboot_duration = (time - $reboot_start_time);
+ if ($result){
+ # Reboot was successful, calculate how long reboot took
+ notify($ERRORS{'OK'}, 0, "reboot complete on $computer_node_name, took $reboot_duration seconds");
return 1;
}
-
- # Make multiple attempts to wait for the reboot to complete
- my $wait_attempt_limit = 2;
- # Check if wait for reboot is set
- if (!$wait_for_reboot) {
- return 1;
- }
- else {
- if($self->wait_for_reboot($wait_attempt_limit)){
- # Reboot was successful, calculate how long reboot took
- my $reboot_end_time = time();
- my $reboot_duration = ($reboot_end_time - $reboot_start_time);
- notify($ERRORS{'OK'}, 0, "reboot complete on $computer_node_name, took $reboot_duration seconds");
- return 1;
- }
- else {
- notify($ERRORS{'WARNING'}, 0, "reboot failed on $computer_node_name, made $wait_attempt_limit attempts");
- return 0;
- }
- }
-
+ else {
+ notify($ERRORS{'WARNING'}, 0, "reboot failed on $computer_node_name, waited $reboot_duration seconds for computer to respond");
+ return 0;
+ }
} ## end sub reboot
#/////////////////////////////////////////////////////////////////////////////