Author: arkurth Date: Mon May 14 18:31:58 2012 New Revision: 1338334 URL: http://svn.apache.org/viewvc?rev=1338334&view=rev Log: VCL-588 Added code to Windows.pm::get_network_configuration to check if it appears that devices are still being installed before running ipconfig. This will help alleviate the problems that occur when ipconfig is run before all network interfaces are installed and initialized.
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=1338334&r1=1338333&r2=1338334&view=diff ============================================================================== --- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm (original) +++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm Mon May 14 18:31:58 2012 @@ -5518,8 +5518,39 @@ sub get_network_configuration { return; } + # Check if OS may still be initializing before attempting to retrieve network information + # Windows may respond to SSH before all network interface drivers are installed and interfaces brought up + # This causes many problems + # Get the list of running tasks, check if drvinst.exe is running + my $initialization_check = 0; + my $initialization_check_limit = 12; + my $initialization_check_delay = 10; + while (++$initialization_check) { + # Get the list of running tasks (this returns an array reference of the raw tasklist.exe output) + my $task_list_output = $self->get_task_list(); + if (!$task_list_output) { + notify($ERRORS{'WARNING'}, 0, "attempt $initialization_check/$initialization_check_limit: unable to determine if devices are still being initialized, no task list output was retrieved, sleeping for $initialization_check_delay seconds"); + sleep $initialization_check_delay; + next; + } + + # Check if any running tasks match known patterns which run only when the OS is being initialized + my @matching_tasks = grep(/drvinst/, @$task_list_output); + if (!@matching_tasks) { + notify($ERRORS{'DEBUG'}, 0, "no devices appear to still be initializing, task list output:\n" . join("\n", @$task_list_output)); + last; + } + elsif ($initialization_check >= $initialization_check_limit) { + notify($ERRORS{'WARNING'}, 0, "attempt $initialization_check/$initialization_check_limit: devices still appear to be initializing, matching tasks:\n" . join("\n", @matching_tasks) . "\n---\ntask list output:\n" . join("\n", @$task_list_output)); + last; + } + else { + notify($ERRORS{'DEBUG'}, 0, "attempt $initialization_check/$initialization_check_limit: devices still appear to be initializing, sleeping for $initialization_check_delay seconds, matching tasks:\n" . join("\n", @matching_tasks)); + sleep $initialization_check_delay; + } + } + my $network_configuration; - notify($ERRORS{'DEBUG'}, 0, "attempting to retrieve network configuration information from $computer_node_name"); # Run ipconfig /all, try twice in case it fails the first time @@ -7210,7 +7241,7 @@ sub get_task_list { # Attempt to run tasklist.exe with /NH for no header my $tasklist_command = $system32_path . '/tasklist.exe /NH /V'; - my ($tasklist_exit_status, $tasklist_output) = run_ssh_command($computer_node_name, $management_node_keys, $tasklist_command, '', '', 1); + my ($tasklist_exit_status, $tasklist_output) = run_ssh_command($computer_node_name, $management_node_keys, $tasklist_command, '', '', 0); if (defined($tasklist_exit_status) && $tasklist_exit_status == 0) { notify($ERRORS{'DEBUG'}, 0, "ran tasklist.exe"); }