Author: arkurth
Date: Wed Sep  8 20:40:19 2010
New Revision: 995243

URL: http://svn.apache.org/viewvc?rev=995243&view=rev
Log:
VCL-223
Added sanitize_files subroutines to Windows.pm, Version_5.pm, and Version_6.pm, 
which remove the Windows root password from various files depending on the 
version of Windows.  Added call to Windows.pm::post_load.

VCL-190
Added %TIME_ZONE_INFO to Windows.pm containing the names, abbreviations, and 
Windows code numbers for all configurable time zones.  Added get_time_zone_name 
and get_time_zone_code subroutines to Windows.pm.  These determine the name and 
Windows numerical code the correspond to the time zone configured for the 
management node.

Updated Version_5.pm::get_sysprep_inf_contents to call get_time_zone_code and 
use this value when generating the sysprep.inf file rather than using the 
hard-coded value for EST.

Updated Version_6.pm::run_sysprep to call get_time_zone_name and replace the 
value in the Unattend.xml file.

Other
Removed prepare_newsid subroutine from Windows.pm and changed Vista.pm to call 
prepare_post_load rather than prepare_newsid.

Reduced the timeout values in Version_6.pm::wait_for_response if Sysprep is not 
used.  Loads were waiting for 3 minutes unnecessarily on Version 6 images which 
don't use Sysprep.

Modified:
    incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm
    incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_5.pm
    incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6.pm
    
incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6/Vista.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=995243&r1=995242&r2=995243&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm Wed Sep  8 
20:40:19 2010
@@ -93,6 +93,98 @@ our $SOURCE_CONFIGURATION_DIRECTORY = "$
 
 our $NODE_CONFIGURATION_DIRECTORY = 'C:/Cygwin/home/root/VCL';
 
+
+=head2 %TIME_ZONE_INFO
+
+ Data type   : Hash
+ Description : Windows time zone code information. The hash keys are the
+               numerical Windows time zone codes used for things such as
+               Sysprep.
+
+=cut
+
+our %TIME_ZONE_INFO = (
+       'Afghanistan Standard Time' => {'abbreviation' => 'KAB', 'offset' => 
'+04:30', 'code' => '175'},
+       'Alaskan Standard Time' => {'abbreviation' => 'ALA', 'offset' => 
'-09:00', 'code' => '3'},
+       'Arab Standard Time' => {'abbreviation' => 'BKR', 'offset' => '+03:00', 
'code' => '150'},
+       'Arabian Standard Time' => {'abbreviation' => 'ABT', 'offset' => 
'+04:00', 'code' => '165'},
+       'Arabic Standard Time' => {'abbreviation' => 'BKR', 'offset' => 
'+03:00', 'code' => '158'},
+       'Atlantic Standard Time' => {'abbreviation' => 'AST', 'offset' => 
'-04:00', 'code' => '50'},
+       'AUS Central Standard Time' => {'abbreviation' => 'ADA', 'offset' => 
'+09:30', 'code' => '245'},
+       'AUS Eastern Standard Time' => {'abbreviation' => 'CMS', 'offset' => 
'+10:00', 'code' => '255'},
+       'Azerbaijan Standard Time' => {'abbreviation' => undef, 'offset' => 
'+04:00', 'code' => undef},
+       'Azores Standard Time' => {'abbreviation' => 'AZO', 'offset' => 
'-01:00', 'code' => '80'},
+       'Canada Central Standard Time' => {'abbreviation' => 'CST', 'offset' => 
'-06:00', 'code' => '25'},
+       'Cape Verde Standard Time' => {'abbreviation' => 'AZO', 'offset' => 
'-01:00', 'code' => '83'},
+       'Caucasus Standard Time' => {'abbreviation' => 'ABT', 'offset' => 
'+04:00', 'code' => '170'},
+       'Cen. Australia Standard Time' => {'abbreviation' => 'ADA', 'offset' => 
'+09:30', 'code' => '250'},
+       'Central America Standard Time' => {'abbreviation' => 'CST', 'offset' 
=> '-06:00', 'code' => '33'},
+       'Central Asia Standard Time' => {'abbreviation' => 'ADC', 'offset' => 
'+06:00', 'code' => '195'},
+       'Central Brazilian Standard Time' => {'abbreviation' => undef, 'offset' 
=> '-04:00', 'code' => undef},
+       'Central Europe Standard Time' => {'abbreviation' => 'AMS', 'offset' => 
'+01:00', 'code' => '95'},
+       'Central European Standard Time' => {'abbreviation' => 'AMS', 'offset' 
=> '+01:00', 'code' => '100'},
+       'Central Pacific Standard Time' => {'abbreviation' => 'MSN', 'offset' 
=> '+11:00', 'code' => '280'},
+       'Central Standard Time' => {'abbreviation' => 'CST', 'offset' => 
'-06:00', 'code' => '20'},
+       'Central Standard Time (Mexico)' => {'abbreviation' => 'CST', 'offset' 
=> '-06:00', 'code' => '30'},
+       'China Standard Time' => {'abbreviation' => 'SST', 'offset' => 
'+08:00', 'code' => '210'},
+       'Dateline Standard Time' => {'abbreviation' => 'IDLE', 'offset' => 
'-12:00', 'code' => '0'},
+       'E. Africa Standard Time' => {'abbreviation' => 'BKR', 'offset' => 
'+03:00', 'code' => '155'},
+       'E. Australia Standard Time' => {'abbreviation' => 'BGP', 'offset' => 
'+10:00', 'code' => '260'},
+       'E. Europe Standard Time' => {'abbreviation' => 'BCP', 'offset' => 
'+02:00', 'code' => '115'},
+       'E. South America Standard Time' => {'abbreviation' => 'BBA', 'offset' 
=> '-03:00', 'code' => '65'},
+       'Eastern Standard Time' => {'abbreviation' => 'EST', 'offset' => 
'-05:00', 'code' => '35'},
+       'Egypt Standard Time' => {'abbreviation' => 'BCP', 'offset' => 
'+02:00', 'code' => '120'},
+       'Ekaterinburg Standard Time' => {'abbreviation' => 'EIK', 'offset' => 
'+05:00', 'code' => '180'},
+       'Fiji Standard Time' => {'abbreviation' => 'FKM', 'offset' => '+12:00', 
'code' => '285'},
+       'FLE Standard Time' => {'abbreviation' => 'HRI', 'offset' => '+02:00', 
'code' => '125'},
+       'Georgian Standard Time' => {'abbreviation' => undef, 'offset' => 
'+04:00', 'code' => undef},
+       'GMT Standard Time' => {'abbreviation' => 'GMT', 'offset' => '+00:00', 
'code' => '85'},
+       'Greenland Standard Time' => {'abbreviation' => 'BBA', 'offset' => 
'-03:00', 'code' => '73'},
+       'Greenwich Standard Time' => {'abbreviation' => 'GMT', 'offset' => 
'+00:00', 'code' => '90'},
+       'GTB Standard Time' => {'abbreviation' => 'AIM', 'offset' => '+02:00', 
'code' => '130'},
+       'Hawaiian Standard Time' => {'abbreviation' => 'HAW', 'offset' => 
'-10:00', 'code' => '2'},
+       'India Standard Time' => {'abbreviation' => 'BCD', 'offset' => 
'+05:30', 'code' => '190'},
+       'Iran Standard Time' => {'abbreviation' => 'THE', 'offset' => '+03:30', 
'code' => '160'},
+       'Israel Standard Time' => {'abbreviation' => 'BCP', 'offset' => 
'+02:00', 'code' => '135'},
+       'Korea Standard Time' => {'abbreviation' => 'SYA', 'offset' => 
'+09:00', 'code' => '230'},
+       'Mid-Atlantic Standard Time' => {'abbreviation' => 'MAT', 'offset' => 
'-02:00', 'code' => '75'},
+       'Mountain Standard Time' => {'abbreviation' => 'MST', 'offset' => 
'-07:00', 'code' => '10'},
+       'Mountain Standard Time (Mexico)' => {'abbreviation' => 'MST', 'offset' 
=> '-07:00', 'code' => '13'},
+       'Myanmar Standard Time' => {'abbreviation' => 'MMT', 'offset' => 
'+06:30', 'code' => '203'},
+       'N. Central Asia Standard Time' => {'abbreviation' => 'ADC', 'offset' 
=> '+06:00', 'code' => '201'},
+       'Namibia Standard Time' => {'abbreviation' => undef, 'offset' => 
'+02:00', 'code' => undef},
+       'Nepal Standard Time' => {'abbreviation' => 'NPT', 'offset' => 
'+05:45', 'code' => '193'},
+       'New Zealand Standard Time' => {'abbreviation' => 'AWE', 'offset' => 
'+12:00', 'code' => '290'},
+       'Newfoundland Standard Time' => {'abbreviation' => 'NWF', 'offset' => 
'-03:30', 'code' => '60'},
+       'North Asia East Standard Time' => {'abbreviation' => 'SST', 'offset' 
=> '+08:00', 'code' => '227'},
+       'North Asia Standard Time' => {'abbreviation' => 'BHJ', 'offset' => 
'+07:00', 'code' => '207'},
+       'Pacific SA Standard Time' => {'abbreviation' => 'AST', 'offset' => 
'-04:00', 'code' => '56'},
+       'Pacific Standard Time' => {'abbreviation' => 'PST', 'offset' => 
'-08:00', 'code' => '4'},
+       'Romance Standard Time' => {'abbreviation' => 'AMS', 'offset' => 
'+01:00', 'code' => '105'},
+       'Russian Standard Time' => {'abbreviation' => 'MSV', 'offset' => 
'+03:00', 'code' => '145'},
+       'SA Eastern Standard Time' => {'abbreviation' => 'BBA', 'offset' => 
'-03:00', 'code' => '70'},
+       'SA Pacific Standard Time' => {'abbreviation' => 'EST', 'offset' => 
'-05:00', 'code' => '45'},
+       'SA Western Standard Time' => {'abbreviation' => 'AST', 'offset' => 
'-04:00', 'code' => '55'},
+       'Samoa Standard Time' => {'abbreviation' => 'MIS', 'offset' => 
'-11:00', 'code' => '1'},
+       'SE Asia Standard Time' => {'abbreviation' => 'BHJ', 'offset' => 
'+07:00', 'code' => '205'},
+       'Singapore Standard Time' => {'abbreviation' => 'SST', 'offset' => 
'+08:00', 'code' => '215'},
+       'South Africa Standard Time' => {'abbreviation' => 'BCP', 'offset' => 
'+02:00', 'code' => '140'},
+       'Sri Lanka Standard Time' => {'abbreviation' => 'ADC', 'offset' => 
'+06:00', 'code' => '200'},
+       'Taipei Standard Time' => {'abbreviation' => 'SST', 'offset' => 
'+08:00', 'code' => '220'},
+       'Tasmania Standard Time' => {'abbreviation' => 'HVL', 'offset' => 
'+10:00', 'code' => '265'},
+       'Tokyo Standard Time' => {'abbreviation' => 'OST', 'offset' => 
'+09:00', 'code' => '235'},
+       'Tonga Standard Time' => {'abbreviation' => 'TOT', 'offset' => 
'+13:00', 'code' => '300'},
+       'US Eastern Standard Time' => {'abbreviation' => 'EST', 'offset' => 
'-05:00', 'code' => '40'},
+       'US Mountain Standard Time' => {'abbreviation' => 'MST', 'offset' => 
'-07:00', 'code' => '15'},
+       'Vladivostok Standard Time' => {'abbreviation' => 'HVL', 'offset' => 
'+10:00', 'code' => '270'},
+       'W. Australia Standard Time' => {'abbreviation' => 'SST', 'offset' => 
'+08:00', 'code' => '225'},
+       'W. Central Africa Standard Time' => {'abbreviation' => 'AMS', 'offset' 
=> '+01:00', 'code' => '113'},
+       'W. Europe Standard Time' => {'abbreviation' => 'AMS', 'offset' => 
'+01:00', 'code' => '110'},
+       'West Asia Standard Time' => {'abbreviation' => 'EIK', 'offset' => 
'+05:00', 'code' => '185'},
+       'West Pacific Standard Time' => {'abbreviation' => 'BGP', 'offset' => 
'+10:00', 'code' => '275'},
+       'Yakutsk Standard Time' => {'abbreviation' => 'SYA', 'offset' => 
'+09:00', 'code' => '240'},
+);
+
 ##############################################################################
 
 =head1 INTERFACE OBJECT METHODS
@@ -611,6 +703,17 @@ sub post_load {
 
 =item *
 
+ Remove the Windows root password and other private information from the VCL 
configuration files
+
+=cut
+
+       if (!$self->sanitize_files()) {
+               notify($ERRORS{'WARNING'}, 0, "failed to sanitize the files on 
the computer");
+               return;
+       }
+
+=item *
+
  Randomize the root account password
 
 =cut
@@ -3257,9 +3360,9 @@ sub defragment_hard_drive {
  Returns     : If successful: true
                If failed: false
  Description : This subroutine should be called as the last step before an 
image
-               is captured if neither Sysprep nor NewSID is used. It enables
-               autoadminlogon so that root automatically logs on the next time
-               the computer is booted and creates a registry key under
+               is captured if Sysprep is not is used. It enables autoadminlogon
+               so that root automatically logs on the next time the computer is
+               booted and creates a registry key under
                HKLM\Software\Microsoft\Windows\CurrentVersion\Run.
                
                This key causes the post_load.cmd script after the image is
@@ -3318,80 +3421,6 @@ sub prepare_post_load {
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 prepare_newsid
-
- Parameters  : None.
- Returns     : If successful: true
-               If failed: false
- Description : This subroutine prepares a computer to automatically run
-               newsid.exe the next time it is booted. Newsid.exe is a utility
-               which generates a new SID (security identifier) for the 
computer.
-               
-               This subroutine enables autoadminlogon so that root 
automatically
-               logs on the next time the computer is booted.
-               
-               A registry key is created under
-               HKLM\Software\Microsoft\Windows\CurrentVersion\Run.
-               This key calls the run_newsid.cmd script. This script will run
-               as root when it automatically logs on.
-               
-               The run_newsid.cmd script runs newsid.exe, removes the 
HKLM...Run
-               key which caused itself to be called, and configures another
-               HKLM...Run key to call post_load.cmd at next logon. The script
-               then reboots the computer.
-
-=cut
-
-sub prepare_newsid {
-       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");
-               return;
-       }
-       
-       # Set the DevicePath registry key
-       # This is used to locate device drivers
-       if (!$self->set_device_path_key()) {
-               notify($ERRORS{'WARNING'}, 0, "failed to set the DevicePath 
registry key");
-               return;
-       }
-
-       my $management_node_keys = $self->data->get_management_node_keys();
-       my $computer_node_name   = $self->data->get_computer_node_name();
-       my $end_state = $self->{end_state} || 'off';
-       
-       # Get the node configuration directory
-       my $node_configuration_directory = 
$self->get_node_configuration_directory();
-       unless ($node_configuration_directory) {
-               notify($ERRORS{'WARNING'}, 0, "node configuration directory 
could not be determined");
-               return;
-       }
-       
-       # Add HKLM run key to call run_newsid.cmd after the image comes up
-       if (!$self->add_hklm_run_registry_key('run_newsid.cmd', 
$node_configuration_directory . '/Scripts/run_newsid.cmd  >> ' . 
$node_configuration_directory . '/Logs/run_newsid.log')) {
-               notify($ERRORS{'WARNING'}, 0, "unable to create run key to call 
run_newsid.cmd");
-               return;
-       }
-       
-       # Enable autoadminlogon
-       if (!$self->enable_autoadminlogon()) {
-               notify($ERRORS{'WARNING'}, 0, "unable to enable 
autoadminlogon");
-               return 0;
-       }
-       
-       # Shut down computer unless end_state argument was passed with a value 
other than 'off'
-       if ($end_state eq 'off') {
-               if (!$self->shutdown()) {
-                       notify($ERRORS{'WARNING'}, 0, "failed to shut down 
computer");
-                       return;
-               }
-       }
-       
-       return 1;
-}
-
-#/////////////////////////////////////////////////////////////////////////////
-
 =head2 set_service_credentials
 
  Parameters  : $service_name, $username, $password
@@ -3595,36 +3624,36 @@ sub disable_scheduled_task {
  Returns     : array reference if successful, false if failed
  Description : Queries the scheduled tasks on a computer and returns the
                configuration for each task. An array reference is returned.
-                                       Each array element represents a 
scheduled task and contains
-                                       a hash reference. The hash contains the 
schedule task
-                                       configuration.  The hash keys are:
-                                               
$scheduled_task_hash{"HostName"},
-                                               
$scheduled_task_hash{"TaskName"},
-                                               $scheduled_task_hash{"Next Run 
Time"},
-                                               $scheduled_task_hash{"Status"},
-                                               $scheduled_task_hash{"Last Run 
Time"},
-                                               $scheduled_task_hash{"Last 
Result"},
-                                               $scheduled_task_hash{"Creator"},
-                                               
$scheduled_task_hash{"Schedule"},
-                                               $scheduled_task_hash{"Task To 
Run"},
-                                               $scheduled_task_hash{"Start 
In"},
-                                               $scheduled_task_hash{"Comment"},
-                                               $scheduled_task_hash{"Scheduled 
Task State"},
-                                               $scheduled_task_hash{"Scheduled 
Type"},
-                                               $scheduled_task_hash{"Start 
Time"},
-                                               $scheduled_task_hash{"Start 
Date"},
-                                               $scheduled_task_hash{"End 
Date"},
-                                               $scheduled_task_hash{"Days"},
-                                               $scheduled_task_hash{"Months"},
-                                               $scheduled_task_hash{"Run As 
User"},
-                                               $scheduled_task_hash{"Delete 
Task If Not Rescheduled"},
-                                               $scheduled_task_hash{"Stop Task 
If Runs X Hours and X Mins"},
-                                               $scheduled_task_hash{"Repeat: 
Every"},
-                                               $scheduled_task_hash{"Repeat: 
Until: Time"},
-                                               $scheduled_task_hash{"Repeat: 
Until: Duration"},
-                                               $scheduled_task_hash{"Repeat: 
Stop If Still Running"},
-                                               $scheduled_task_hash{"Idle 
Time"},
-                                               $scheduled_task_hash{"Power 
Management"}
+               Each array element represents a scheduled task and contains
+               a hash reference. The hash contains the schedule task
+               configuration.  The hash keys are:
+                  $scheduled_task_hash{"HostName"},
+                  $scheduled_task_hash{"TaskName"},
+                  $scheduled_task_hash{"Next Run Time"},
+                  $scheduled_task_hash{"Status"},
+                  $scheduled_task_hash{"Last Run Time"},
+                  $scheduled_task_hash{"Last Result"},
+                  $scheduled_task_hash{"Creator"},
+                  $scheduled_task_hash{"Schedule"},
+                  $scheduled_task_hash{"Task To Run"},
+                  $scheduled_task_hash{"Start In"},
+                  $scheduled_task_hash{"Comment"},
+                  $scheduled_task_hash{"Scheduled Task State"},
+                  $scheduled_task_hash{"Scheduled Type"},
+                  $scheduled_task_hash{"Start Time"},
+                  $scheduled_task_hash{"Start Date"},
+                  $scheduled_task_hash{"End Date"},
+                  $scheduled_task_hash{"Days"},
+                  $scheduled_task_hash{"Months"},
+                  $scheduled_task_hash{"Run As User"},
+                  $scheduled_task_hash{"Delete Task If Not Rescheduled"},
+                  $scheduled_task_hash{"Stop Task If Runs X Hours and X Mins"},
+                  $scheduled_task_hash{"Repeat: Every"},
+                  $scheduled_task_hash{"Repeat: Until: Time"},
+                  $scheduled_task_hash{"Repeat: Until: Duration"},
+                  $scheduled_task_hash{"Repeat: Stop If Still Running"},
+                  $scheduled_task_hash{"Idle Time"},
+                  $scheduled_task_hash{"Power Management"}
 
 =cut
 
@@ -5851,19 +5880,26 @@ sub search_and_replace_in_files {
                return;
        }
        
+       # Replace backslashes with a forward slash in the base directory path
+       $base_directory =~ s/\\+/\//g;
+       
+       # Escape forward slashes in the search pattern and replace string
+       $search_pattern =~ s/\//\\\//g;
+       $replace_string =~ s/\//\\\//g;
+       
        # Run grep to find files matching pattern
        my $grep_command = "/bin/grep -ilr \"$search_pattern\" 
\"$base_directory\" 2>&1 | grep -Ev \"\.(exe|dll)\"";
-       my ($grep_status, $grep_output) = run_ssh_command($computer_node_name, 
$management_node_keys, $grep_command);
+       my ($grep_status, $grep_output) = run_ssh_command($computer_node_name, 
$management_node_keys, $grep_command, '', '', 0);
        if (!defined($grep_status)) {
                notify($ERRORS{'WARNING'}, 0, "unable to run ssh command to run 
grep on directory: $base_directory, pattern: $search_pattern");
                return;
        }
-       elsif ("@$grep_output" =~ /$base_directory: No such file/i) {
-               notify($ERRORS{'WARNING'}, 0, "base directory does not exist: 
$base_directory");
-               return;
+       elsif ("@$grep_output" =~ /No such file/i) {
+               notify($ERRORS{'DEBUG'}, 0, "no files to process, base 
directory does not exist: $base_directory");
+               return 1;
        }
        elsif ("@$grep_output" =~ /grep:/i) {
-               notify($ERRORS{'WARNING'}, 0, "grep output contains 'grep:', 
unexpected:\n" . join("\n", @$grep_output));
+               notify($ERRORS{'WARNING'}, 0, "grep error occurred:\n" . 
join("\n", @$grep_output));
                return;
        }
        elsif ($grep_status == 1) {
@@ -5877,9 +5913,10 @@ sub search_and_replace_in_files {
        # Run sed on each matching file to replace string
        my $sed_error_count = 0;
        for my $matching_file (@$grep_output) {
+               $matching_file =~ s/\\+/\//g;
                # Run grep to find files matching pattern
                my $sed_command = "/bin/sed -i -e 
\"s/$search_pattern/$replace_string/\" \"$matching_file\"";
-               my ($sed_status, $sed_output) = 
run_ssh_command($computer_node_name, $management_node_keys, $sed_command);
+               my ($sed_status, $sed_output) = 
run_ssh_command($computer_node_name, $management_node_keys, $sed_command, '', 
'', 0);
                if (!defined($sed_status)) {
                        notify($ERRORS{'WARNING'}, 0, "unable to run ssh 
command to run sed on file: $matching_file");
                        $sed_error_count++;
@@ -5900,6 +5937,7 @@ sub search_and_replace_in_files {
                        notify($ERRORS{'OK'}, 0, "replaced '$search_pattern' 
with '$replace_string' in $matching_file");
                        
                        # sed replaces Windows newlines with \n
+                       # There is a sed -b option which prevents this but it 
is not available on all versions of sed
                        $self->run_unix2dos($matching_file);
                }
        }
@@ -9368,6 +9406,133 @@ sub setup_display_kms_server_info {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 get_time_zone_name
+
+ Parameters  : none
+ Returns     : string
+ Description : Returns the name of the time zone configured for the management
+               node. The date command is run locally on the management node and
+               the time zone abbreviation is parsed from the output. This
+               %TIME_ZONE_INFO hash is searched for matching time zone
+               information and the time zone name is returned. If a matching
+               time zone is not found, 'Eastern Standard Time' is returned.
+               Example: 'HVL' returns 'Tasmania Standard Time'
+
+=cut
+
+sub get_time_zone_name {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my $default_time_zone_name = 'Eastern Standard Time';
+       
+       # Call date to determine the time zone abbreviation in use on the 
management node
+       my ($exit_status, $output) = run_command('date +%Z');
+       if (!defined($output)) {
+               notify($ERRORS{'WARNING'}, 0, "failed to run command to 
determine time zone configured for management node, returning 
'$default_time_zone_name'");
+               return $default_time_zone_name;
+       }
+       
+       # Extract the time zone abbreviation from the output
+       my ($set_abbreviation) = grep(/^\w{3}$/, @$output);
+       if (!$set_abbreviation) {
+               notify($ERRORS{'WARNING'}, 0, "failed to determine time zone 
abbreviation from output, returning '$default_time_zone_name':\n" . join("\n", 
@$output));
+               return $default_time_zone_name;
+       }
+       
+       # Windows time zone codes don't include corresponding daylight time 
abbreviations, e.g. EDT
+       # Convert *DT --> *ST
+       if ($set_abbreviation =~ /(.)DT/i) {
+               $set_abbreviation = "$1ST";
+               notify($ERRORS{'DEBUG'}, 0, "time zone abbreviation converted 
to standard time: $1DT --> $set_abbreviation");
+       }
+       
+       # Loop through the time zone codes until a matching abbreviation is 
found
+       for my $time_zone_name (sort keys %TIME_ZONE_INFO) {
+               my $time_zone_abbreviation = 
$TIME_ZONE_INFO{$time_zone_name}{abbreviation};
+               
+               next if (!$time_zone_abbreviation || $set_abbreviation !~ 
/^$time_zone_abbreviation$/i);
+               
+               notify($ERRORS{'DEBUG'}, 0, "determined name of time zone 
configured for management node: '$time_zone_name'");
+               return $time_zone_name;
+       }
+       
+       # Return the code for EST if a match was not found
+       notify($ERRORS{'WARNING'}, 0, "unable to determine name of time zone 
configured for management node, abbreviation: $set_abbreviation, returning 
'$default_time_zone_name'");
+       return $default_time_zone_name;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 get_time_zone_code
+
+ Parameters  : none
+ Returns     : string
+ Description : Returns the Windows numerical code of the time zone configured
+               for the management node. If a matching time zone is not found, 
35
+               is returned.
+               Example: 'HVL' returns 265
+
+=cut
+
+sub get_time_zone_code {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my $time_zone_name = $self->get_time_zone_name() || return;
+       
+       my $time_zone_code = $TIME_ZONE_INFO{$time_zone_name}{code};
+       if ($time_zone_code) {
+               notify($ERRORS{'DEBUG'}, 0, "determined Windows code of time 
zone configured for management node: $time_zone_code");
+               return $time_zone_code;
+       }
+       else {
+               my $default = 35;
+               notify($ERRORS{'WARNING'}, 0, "time zone code could not be 
determined for time zone: '$time_zone_name', returning $default");
+               return $default;
+       }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 sanitize_files
+
+ Parameters  : @file_paths (optional)
+ Returns     : boolean
+ Description : Removes the Windows root password from files on the computer.
+
+=cut
+
+sub sanitize_files {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       # Get the file path arguments, add the node configuration directory
+       my @file_paths = @_;
+       push @file_paths, $self->get_node_configuration_directory();
+       
+       # Loop through each file path, remove the Windows root password from 
each
+       for my $file_path (@file_paths) {
+               if (!$self->search_and_replace_in_files($file_path, 
$WINDOWS_ROOT_PASSWORD, 'WINDOWS_ROOT_PASSWORD')) {
+                       notify($ERRORS{'WARNING'}, 0, "failed to remove the 
Windows root password from: $file_path");
+                       return;
+               }
+       }
+       
+       return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 1;
 __END__
 

Modified: 
incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_5.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_5.pm?rev=995243&r1=995242&r2=995243&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_5.pm 
(original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_5.pm 
Wed Sep  8 20:40:19 2010
@@ -278,14 +278,17 @@ sub run_sysprep {
                notify($ERRORS{'WARNING'}, 0, "unable to determine private and 
public interface names, failed to enable DHCP and shut down 
$computer_node_name");
                return;
        }
+       
+       # Release any DHCP addresses and delete the default route
+       $sysprep_command .= "$system32_path/ipconfig.exe /release & ";
+       $sysprep_command .= "$system32_path/route.exe DELETE 0.0.0.0 MASK 
0.0.0.0 & ";
+       
+       # Disable DHCP
        $sysprep_command .= "$system32_path/netsh.exe interface ip set address 
name=\\\"$private_interface_name\\\" source=dhcp & ";
        $sysprep_command .= "$system32_path/netsh.exe interface ip set dns 
name=\\\"$private_interface_name\\\" source=dhcp & ";
        $sysprep_command .= "$system32_path/netsh.exe interface ip set address 
name=\\\"$public_interface_name\\\" source=dhcp & ";
        $sysprep_command .= "$system32_path/netsh.exe interface ip set dns 
name=\\\"$public_interface_name\\\" source=dhcp & ";
        
-       # Delete the default route
-       $sysprep_command .= "$system32_path/route.exe DELETE 0.0.0.0 MASK 
0.0.0.0 & ";
-       
        # Run Sysprep.exe
        $sysprep_command .= "C:/Sysprep/sysprep.exe /quiet /reseal /mini 
/forceshutdown & ";
        
@@ -359,6 +362,9 @@ sub get_sysprep_inf_contents {
        # Get the image affiliation name or use ASF as the default
        my $image_affiliation_name = $self->data->get_image_affiliation_name() 
|| "Apache Software Foundation";
        
+       # Get the Windows time zone code based on the time zone configured for 
the management node
+       my $time_zone_code = $self->get_time_zone_code();
+       
        my %sysprep_inf_hash;
        
        # [Unattended] - Setup/Sysprep execution configuration
@@ -385,7 +391,7 @@ sub get_sysprep_inf_contents {
        $sysprep_inf_hash{GuiUnattended}{OEMDuplicatorString} = 'VCL';         
# Specifies a description of the duplication utility used, as well as any other 
information that an OEM or administrator wants to store in the registry
        $sysprep_inf_hash{GuiUnattended}{OemSkipRegional} = '1';               
# Specifies whether unattended Setup skips the Regional and Language Options 
page in GUI-mode Setup and Mini-Setup
        $sysprep_inf_hash{GuiUnattended}{OemSkipWelcome} = '1';                
# Specifies whether unattended Setup skips the Welcome page in GUI-mode Setup 
and Mini-Setup
-       $sysprep_inf_hash{GuiUnattended}{TimeZone} = '35';                     
# Specifies the time zone of the computer's location
+       $sysprep_inf_hash{GuiUnattended}{TimeZone} = $time_zone_code;          
# Specifies the time zone of the computer's location
        
        # [Display] - display/graphics settings
        $sysprep_inf_hash{Display}{BitsPerPel} = '32';                         
# Specifies the valid bits per pixel for the graphics device
@@ -611,6 +617,31 @@ sub firewall_enable_sessmgr {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 sanitize_files
+
+ Parameters  : none
+ Returns     : boolean
+ Description : Removes the Windows root password from files on the computer.
+
+=cut
+
+sub sanitize_files {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my @file_paths = (
+               '$SYSTEMDRIVE/Sysprep',
+       );
+       
+       # Call the subroutine in Windows.pm
+       return $self->SUPER::sanitize_files(@file_paths);
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 1;
 __END__
 

Modified: 
incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6.pm?rev=995243&r1=995242&r2=995243&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6.pm 
(original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6.pm 
Wed Sep  8 20:40:19 2010
@@ -259,12 +259,12 @@ sub activate {
                return 1;
        }
        
-       # Attempt to activate using MAK product key
-       return 1 if $self->activate_mak();
-       
        # Attempt to activate using KMS server
        return 1 if $self->activate_kms();
        
+       # Attempt to activate using MAK product key
+       return 1 if $self->activate_mak();
+       
        notify($ERRORS{'WARNING'}, 0, "failed to activate Windows using MAK or 
KMS methods");
        return;
 }
@@ -1445,6 +1445,7 @@ sub run_sysprep {
        my $system32_path = $self->get_system32_path();
        my $system32_path_dos = $system32_path;
        $system32_path_dos =~ s/\//\\/g;
+       my $node_configuration_directory = 
$self->get_node_configuration_directory();
        
        # Delete existing Panther directory, contains Sysprep log files
        if (!$self->delete_file('C:/Windows/Panther')) {
@@ -1500,8 +1501,20 @@ sub run_sysprep {
                return;
        }
        
+       # Update the Unattend.xml file with the time zone name configured for 
the management node
+       my $time_zone_name = $self->get_time_zone_name();
+       my $base_directory = 
"$node_configuration_directory/Utilities/Sysprep/Unattend.xml";
+       my $search_pattern = '<TimeZone>.*</TimeZone>';
+       my $replace_string = '<TimeZone>' . $time_zone_name . '</TimeZone>';
+       if ($self->search_and_replace_in_files($base_directory, 
$search_pattern, $replace_string)) {
+               notify($ERRORS{'DEBUG'}, 0, "updated Unattend.xml with the time 
zone configured for the management node: '$time_zone_name'");
+       }
+       else {
+               notify($ERRORS{'WARNING'}, 0, "failed to update Unattend.xml 
with the time zone configured for the management node: '$time_zone_name'");
+               return;
+       }
+
        # Copy Unattend.xml file to sysprep directory
-       my $node_configuration_directory = 
$self->get_node_configuration_directory();
        my $cp_command = "cp -f 
$node_configuration_directory/Utilities/Sysprep/Unattend.xml 
$system32_path/sysprep/Unattend.xml";
        my ($cp_status, $cp_output) = run_ssh_command($computer_node_name, 
$management_node_keys, $cp_command);
        if (defined($cp_status) && $cp_status == 0) {
@@ -1723,8 +1736,8 @@ sub wait_for_response {
                $ssh_response_timeout_seconds = 1800; 
        }
        else {
-               $initial_delay_seconds = 180;
-               $ssh_response_timeout_seconds = 600; 
+               $initial_delay_seconds = 15;
+               $ssh_response_timeout_seconds = 300; 
        }
        
        # Call parent class's wait_for_response subroutine
@@ -1733,6 +1746,32 @@ sub wait_for_response {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 sanitize_files
+
+ Parameters  : none
+ Returns     : boolean
+ Description : Removes the Windows root password from files on the computer.
+
+=cut
+
+sub sanitize_files {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my @file_paths = (
+               '$SYSTEMROOT/System32/sysprep',
+               '$SYSTEMROOT/Panther',
+       );
+       
+       # Call the subroutine in Windows.pm
+       return $self->SUPER::sanitize_files(@file_paths);
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 1;
 __END__
 

Modified: 
incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6/Vista.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6/Vista.pm?rev=995243&r1=995242&r2=995243&view=diff
==============================================================================
--- 
incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6/Vista.pm 
(original)
+++ 
incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6/Vista.pm 
Wed Sep  8 20:40:19 2010
@@ -125,13 +125,13 @@ Disable the following scheduled tasks:
 
 =item *
 
-Prepare the computer for newsid.exe to be run
+Prepare the computer for post_load.cmd to be run
 
 =cut
 
        # This shuts down the computer
-       if (!$self->prepare_newsid()) {
-               notify($ERRORS{'WARNING'}, 0, "failed to prepare the computer 
for newsid.exe to be run");
+       if (!$self->prepare_post_load()) {
+               notify($ERRORS{'WARNING'}, 0, "failed to prepare the computer 
for post_load.cmd to be run");
                return 0;
        }
        


Reply via email to