@echo off REM ------------------------------------------------------------------ REM REM raisesp.cmd REM This script raises the xpsp builds in the dfs REM REM Copyright (c) Microsoft Corporation. All rights reserved. REM REM ------------------------------------------------------------------ perl -x "%~f0" %* goto :EOF #!perl use strict; use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts"; use lib $ENV{RAZZLETOOLPATH}; use PbuildEnv; use ParseArgs; use Logmsg; use ParseTable; # # Global vars # # Command line parameters my ($qfenum, $quality, $arch, $debug); # dfslinks hash my @ah_dfs; # Error return my $errorcode; sub Usage { print< \&Usage, 'n:' => \$qfenum, 'q:' => \$quality, 'a:' => \$arch, 'd:' => \$debug ); # # Main # &main(); # # Main entry point. Runs all functions. # sub main { #Validate command line unless ( $errorcode = &ValidateCmdLine() ) { logmsg ( "Bad command line arguments" ); logmsg ( "Exiting..." ); return; } #Only run if offical build machine unless ( $errorcode = &IsOfficial() ) { logmsg ( "This script only runs on OFFICIAL_BUILD_MACHINE's." ); logmsg ( "Exiting..." ); return; } #Load and parse dfs data file unless ( @ah_dfs = &ParseDfsData( ($ENV{"RazzleToolPath"} . "\\sp\\spdfs.txt"), \@ah_dfs) ) { logmsg ( "Could not parse spdfs.txt." ); logmsg ( "Exiting..." ); return; } # Sub variables in hash unless ( @ah_dfs = &FilterHash( $qfenum, $arch, $debug, $ENV{LANG}, \@ah_dfs ) ) { logmsg ( "Could not filter Dfs hash." ); logmsg ( "Exiting..." ); return; } # Edit the dfs server unless ( &EditDfs( $quality, \@ah_dfs ) ) { logmsg ( "Could not create dfs links." ); logmsg ( "Exiting..." ); return; } } # # Function: Validate the command line # # return: 1 if true; undef if false # sub ValidateCmdLine { if ( $qfenum !~ /^\d{4}$/ ) { logmsg ("Bad qfe number"); return; } if ( $quality !~ /^(tst|bvt|idw|del)$/i ) { logmsg ("Bad quality value"); return; } if ( $arch !~ /^(x86|ia64|amd64)$/i ) { logmsg ("Bad arch value"); return; } if ( $debug !~ /^(fre|chk)$/i ) { logmsg ("Bad debug value"); return; } return 1; } # # Function: Check if local machine is OFFICIAL # # return: 1 if true; undef if false # sub IsOfficial { if ( exists ($ENV{OFFICIAL_BUILD_MACHINE}) ) { return 1; } return; } # # Function: Read spdfs.txt and return a hash # # return: % # sub ParseDfsData { my ($input_file, $ah_dfs) = @_; my (@ah_dfs); logmsg ("#### Parsing $input_file ####"); ParseTable::parse_table_file($input_file, \@ah_dfs); return @ah_dfs; } # # Function: Sub variables in hash for real values. # # return: % # sub FilterHash { my ($qfenum, $arch, $debug, $lang, $ah_dfs) = @_; logmsg ("#### Parse dfs hash w/variables ####"); # Log filter values logmsg ("Qfenum: $qfenum"); logmsg ("Architecure: $arch"); logmsg ("Debug: $debug"); logmsg ("Lang: $lang"); my $dfslink; my @ah_dfs = @$ah_dfs; for $dfslink (@ah_dfs) { # Make DfsRoot name variable substitutions $dfslink->{DfsRoot} =~ s//$qfenum/ig; $dfslink->{DfsRoot} =~ s//$arch/ig; $dfslink->{DfsRoot} =~ s//$debug/ig; $dfslink->{DfsRoot} =~ s//$lang/ig; # Make FileShare name variable substitutions $dfslink->{FileShare} =~ s//$ENV{COMPUTERNAME}/ig; $dfslink->{FileShare} =~ s//$qfenum/ig; $dfslink->{FileShare} =~ s//$arch/ig; $dfslink->{FileShare} =~ s//$debug/ig; $dfslink->{FileShare} =~ s//$lang/ig; # Make Comment variable substitutions $dfslink->{Comment} =~ s//$qfenum/ig; $dfslink->{Comment} =~ s//$arch/ig; $dfslink->{Comment} =~ s//$debug/ig; $dfslink->{Comment} =~ s//$lang/ig; } return @ah_dfs = @$ah_dfs; } # # Function: Edit dfs using dfscmd.exe # # return: # sub EditDfs { my ($quality, $ah_dfs) = @_; # Exit if quality is undefined if ($quality !~ m/(tst|bvt|idw|del)/i ) { return; } # Local vars my $dfslink; my @ah_dfs = @$ah_dfs; my $cmdLine; my @cmdOutput; my @dfsViewOutput; logmsg ("#### Viewing current dfslinks ####"); #View dfs links logmsg ("View the dfslinks..."); $cmdLine = "dfscmd /view"; $cmdLine .= " \\\\ntdev\\release"; logmsg ("Running: $cmdLine"); # @dfsViewOutput = `$cmdLine`; # logmsg ("@dfsViewOutput"); logmsg ("#### Creating the dfslinks ####"); for $dfslink ( @ah_dfs ) { if ( $dfslink->{Condition} =~ $quality ) { #Remove dfs links logmsg ("Delete the dfslinks..."); $cmdLine = "dfscmd /unmap"; $cmdLine .= " $dfslink->{DfsRoot}"; logmsg ("Running: $cmdLine"); @cmdOutput = `$cmdLine`; logmsg ("@cmdOutput"); } if ( $dfslink->{Condition} =~ $quality ) { # Create dfs links logmsg ("Create the dfslinks..."); $cmdLine = "dfscmd /map"; $cmdLine .= " $dfslink->{DfsRoot}"; $cmdLine .= " $dfslink->{FileShare}"; $cmdLine .= " \"$dfslink->{Comment}\""; logmsg ("Running: $cmdLine"); @cmdOutput = `$cmdLine`; logmsg ("@cmdOutput"); } } return 1; } sub DumpHash { my ($ah_dfs) = @_; my $dfslink; my @ah_dfs = @$ah_dfs; logmsg ("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); for $dfslink (@ah_dfs) { logmsg ("***************************************"); logmsg ("DfsLink: $dfslink->{DfsRoot}"); logmsg ("FileShare: $dfslink->{FileShare}"); logmsg ("Comment: $dfslink->{Comment}"); logmsg ("Condition: $dfslink->{Condition}"); } logmsg ("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); return 1; }