Windows2003-3790/tools/postbuildscripts/autoboottest.pl
2020-09-30 16:53:55 +02:00

989 lines
29 KiB
Perl

# ---------------------------------------------------------------------------
# Script: autoboottest.pl
#
# (c) 2000 Microsoft Corporation. All rights reserved.
#
# Purpose: This script is an example of a perl script in the NT postbuild
# environment.
#
# Version: <1.00> (<mm/dd/yyyy>) : (<your alias>) <Purpose>
# <1.01> (<mm/dd/yyyy>) : (<your alias>) <Purpose>
#---------------------------------------------------------------------
# Set Package
# <Set your package name of your perl module>
package autoboottest;
# Set the script name
# <Set your script name>
$ENV{script_name} = 'autoboottest.pl';
# Set version
# <Set the version of your script>
$VERSION = '1.00';
# Set required perl version
# <Set the version of perl that your script requires>
require 5.003;
# Use section
use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts";
use lib $ENV{RAZZLETOOLPATH};
use GetParams;
use LocalEnvEx;
use GetIniSetting;
use cksku;
use Logmsg;
use strict;
no strict 'vars';
# <Add any perl modules that you will be using for this script>
# Require section
require Exporter;
# <Add any perl pl files that you will be using>
# Global variable section
# <Add any global variables here using my to preserve namespace>
$selectedsku = undef;
(@BuildArchs, @BuildTypes, @JoinDomain) = ();
($FirstBuildMachine, @ReleaseServers, $ReleaseServers, $ReleaseRemote, $BootTestMachines,
$BuildNumber, $AutoRaise)=();
($BuildBranch, $BuildArchs, $BuildTypes)=(
$ENV{_BuildBranch}, $ENV{_BuildArch}, $ENV{_BuildType}
);
# Assumption: BootTestDrive defined in Boot Test Machine remote.
# Please reference BootTestDriveVarName in bootinit.cmd
($BootTestDriveVar, $PostBootTest, $UnAttend, $OpShellFolder) = (
"BootTestDrive", "PostBootTest", "unattend.txt", "OpShellFolder.pl"
);
sub Main {
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
# Begin Main code section
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
# Return when you want to exit on error
# <Implement your code here>
my (%skus)=();
my (@BootTestMachines, $BuildName, $sku, $PostBootTestFile ) = ();
# BUGBUG - need to remove if we turn on outside main
# if not defined MAIN_BUILD_LAB_MACHINE goto End
return if (!exists $ENV{MAIN_BUILD_LAB_MACHINE});
&initial;
# for $BuildBranch, we can not change branch, because currently template limitation
# for $lang. we can not change language, because currently template limitation
# Initial GetIniSetting
unless ( &GetIniSetting::CheckIniFile ) {
errmsg( "Failed to find ini file ..." );
return;
}
# for @BuildArchs, now is only execute one time, because template limitation
for $BuildArch (@BuildArchs) {
$ENV{_BuildArch} = $BuildArch;
%skus = &cksku::GetSkus($lang, $BuildArch);
# for @BuildTypes, now is only execute one time, because template limitation
for $BuildType (@BuildTypes) {
$ENV{_BuildType} = $BuildType;
# Get Build Name
$BuildName = &GetLatestBuildName;
next if (!defined $BuildName);
$BuildNumber = (split(/\./, $BuildName))[0];
# Get build share
$BuildShare = &GetBuildShare($BuildName);
# Get Release Server
@ReleaseServers = &GetReleaseServers;
$ReleaseRemote = &GetReleaseRemote;
# Get BuildMachine
$FirstBuildMachine = &GetFirstBuildMachine($BuildBranch, $BuildArch, $BuildType);
# Get Account
@JoinDomain = split(/\s+/, &GetAccount);
# Get AutoRaise
$AutoRaise = &GetAutoRaise($BuildArch, $BuildType);
for $sku (reverse(keys %skus)) {
next if (defined ($selectedsku)
&& $sku ne $selectedsku);
# Get Boot Test Machines
@BootTestMachines = &GetBootTestMachine( $BuildArch, $BuildType, $sku );
$BootTestMachines = join(" ", map({$_ . "1"} @BootTestMachines));
for $BootTestMachine (@BootTestMachines) {
# Show the boot test machine we working on
logmsg("Start to install build on $BootTestMachine....");
# Write PostBootTestScript
$PostBootTestFile = "$ENV{temp}\\${PostBootTest}_${BootTestMachine}.cmd";
&WritePostBootTestScript($PostBootTestFile, $BootTestMachines, $FirstBuildMachine, $BuildArch, $BuildType, $BuildName, @ReleaseServers );
&StartBootTest($BuildArch, $BuildShare, $sku, $PostBootTestFile, $BootTestMachine);
}
}
}
}
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
# End Main code section
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
}
# <Implement your subs here>
sub initial {
@BuildArchs = splitcolon( $BuildArchs ); # x86 or amd64 or ia64
@BuildTypes = splitcolon( $BuildTypes ); # fre or chk
system("$ENV{RAZZLETOOLPATH}\\setbuildstatus.cmd -s:boot");
}
sub StartBootTest {
my ($BuildArch, $BuildShare, $sku, $PostBootTestFile, $BootTestMachine) = @_;
my $BootCmd;
# For some reason there is no environment variable for i386
my $TargetArch = ($BuildArch eq "x86")?"i386":$BuildArch;
my $UnattendFile = "$ENV{tmp}\\$UnAttend";
my $OpShellFolderFile = "$ENV{RazzleToolPath}\\postbuildscripts\\$OpShellFolder";
# Compose Boot Command
$BootCmd = &ComposeBootCmd($TargetArch, $BuildShare, $sku);
# Make the Unattend file
&WriteUnattendFile($UnattendFile, $BootTestMachine, $BuildBranch);
errmsg "Unable to create answer file." if (!-e $UnattendFile);
# Issue Commands
&IssueBootTestCommands($BuildArch, $BootTestMachine, $UnattendFile, $PostBootTestFile, $OpShellFolderFile, $BootCmd);
}
#
# ComposeBootCmd($TargetArch, $BuildShare, $sku)
#
# purpose: Generate the boot command. Such as "winnt32 ....", so we can call issue command
#
sub ComposeBootCmd {
my ($TargetArch, $BuildShare, $sku) = @_;
my $BinSource = "$BuildShare\\$sku\\$TargetArch";
my $UnattendFile = "/Unattend:\%$BootTestDriveVar\%\\tools\\$UnAttend";
my $CmdOpt;
# if ($AutoRaise) {
# $CmdOpt = "/cmd:\"\%SYSTEMROOT\%\\SYSTEM32\\cscript.exe " .
# "\%$BootTestDriveVar\%\\tools\\OpShellFolder.wsf " .
# "/op:CopyFileTo /path:Startup /file:\%$BootTestDriveVar\%\\tools\\PostBootTest.cmd\"";
# }
# Set the boot command to issue
# Have to remove winnt32 when testing on MP machines
return "$BinSource\\winnt32.exe /#bvt:nosymbols /tempdrive:\%$BootTestDriveVar\% $UnattendFile $CmdOpt";
}
#
# WriteUnattendFile($UnattendFile, $BootTestMachine, $Branch)
#
# purpose: Generate Unattend File
#
sub WriteUnattendFile {
my($UnattendFile, $BootTestMachine, $Branch) = @_;
my $Administrators = ($lang =~ /ger/i) ?
"Administratoren" :
"Administrators";
my $password = "PASSWORD";
open(F, ">$UnattendFile");
print F <<UnattendFile;
[data]
Unattendedinstall=yes
msdosinitiated="0"
[Unattended]
UnattendMode = fullUnattended
OemSkipEula = yes
TargetPath=test
Filesystem=LeaveAlone
NtUpgrade=no
ConfirmHardware = No
Repartition = No
[branding]
brandieusingunattended = yes
[Proxy]
Proxy_Enable = 1
Use_Same_Proxy = 1
HTTP_Proxy_Server = http://itgproxy:80
Secure_Proxy_Server = http://itgproxy:80
[GuiUnattended]
AutoLogon =Yes
AutoLogonCount = 1
TimeZone=04
AdminPassword=*
oemskipregional =1
oemskipwelcome = 1
[UserData]
FullName="$Branch"
OrgName="Microsoft"
ComputerName="${BootTestMachine}1"
ProductID="\$\{P_roductID\}"
[LicenseFilePrintData]
AutoMode = "PerServer"
AutoUsers = "50"
[Display]
BitsPerPel=0x10
XResolution=0x400
YResolution=0x300
VRefresh=0x3C
Flags=0x0
AutoConfirm=0x1
[RegionalSettings]
LanguageGroup = 1, 7, 8, 9, 10, 11, 12, 13
[Networking]
InstallDefaultComponents=Yes
[Identification]
JoinDomain=$JoinDomain[0]
DomainAdmin=\${BT_U}
DomainAdminPassword=\${BT_P}
CreateComputerAccountInDomain = Yes
[SetupData]
OsLoadOptionsVar="/fastdetect /debug /baudrate=115200"
[GuiRunOnce]
;command0: Create the SAFE reboot shortcut
command0="\%SYSTEMROOT\%\\SYSTEM32\\cscript.exe \%SYSTEMDRIVE\%\\TOOLS\\addlink.wsf -x:'\%SYSTEMROOT\%\\SYSTEM32\\cscript.exe \%SYSTEMDRIVE\%\\TOOLS\\bootsafe.wsf' -i:13"
UnattendFile
print F <<O1631 if ($AutoRaise);
; command7: copy the postboottest.cmd to Administrator's Startup special folder
command7="\%SYSTEMROOT\%\\SYSTEM32\\cscript.exe \%SYSTEMDRIVE\%\\TOOLS\\OpShellFolder.wsf /op:CopyFileTo /path:Startup /file:\%SYSTEMDRIVE\%\\TOOLS\\PostBootTest.cmd"
; one may store tools on other drive than \%SYSTEMDRIVE\%:
; command7="\%SYSTEMROOT\%\\SYSTEM32\\cscript.exe \${${BootTestDriveVar}}\\TOOLS\\OpShellFolder.wsf /op:CopyFileTo /path:Startup /file:\${${BootTestDriveVar}}\\TOOLS\\PostBootTest.cmd"
O1631
print F <<BVT if $lang and $lang ne "usa";
;[GuiRunOnce]
; command1: Create the BVT shortcut
command1="\%SYSTEMROOT\%\\SYSTEM32\\cscript.exe \%SYSTEMDRIVE\%\\TOOLS\\addlink.wsf -x:\%SYSTEMDRIVE\%\\TOOLS\\bvtm.cmd -l:'BVT Test.lnk'"
; command2: Add the winbld to ADMINISTRATORS
command2="\%SYSTEMROOT\%\\SYSTEM32\\cscript.exe \%SYSTEMDRIVE\%\\TOOLS\\add2grp.wsf /u:'winbld' /d /g:$Administrators"
; command3: Clean the unattend* files
; command3="\%SYSTEMROOT\%\\SYSTEM32\\cmd.exe /c del /q \%SYSTEMDRIVE\%\\TOOLS\\unattend.*"
;
; command4: add the REGISTRY entries for automatic logon of the winbld
; command5: reboot the machine. use traditional way.
; command6: Do the cleanup and indirect cleanup.Not yet implemented.
BVT
close(F);
}
#
# IssueBootTestCommands($buildarch, $BootTestMachine, $UnattendFile, $PostBootTestFile, $OpShellFolderFile, $BootCmd)
#
# purpose: According the paramters and issue below commands to Boot Test machine
# Phase 1: Format the Boot test drive
# Phase 2: Prepare reference files (such as unattend.txt, opshellfolder.pl, postboottest.cmd)
# Phase 3: Process Boot file (boot.ini or boot.nvr or nvram.sav)
# Phase 4: Run winnt32
#
sub IssueBootTestCommands {
# ------------ Data definition
my ($buildarch, $BootTestMachine, $UnattendFile, $PostBootTestFile, $OpShellFolderFile, $BootCmd) = @_;
my $cmd;
# Set the tools copy command
my $SourceToolDir="\\\\$ENV{ComputerName}\\$ENV{RazzleToolPath}\\$buildarch";
my $SourcePerlDir="\\\\$ENV{ComputerName}\\$ENV{RazzleToolPath}\\perl";
my $SourcesScrDir="\\\\$ENV{ComputerName}\\$ENV{RazzleToolPath}\\POSTBUILDSCRIPTS";
my $TargetToolDir="\^\%$BootTestDriveVar\^\%\\tools";
# Construct the UNC
$UnattendFile = "\\\\$ENV{ComputerName}\\$UnattendFile";
$PostBootTestFile = "\\\\$ENV{ComputerName}\\$PostBootTestFile";
$OpShellFolderFile = "\\\\$ENV{ComputerName}\\$OpShellFolderFile";
# replace <drv>: with <drv>$
$UnattendFile =~ s/\\(\w)\:\\/\\$1\$\\/;
$SourceToolDir =~ s/\\(\w)\:\\/\\$1\$\\/;
$SourcePerlDir =~ s/\\(\w)\:\\/\\$1\$\\/;
$SourcesScrDir =~ s/\\(\w)\:\\/\\$1\$\\/;
$PostBootTestFile =~ s/\\(\w)\:\\/\\$1\$\\/;
$OpShellFolderFile =~ s/\\(\w)\:\\/\\$1\$\\/;
# Phase 1: Format the Boot test drive (details see below the 'code' part)
#
# Phase 2: Prepare reference files (such as unattend.txt, opshellfolder.pl, postboottest.cmd)
my @Phase2 = &FormStrToArray( <<Phase2);
if not exist $TargetToolDir md $TargetToolDir
start /w /min cmd /c copy /y $PostBootTestFile $TargetToolDir\\${PostBootTest}.cmd.temp
start /w /min cmd /c copy /y $UnattendFile $TargetToolDir\\${UnAttend}.temp
start /min cmd /c copy /y $OpShellFolderFile $TargetToolDir\\$OpShellFolder
start /min cmd /c copy /y $SourceToolDir\\remote.exe $TargetToolDir
start /min cmd /c copy /y $SourceToolDir\\autologon.exe $TargetToolDir
start /min cmd /c copy /y $SourceToolDir\\sleep.exe $TargetToolDir
start /min cmd /c copy /y $SourcesScrDir\\addlink.wsf $TargetToolDir
start /min cmd /c copy /y $SourcesScrDir\\add2grp.wsf $TargetToolDir
start /min cmd /c copy /y $SourcesScrDir\\fixlogon.wsf $TargetToolDir
start /min cmd /c copy /y $SourcesScrDir\\bootsafe.wsf $TargetToolDir
start /min cmd /c copy /y $SourcesScrDir\\parsesys.wsf $TargetToolDir
start /min cmd /c copy /y $SourcesScrDir\\opshellfolder.wsf $TargetToolDir
start /min cmd /c copy /y $SourcesScrDir\\bvtm.cmd $TargetToolDir\\bvtm.cmd.temp
start /min cmd /c xcopy /fdice $SourcePerlDir $TargetToolDir\\perl
\^\^\%windir\^\^\%\\SYSTEM32\\cscript.exe $TargetToolDir\\parsesys.wsf /path:$TargetToolDir /in:"${PostBootTest}.cmd.temp" /out:"${PostBootTest}.cmd"
\^\^\%windir\^\^\%\\SYSTEM32\\cscript.exe $TargetToolDir\\parsesys.wsf /path:$TargetToolDir /in:"${UnAttend}.temp" /out:"$UnAttend"
\^\^\%windir\^\^\%\\SYSTEM32\\cscript.exe $TargetToolDir\\parsesys.wsf /path:$TargetToolDir /in:"bvtm.cmd.temp" /out:"bvtm.cmd"
Phase2
# Phase 3: Process Boot file (boot.ini or boot.nvr)
my @Phase3;
my $BootFile;
$BootFile="boot.ini" if (lc$buildarch eq "x86");
$BootFile="boot.ini" if (lc$buildarch eq "amd64");
$BootFile="boot.nvr" if (lc$buildarch eq "ia64");
# Phase 3a: Save off the boot file for intel machines
@Phase3 = &FormStrToArray( <<Phase3a);
if exist c:\\${BootFile} attrib -s -r -h c:\\${BootFile}
if exist c:\\${BootFile}.sav attrib -s -r -h c:\\${BootFile}.sav
if exist c:\\${BootFile}.sav copy /y c:\\${BootFile}.sav c:\\${BootFile}
if /i "$BootFile" equ "Boot.ini" if exist c:\\${BootFile} attrib +s +r +h c:\\${BootFile}
if exist c:\\${BootFile}.sav attrib +s +r +h c:\\${BootFile}.sav
Phase3a
# Phase 4: Run winnt32
@Phase4 = &FormStrToArray( <<Phase4);
start /min $BootCmd
Phase4
# ------------ Code
# Prepare the Phase 1's answer file
open(F, ">$ENV{tmp}\\format_${lang}.txt");
print F "Format \%$BootTestDriveVar\% /X /FS:NTFS /Q\n";
print F "Y\n\n\n";
close(F);
# Phase 1: Format the Boot test drive
&MyRemoteCommand($BootTestMachine, "BootTestRemote", "Echo Beginning boot test");
&MyRemoteCommand($BootTestMachine, "BootTestRemote", "$ENV{tmp}\\format_${lang}.txt", 1);
sleep 45;
# Phase 2, Phase 3:
for $cmd ( @Phase2, @Phase3) {
&MyRemoteCommand($BootTestMachine, "BootTestRemote", $cmd);
}
# Phase 4: start setup
for $cmd ( @Phase4) {
&MyRemoteCommand($BootTestMachine, "BootTestRemote", $cmd);
}
}
#
# FormStrToArray(@strs)
# Parameters:
# @strs: multi-line string " This is a text.\n This is another line\n\t\tAnd, have tabs"
#
# purpose: Seperate the multi-line string into an array and format it
#
sub FormStrToArray {
my (@strs)=@_;
my (@result, $str, $line);
for $str (@strs) {
for $line (split(/\n/, $str)) {
chomp $str;
$line=~s/^\s+$//;
$line=~s/\t/ /g;
push @result, $line;
}
}
return @result;
}
#
# WritePostBootTestScript($postboottestfile, $boottestlist, $myprimary, $buildarch, $buildtype, $buildname, @ReleaseServers)
# Parameters:
# $postboottestfile: such as "postboottest.cmd"
# $boottestlist: such as "i32bt0011 i32bt0021"
# $myprimary: such as "i32fre"
# $buildarch: such as "x86"
# $buildtype: such as "fre"
# $buildname: such as "3552.x86fre.main.010914-1644"
# @ReleaseServers: such as ("intblds10", "intblds11" )
#
# purpose: According the parameters, generate postboottestfile
#
sub WritePostBootTestScript {
# Write a script on the fly to use on the boot test machine. The reason
# This needs to be done on the fly is so that we can use sources and
# and environment variables only available on the build machines.
my ($PostBootTestFile, $BootTestList, $MyPrimary, $buildarch, $buildtype, $buildname, @ReleaseServers ) = @_;
my $langopt = ((defined $lang)&&(lc$lang ne "usa"))?"-l:$lang":"";
my $ReleaseServers = join(" ", @ReleaseServers);
`del /f $PostBootTestFile` if (-e $PostBootTestFile);
open(F, ">$PostBootTestFile");
print F <<PostBootTestFile;
\@echo off
if DEFINED _echo echo on
if DEFINED verbose echo on
REM This script will kick off stress after a boot test is complete.
REM In addition, it will make a marker file indicating that boot tests have passed
REM for the main build lab only so that we can raise to BVT automatically.
REM Note that we will have to delete the marker files in postbuild before making them here.
REM We need release to also have a list of files to match against based on boottestmachines.txt
REM Provide usage.
for \%\%a in (./ .- .) do if \".\%1.\" == \"\%\%a?.\" goto Usage
REM Write the done file to be used by release
set $BootTestDriveVar=\$\{$BootTestDriveVar\}
set ${BootTestDriveVar}Share=\%$BootTestDriveVar:~0,1\%\$
set LOGFILE=\%$BootTestDriveVar\%\\tools\\BootTest.log
set BUILDNAME=$buildname
REM Don't create a "booted" remote any longer! It's a security hole!
REM call :LogMe "Create a remote for raiseall.pl"
REM start \%BootTestDrive\%\\tools\\remote /S \"cmd.exe\" Booted
:Connect
call :LogMe "Connecting to release servers"
for \%\%a in ($ReleaseServers) do (
call :LogMe "Connecting to \%\%a"
net use \\\\\%\%a /u:\${BT_U} \${BT_P}
if errorlevel 1 (
call :LogMe "Error - \%\%a cannot connect"
)
)
:Raise
call :LogMe "Raiseall to BVT on all release servers"
for \%\%a in ($ReleaseServers) do (
call :LogMe "Start Raiseall on \%\%a ..."
echo start cmd /c perl ^^^\%\%RazzleToolPath^^^\%\%\\postbuildscripts\\raiseall.pl -n:$BuildNumber -q:bvt -a:$buildarch -t:$buildtype $langopt | \%$BootTestDriveVar\%\\tools\\remote /c \%\%a $ReleaseRemote /L 1>nul
if errorlevel 1 (
call :LogMe "Remote to \%\%a failed"
)
)
call :LogMe "Give raiseall 5 mins to raise build to BVT"
\%BootTestDrive\%\\tools\\sleep 300
:Check
call :LogMe "Check if build raised to BVT"
set BVTCheck=
for \%\%a in ($ReleaseServers) do (
call :LogMe "Checking for BVT on \%\%a"
dir \\\\\%\%a\\\%BUILDNAME\%.${lang}\\build_logs\\bvt.qly >nul 2>nul
if errorlevel 1 (
call :LogMe "No bvt.qly available on \%\%a"
) else (
set BVTCheck=1
)
)
:Disconnect
call :LogMe "Disconnecting from release servers"
\%BootTestDrive\%\\tools\\sleep 3
for \%\%a in ($ReleaseServers) do (
net use \\\\\%\%a /d
if errorlevel 1 call :LogMe "Error - \%\%a cannot disconnect"
)
if not defined BVTCheck (
call :LogMe "No release server at BVT yet, waiting 15 min to try again"
\%BootTestDrive\%\\tools\\sleep 900
goto :Connect
)
call :LogMe "Move PostBootTest.cmd to desktop"
\%SYSTEMROOT\%\\SYSTEM32\\cscript.exe \%SYSTEMDRIVE\%\\TOOLS\\opshellfolder.wsf /op:copyfileto /path:Desktop /file:\%SYSTEMDRIVE\%\\TOOLS\\postboottest.cmd
\%SYSTEMROOT\%\\SYSTEM32\\cscript.exe \%SYSTEMDRIVE\%\\TOOLS\\opshellfolder.wsf /op:delfile /path:startup /file:postboottest.cmd
call :LogMe "PostBootTest.cmd finished."
goto :exit
:logme
echo \%1
echo \%DATE\% \%TIME\% \%1>>\%LOGFILE\%
goto :EOF
:exit
endlocal
PostBootTestFile
close(F);
logmsg "Failed to create postboottest.cmd" if (!-e $PostBootTestFile);
return;
}
#################################### Reusable functions
#
# GetFirstBuildMachine($branch, $arch, $type)
#
# purpose: Get first primary build machine or first secondary build machine
# if not defined primary from buildmachines.txt
#
sub GetFirstBuildMachine {
# ($order, $branch, $arch, $type) = ("primary", @_);
my $searchpattern = join(",", @_);
my @BuildMachines;
my ($machinename, $firstbuildmachine, $line);
open(F, "$ENV{RazzleToolPath}\\BuildMachines.txt");
@BuildMachines = <F>;
close(F);
for $line (@BuildMachines) {
$machinename = (split(/\,/, $line))[0];
if ($line =~ /$searchpattern/i) {
return $machinename if ($line =~ /primary/i);
$firstbuildmachine=$machinename if (!defined $firstbuildmachine);
}
}
errmsg "Failed to find a build machine." if(!defined $firstbuildmachine);
return $firstbuildmachine;
}
#
# GetFirstBuildMachine($branch, $arch, $type)
#
# purpose: Get first primary build machine or first secondary build machine
# if not defined primary from buildmachines.txt
#
sub GetAccount {
my (@Request) = ("JoinDomain");
my( $JoinDomain ) = &GetIniSetting::GetSetting( @Request );
return $JoinDomain;
}
#
# GetBuildPath($buildname, [$compname], [$releaseshare])
#
# purpose: Get the fullpath share, so we can write file correctly. such as \\i32fre\release\jpn\1234 => \\i32fre\f$\release\jpn\1234
#
sub GetBuildPath {
my ($releaseshare) = @_;
my ($computername, $sharename, $misc, $sharepath);
# Get the computername, sharename, and remain paths
if ($releaseshare =~ /^\\\\([^\\]+)\\([^\\]+)/) {
($computername, $sharename, $misc) = ($1, $2, $');
} elsif ($releaseshare =~ /^([^\\]+)/) {
($computername, $sharename, $misc) = ($ENV{computername}, $1, $');
} else {
errmsg("Can not get correct build path ($releaseshare)");
return;
}
# Replace d: to d$ if applicable
$sharename =~ s/\:/\$/;
for my $line (`rmtshare \\\\$computername\\$sharename`) {
$sharepath=$1 if ($line =~ /^Path\s+(.+)$/);
}
if (!defined $sharepath) {
errmsg("Can not find the path of this share ($sharename)");
return;
}
# Remove d:\ to d: if applicable
$sharepath =~ s/\\$//;
# Replace d: to d$ if applicable
$sharepath =~ s/\:/\$/;
return "\\\\$computername\\$sharepath\\$misc";
}
#
# GetBuildShare($buildname, [$compname], [$releaseshare])
#
# purpose: Get build share from computer ($compname). Default is $ENV{computername
#
sub GetBuildShare {
my ($buildname, $compname, $releaseshare) = @_;
# This setting is misnamed as it is actually used as both the directory
# and share name
my (@Request) = ("AlternateReleaseDir");
my ($inirelease) = &GetIniSetting::GetSetting( @Request );
$compname = $ENV{computername} if (!defined $compname);
$releaseshare = $inirelease || 'release' if (!defined $releaseshare);
my $BuildShare = (lc$lang eq "usa")?"\\\\$compname\\$releaseshare\\$buildname":
"\\\\$compname\\$releaseshare\\$lang\\$buildname";
logmsg "No latest build to test - aborting." if (!defined $BuildShare);
logmsg "No latest build could find - aborting." if (!-e $BuildShare);
return $BuildShare;
}
#
# GetReleaseServers
#
# purpose: Get release server from ini file
#
sub GetReleaseServers {
my (@Request) = ("ReleaseServers", $ENV{_BuildArch} . $ENV{_BuildType});
my ($ReleaseServer) = &GetIniSetting::GetSetting( @Request );
my @ReleaseServers;
@Request = ("PrimaryReleaseServer");
@ReleaseServers = &GetIniSetting::GetSetting( @Request );
# Collect Release Servers to @ReleaseServers
# Avoid to include primary release server twice
#
# hardcode exclude ntburnlab08
push(@ReleaseServers,
grep {!(
# USA case
((lc$lang eq "usa") && (/ntburnlab08|intblds10/i)) ||
# Primary release server
((defined $ReleaseServers[0]) && (/\Q$ReleaseServers[0]\E/i)))
} split(/\s+/, $ReleaseServer)
);
wrnmsg "Could not find release servers to raise." if (!@ReleaseServers);
return @ReleaseServers;
}
sub GetReleaseRemote {
my (@Request) = ("AlternateReleaseRemote");
my( $ReleaseRemote ) = &GetIniSetting::GetSetting( @Request );
$ReleaseRemote = "release" if (!defined $ReleaseRemote);
return $ReleaseRemote;
}
#
# GetBootTestMachine($arch, $type, $sku)
#
# purpose: Get Boot Test Machine from ini file
#
sub GetBootTestMachine {
my ($arch, $type, $sku) = @_;
my (@Request) = ( "BootTestMachines", uc$arch . uc$type, $sku);
return split(/\s+/, &GetIniSetting::GetSetting( @Request ));
}
#
# GetLatestBuildName
#
# purpose: call getlatestrelease.cmd and handle its error
#
sub GetLatestBuildName {
my $buildname = `$ENV{RazzleToolPath}\\PostBuildScripts\\GetLatestRelease.cmd -l:$lang`;
chomp $buildname;
if ($buildname =~ /none/i) {
errmsg "No Binaries tree or latest release found - Aborting.";
return;
}
return $buildname;
}
#
# GetAutoRaise
#
# purpose: check the .ini file to see if we should try to auto raise or not
#
sub GetAutoRaise {
my ($arch, $type) = @_;
my (@Request) = ( "AutoRaise", uc$arch . uc$type);
return (&GetIniSetting::GetSetting( @Request ) =~ /true/i);
}
#
# MyRemoteCommand($Machine, $RemoteId, $cmd)
#
# purpose: Execute $cmd on remote console
#
sub MyRemoteCommand {
my ($Machine, $RemoteId, $cmd, $echotype) = @_;
$echotype = ($echotype eq "1")?"type":"echo";
$cmd = ($cmd=~/\S/)?"$echotype $cmd" : "${echotype}.";
# Make sure this gets logged properly
logmsg("Remote Command: '$cmd'");
# Wait 1 more second each time before each time we execute remote command
sleep 1;
return &MySystemCall("$cmd|remote /c $Machine $RemoteId >nul");
}
#
# MySystemCall($cmd)
#
# purpose: Execute $cmd thru system call
#
sub MySystemCall {
my ($cmd) = @_;
my $r = system($cmd);
$r >>= 8;
# Because remote command always return 4, we should ignore it.
if (($r)&&($r ne 4)&&($r ne 0)) {
errmsg "Failed ($r): $cmd";
return 0;
}
return 1;
}
#
# splitcolon($str)
#
# purpose: split $str with delimiter ':' and return splited string
#
sub splitcolon {
return grep {/\w+/} split(/\:/, $_[0]);
}
##################################
sub ValidateParams {
#<Add your code for validating the parameters here>
}
# <Add your usage here>
sub Usage {
print <<USAGE;
Purpose of program
Usage: $0 [-l lang] [-y [pro\|ads\|ser\|dtd]]
-l Language
-y sku select
-? Displays usage
As of 02/13/01, the sku choice of [srv, pro] is available
for GER x86, and JPN x86 only.
Example:
$0 -l jpn
$0 -l:ger -y:pro
USAGE
}
sub GetParams {
# Step 1: Call pm getparams with specified arguments
&GetParams::getparams(@_);
# Step 2: Set the language into the enviroment
$ENV{lang}=$lang;
# Step 3: Call the usage if specified by /?
if ($HELP) {
&Usage();
exit 1;
}
}
# Cmd entry point for script.
if (eval("\$0 =~ /" . __PACKAGE__ . "\\.pl\$/i")) {
# Step 1: Parse the command line
# <run perl.exe GetParams.pm /? to get the complete usage for GetParams.pm>
&GetParams ('-o', 'l:y:', '-p', 'lang selectedsku', @ARGV);
# Include local environment extensions
&LocalEnvEx::localenvex('initialize');
# Set lang from the environment
$lang=$ENV{lang};
# Validate the option given as parameter.
&ValidateParams;
# Step 4: Call the main function
&autoboottest::Main();
# End local environment extensions.
&LocalEnvEx::localenvex('end');
}
# -------------------------------------------------------------------------------------------
# Script: autoboottest.pl
# Purpose: Template perl perl script for the NT postbuild environment
# SD Location: %sdxroot%\tools\postbuildscripts
#
# (1) Code section description:
# CmdMain - Developer code section. This is where your work gets done.
# <Implement your subs here> - Developer subs code section. This is where you write subs.
#
# (2) Reserved Variables -
# $ENV{HELP} - Flag that specifies usage.
# $ENV{lang} - The specified language. Defaults to USA.
# $ENV{logfile} - The path and filename of the logs file.
# $ENV{logfile_bak} - The path and filename of the logfile.
# $ENV{errfile} - The path and filename of the error file.
# $ENV{tmpfile} - The path and filename of the temp file.
# $ENV{errors} - The scripts errorlevel.
# $ENV{script_name} - The script name.
# $ENV{_NTPostBld} - Abstracts the language from the files path that
# postbuild operates on.
# $ENV{_NTPostBld_Bak} - Reserved support var.
# $ENV{_temp_bak} - Reserved support var.
#
# (3) Reserved Subs -
# Usage - Use this sub to discribe the scripts usage.
# ValidateParams - Use this sub to verify the parameters passed to the script.
#
# (4) Call other executables or command scripts by using:
# system "foo.exe";
# Note that the executable/script you're calling with system must return a
# non-zero value on errors to make the error checking mechanism work.
#
# Example
# if (system("perl.exe foo.pl -l $lang")){
# errmsg("perl.exe foo.pl -l $lang failed.");
# # If you need to terminate function's execution on this error
# goto End;
# }
#
# (5) Log non-error information by using:
# logmsg "<log message>";
# and log error information by using:
# errmsg "<error message>";
#
# (6) Have your changes reviewed by a member of the US build team (ntbusa) and
# by a member of the international build team (ntbintl).
#
# -------------------------------------------------------------------------------------------
=head1 NAME
B<mypackage> - What this package for
=head1 SYNOPSIS
<An code example how to use>
=head1 DESCRIPTION
<Use above example to describe this package>
=head1 INSTANCES
=head2 <myinstances>
<Description of myinstances>
=head1 METHODS
=head2 <mymathods>
<Description of mymathods>
=head1 SEE ALSO
<Some related package or None>
=head1 AUTHOR
<Your Name <your e-mail address>>
=cut
1;