WindowsXP/Source/XPSP1/NT/tools/checkdepots.pl
2024-08-03 16:30:48 +02:00

126 lines
3.3 KiB
Perl

#----------------------------------------------------------------//
# Script: checkdepots.pl
#
# (c) 2001 Microsoft Corporation. All rights reserved.
#
# Purpose: This script validates if all depots have a mapping
# consistent with the root depot in a particular drive
# enlistment. This tool should be run from the root of the
# enlistment drive of interest and is. Currently it is
# invoked as part of razzle with an optional argument i.e.:
# razzle.cmd checkdepots
#
#
# Version: <1.00> 03/22/2001 : VishnuP
#----------------------------------------------------------------//
$VERSION = '1.00';
if ($#ARGV != -1) {
die "usage: perl.exe checkdepots.pl\n";
}
$sdxroot = $ENV{'SDXROOT'} || die "SDXROOT not defined\n";
chdir($sdxroot);
print "\nChecking for consistent mappings...\n";
$SdRootMapping = `sd client -o`;
if ($SdRootMapping =~ m/depot\/([^\/]+)\/root\/... /){
$SdRootDepotMapping = lc($1);
}
else {
die "Warning: Either there are Source Depot problems or some client specification(s) might be corrupt in $sdxroot.\n";
}
@dirs = `dir /ad /b $sdxroot`;
chomp(@dirs);
@serverarray = ();
foreach $dir (@dirs) {
$dir = "$sdxroot\\$dir";
if (-e "$dir\\sd.ini"){
chdir($dir);
$server = `sd info | findstr /c:"Server address:"`;
if ($server = ~ m/Server/){
push(@serverarray, $server);
}
else {
die "Warning: Either there are Source Depot problems or some client specification(s) might be corrupt in $dir\n";
}
}
}
chdir($sdxroot);
%seen = ();
@uniqeservers = ();
foreach $server (@serverarray) {
push(@uniqeservers, $server) unless $seen{$server}++;
}
for (@cleanservers = @uniqeservers) { s/Server address: //, s/.ntdev.microsoft.com// };
chomp(@cleanservers);
$bIsInconsistent = 0;
print "root -> $SdRootDepotMapping, ";
$depotprintcount = 1;
$depotcount = 1;
@inconsistencies = ();
foreach $server (@cleanservers){
$sdcmd = "sd -p $server client -o | findstr /i /c:\"//depot/\" | findstr /i /v /c:\"//depot/$ARGV[0]/\"";
$output = `$sdcmd`;
if ($output =~ m/depot\/([^\/]+)\/([^\/]+)\/... /){
$depotmatch = lc($1);
if (!($depotmatch eq $SdRootDepotMapping)){
$inconsistency = "$2 -> $depotmatch";
push(@inconsistencies, $inconsistency);
$bIsInconsistent = 1;
}
else {
if (($depotprintcount) % 3 == 0 || $depotcount == $#cleanservers+1 ){
$separator = "\n";
}
else {
$separator = ", ";
}
print "$2 -> ",$depotmatch, $separator;
++$depotprintcount;
}
++$depotcount;
}
else {
die "Warning: Either there are Source Depot problems or some client specification(s) might be corrupt when querying server $server.\n";
}
}
if (!$bIsInconsistent){
print "\nInformation: All depots are consistent with the root depot's mapping\n";
}
else {
print "\nInconsistent mapping(s): ";
$inconsistencyCnt = 0;
foreach $inconsistency (@inconsistencies){
if ($inconsistencyCnt == $#inconsistencies) {
$separator = "\n";
}
else {
$separator = ", ";
}
print $inconsistency, $separator;
$inconsistencyCnt++;
}
print "\nWarning: At least one depot does not map to the same depot that the root\n";
print "depot maps to as reported above. If this is not the intention, please edit\n";
print "the client specification for the inconsistent depots.\n";
}