346 lines
9.7 KiB
Batchfile
346 lines
9.7 KiB
Batchfile
|
@echo off
|
|||
|
REM ------------------------------------------------------------------
|
|||
|
REM
|
|||
|
REM movefiles.cmd
|
|||
|
REM Rearrange and collect files in preparation for PRS signing.
|
|||
|
REM
|
|||
|
REM Copyright (c) Microsoft Corporation. All rights reserved.
|
|||
|
REM Version: < 1.0 > 04/09/2001 Suemiao Rossignol
|
|||
|
REM ------------------------------------------------------------------
|
|||
|
perl -x "%~f0" %*
|
|||
|
goto :EOF
|
|||
|
#!perl
|
|||
|
use strict;
|
|||
|
use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts";
|
|||
|
use lib $ENV{RAZZLETOOLPATH};
|
|||
|
use PbuildEnv;
|
|||
|
use Logmsg;
|
|||
|
use ParseArgs;
|
|||
|
use File::Basename;
|
|||
|
use GetIniSetting;
|
|||
|
use comlib;
|
|||
|
#use HashText;
|
|||
|
use cksku;
|
|||
|
|
|||
|
|
|||
|
my $scriptname = basename( $0 );
|
|||
|
|
|||
|
sub Usage {
|
|||
|
print<<USAGE;
|
|||
|
|
|||
|
Submit PRS signing requests and wait until they finish.
|
|||
|
|
|||
|
Usage:
|
|||
|
$scriptname: -p:<Dest Path> [-d:<Aggregate Path>] [-n:<Build name>]
|
|||
|
|
|||
|
-p Destination path.
|
|||
|
A path to copy the signed files to when done.
|
|||
|
|
|||
|
-d Aggregate path.
|
|||
|
A path to conglomerate PRS files at before submitting to the prslab.
|
|||
|
|
|||
|
-n Build name.
|
|||
|
The name of the service pack or QFE being built.
|
|||
|
|
|||
|
-? Display Usage.
|
|||
|
|
|||
|
Example:
|
|||
|
$scriptname -l:ger -d:\\prs
|
|||
|
|
|||
|
|
|||
|
USAGE
|
|||
|
exit(1)
|
|||
|
}
|
|||
|
|
|||
|
my ( $aggDir, $destDir );
|
|||
|
my ( @tableHash );
|
|||
|
my ( @prodSkus,%skusDirName, @realSignFiles, @workDir );
|
|||
|
my ( $dash, $cmdLine );
|
|||
|
my ( $name, $buildName, %certLog, %certFileList, %certPath, %certReqID );
|
|||
|
|
|||
|
|
|||
|
exit(1) if( !&GetParams() );
|
|||
|
timemsg( "Start [$scriptname]" );
|
|||
|
|
|||
|
exit(1) if( !&InitVars() );
|
|||
|
|
|||
|
exit(1) if( !&SubmitReq );
|
|||
|
exit(1) if( &PollReq != 8 );
|
|||
|
|
|||
|
exit(1) if( !&ErrorCheck );
|
|||
|
|
|||
|
timemsg( "Complete [$scriptname]\n$dash" );
|
|||
|
exit(0);
|
|||
|
|
|||
|
#-----------------------------------------------------------------------------
|
|||
|
sub GetParams
|
|||
|
{
|
|||
|
parseargs('?' => \&Usage, 'p:' => \$destDir, 'd:' => \$aggDir, 'n:' => \$name );
|
|||
|
if( !$aggDir )
|
|||
|
{
|
|||
|
$aggDir="$ENV{_NTPOSTBLD}\\..\\build_logs\\prs";
|
|||
|
}
|
|||
|
if( !$name )
|
|||
|
{
|
|||
|
$name = "sp1";
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
#-----------------------------------------------------------------------------
|
|||
|
sub InitVars
|
|||
|
{
|
|||
|
#####Defind PRS file aggregation path
|
|||
|
%certPath = ( );
|
|||
|
|
|||
|
if ( -e "$aggDir\\prs" ) {
|
|||
|
$certPath{"prs"} = "$aggDir\\prs";
|
|||
|
} else {
|
|||
|
if ( !&comlib::ExecuteSystem( "touch /c $aggDir\\prs.txt" ) )
|
|||
|
{
|
|||
|
errmsg("Unable to mark signing for prs as skipped.");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
if ( -e "$aggDir\\fusion" ) {
|
|||
|
$certPath{"fusion"} = "$aggDir\\fusion";
|
|||
|
} else {
|
|||
|
if ( !&comlib::ExecuteSystem( "touch /c $aggDir\\fusion.txt" ) )
|
|||
|
{
|
|||
|
errmsg("Unable to mark signing for fusion as skipped.");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
if ( -e "$aggDir\\pack" ) {
|
|||
|
$certPath{"external"} = "$aggDir\\pack";
|
|||
|
} else {
|
|||
|
if ( !&comlib::ExecuteSystem( "touch /c $aggDir\\external.txt" ) )
|
|||
|
{
|
|||
|
errmsg("Unable to mark signing for external as skipped.");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#####Retrieve Build name
|
|||
|
if( ! ($buildName = build_name() ))
|
|||
|
{
|
|||
|
errmsg( "[$ENV{_ntpostbld}\\build_logs\\buildname.txt] not found, exit." );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
chomp( $buildName );
|
|||
|
|
|||
|
#####Define submit log
|
|||
|
system( "md \"$ENV{_ntpostbld}\\build_logs\\$buildName\" ") if( !( -e "$ENV{_ntpostbld}\\build_logs\\$buildName" ) );
|
|||
|
%certLog =( "prs" => "$ENV{_ntpostbld}\\build_logs\\$buildName\\submit_prs.log",
|
|||
|
"fusion" => "$ENV{_ntpostbld}\\build_logs\\$buildName\\submit_fusion.log",
|
|||
|
"external" => "$ENV{_ntpostbld}\\build_logs\\$buildName\\submit_ext.log" );
|
|||
|
|
|||
|
#####Misc Init
|
|||
|
$dash = '-' x 60;
|
|||
|
|
|||
|
#####Set Product Skus
|
|||
|
%skusDirName=( "pro" => ".", "per" => "perinf");
|
|||
|
|
|||
|
if ( $ENV{_BuildArch} =~ /x86/i ) {
|
|||
|
@prodSkus=("pro","per");
|
|||
|
}
|
|||
|
else {
|
|||
|
@prodSkus=("pro");
|
|||
|
}
|
|||
|
|
|||
|
#####Set Working directories
|
|||
|
push( @workDir, "." );
|
|||
|
|
|||
|
logmsg( "Build Name ..............[$buildName\]" );
|
|||
|
logmsg( "PRS Share Name...........[$aggDir]" );
|
|||
|
logmsg( "Dest Dir Name............[$destDir]" );
|
|||
|
logmsg( "Product Skus.............[@prodSkus]" );
|
|||
|
logmsg( "Working Directories......[@workDir]" );
|
|||
|
logmsg( "Log file ................[$ENV{LOGFILE}]" );
|
|||
|
logmsg( "Error file ..............[$ENV{ERRFILE}]" );
|
|||
|
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
#-----------------------------------------------------------------------------
|
|||
|
sub SubmitReq
|
|||
|
{
|
|||
|
my ( $cmdLine );
|
|||
|
logmsg( $dash );
|
|||
|
logmsg( "Submitting the signing request....." );
|
|||
|
for my $theCert( keys %certPath)
|
|||
|
{
|
|||
|
my $tmpCertType = $theCert;
|
|||
|
$tmpCertType = "buildlab" if ( $tmpCertType eq "prs" );
|
|||
|
my $dispname = "";
|
|||
|
if (lc $theCert eq "external") {
|
|||
|
if ($name =~ /^q/i) {
|
|||
|
$dispname = "-displayname:\"Windows XP QFE (".(uc$name).")\"";
|
|||
|
} else {
|
|||
|
$dispname = "-displayname:\"Windows XP Service Pack 1\"";
|
|||
|
}
|
|||
|
}
|
|||
|
$cmdLine = "$ENV{RAZZLETOOLPATH}\\sp\\prs\\submit.cmd $certPath{$theCert} -cert:$tmpCertType $dispname >> $certLog{$theCert}";
|
|||
|
if( !&comlib::ExecuteSystem( $cmdLine ) )
|
|||
|
{
|
|||
|
errmsg( "Error on submitting files for $theCert" );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if( !( $certReqID{$theCert} = &comlib::ParsePrsSubmitLog( $certLog{$theCert}, "Request was successfully submitted. ID #" ) ) )
|
|||
|
{
|
|||
|
errmsg( "Failed to parse [$certLog{$theCert}]");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
logmsg( "$theCert - $certReqID{$theCert}" );
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
#-----------------------------------------------------------------------------
|
|||
|
sub PollReq
|
|||
|
{
|
|||
|
use Win32::OLE qw(in);
|
|||
|
my %status = ( 1 => 'Pre-Activation',
|
|||
|
2 => 'Waiting for Sign-Off',
|
|||
|
3 => 'Waiting for Virus Check',
|
|||
|
5 => 'Waiting for Digital Signature',
|
|||
|
6 => 'Waiting for Time Stamp',
|
|||
|
7 => 'Waiting to be posted to signed server',
|
|||
|
8 => 'Complete. Posted to Signed Server',
|
|||
|
30 => 'Problem Occurred (contact signhelp to reactivate request)',
|
|||
|
60 => 'Failed: Signer Rejected Job',
|
|||
|
64 => 'Could not strong name sign one or more files',
|
|||
|
65 => 'Failed: Automatic Handoff Failed',
|
|||
|
66 => 'Failed: Virus Found',
|
|||
|
67 => 'Failed: Couldn<64>t Digitally Sign One or More Files',
|
|||
|
68 => 'Failed: Couldn<64>t Time Stamp One or More Files',
|
|||
|
69 => 'Failed: Job Inactive Too Long',
|
|||
|
70 => 'Administratively Failed',
|
|||
|
71 => 'Waiting for manual review',
|
|||
|
72 => 'On Hold For Phone Verification' );
|
|||
|
|
|||
|
|
|||
|
logmsg( $dash );
|
|||
|
logmsg( "-----Polling the request status-----" );
|
|||
|
|
|||
|
my $request;
|
|||
|
|
|||
|
if( ! ($request = Win32::OLE->new('SecureCodeSign.CodeSign')) )
|
|||
|
{
|
|||
|
errmsg( "Failed to instantiate request object ". Win32::OLE->LastError() );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if( !$request->Init( "production" ) )
|
|||
|
{
|
|||
|
errmsg( "Failed to Connect to server and validate permission" );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
for my $theCert( sort keys %certReqID)
|
|||
|
{
|
|||
|
logmsg( $dash );
|
|||
|
logmsg ( "Polling ID# [$certReqID{$theCert}] for [$theCert]....." );
|
|||
|
while( 1 )
|
|||
|
{
|
|||
|
if ( !$request->UpdateStatus($certReqID{$theCert}) )
|
|||
|
{
|
|||
|
errmsg( "Failed determining request status: ". Win32::OLE->LastError() );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
timemsg( $request->Status ." - " .$status{$request->Status} );
|
|||
|
if( $request->Status == 8)
|
|||
|
{
|
|||
|
logmsg( $dash );
|
|||
|
return 0 if !&GetFiles($theCert);
|
|||
|
last;
|
|||
|
}
|
|||
|
|
|||
|
sleep( 60 );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return $request->status;
|
|||
|
}
|
|||
|
#-----------------------------------------------------------------------------
|
|||
|
sub MailSignhelp
|
|||
|
{
|
|||
|
my ( $pSubject ) = @_;
|
|||
|
|
|||
|
require $ENV{'sdxroot'} . '\TOOLS\sendmsg.pl';
|
|||
|
|
|||
|
my $mailFrom = "ntbld";
|
|||
|
|
|||
|
|
|||
|
my $mailMsg = "Please investigate.\n Thanks!\n\n";
|
|||
|
$mailMsg .= "Windows US Build Team : http://ntbld/\n";
|
|||
|
$mailMsg .= "NT Build Lab 26N/2219 - x66817\n";
|
|||
|
|
|||
|
my @mailTO = ( "signhelp" );
|
|||
|
if( sendmsg ('-v', $mailFrom, $pSubject, $mailMsg, @mailTO))
|
|||
|
{
|
|||
|
print "WARNING: sendmsg failed!\n";
|
|||
|
return 0;
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
#-----------------------------------------------------------------------------
|
|||
|
sub GetFiles
|
|||
|
{
|
|||
|
my ( $theCert ) = @_;
|
|||
|
my $reqID = $certReqID{$theCert};
|
|||
|
my $src = "\\\\prslab\\signed2\\$ENV{username}$reqID";
|
|||
|
|
|||
|
my $dst = $certPath{$theCert};
|
|||
|
$dst =~ s/\Q$aggDir\E/$destDir/i;
|
|||
|
&comlib::ExecuteSystem( "md $dst" ) if ( !( -d $dst ) );
|
|||
|
|
|||
|
if ( !&comlib::ExecuteSystem( "xcopy /eify $src $dst" ) )
|
|||
|
{
|
|||
|
errmsg("Unable to retrieve signed files from $dst to $src.");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if ( !&comlib::ExecuteSystem( "touch /c $certPath{$theCert}\\..\\$theCert.txt" ) )
|
|||
|
{
|
|||
|
errmsg("Unable to mark signing for $theCert as complete.");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
#-----------------------------------------------------------------------------
|
|||
|
sub ErrorCheck
|
|||
|
{
|
|||
|
#####Check error logs
|
|||
|
if( -e $ENV{errfile} && !(-z $ENV{errfile}) )
|
|||
|
{
|
|||
|
$ENV{errfile} =~ /(.*)\.tmp$/;
|
|||
|
errmsg( $dash );
|
|||
|
errmsg("Please check error at $1");
|
|||
|
return 0;
|
|||
|
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
#-----------------------------------------------------------------------------
|
|||
|
sub build_name
|
|||
|
{
|
|||
|
return $name if $name =~ /^q/i;
|
|||
|
my $buildPath="$ENV{_ntpostbld}\\congeal_scripts";
|
|||
|
my $buildFileName="__qfenum__";
|
|||
|
if (-e "$buildPath\\$buildFileName") {
|
|||
|
open F,"$buildPath\\$buildFileName" or die "unable to ipen $buildPath\\$buildFileName ";
|
|||
|
my $buildNumber=<F>;
|
|||
|
if ( $buildNumber=~/^QFEBUILDNUMBER=(\d*)$/ ){
|
|||
|
return $1;
|
|||
|
}
|
|||
|
else{
|
|||
|
wrnmsg "$buildPath\\$buildFileName format is not correct. Defaulting to 9999";
|
|||
|
return 9999;
|
|||
|
}
|
|||
|
close F;
|
|||
|
}
|
|||
|
else {
|
|||
|
wrnmsg "$buildPath\\$buildFileName not found. Defaulting to 9999";
|
|||
|
return 9999;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
1;
|