diff -r 000000000000 -r 83f4b4db085c bldsystemtools/commonbldutils/bfcClient.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bldsystemtools/commonbldutils/bfcClient.pl Tue Feb 02 01:39:43 2010 +0200 @@ -0,0 +1,190 @@ +# Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +#!/usr/bin/perl -w +use strict; +use Getopt::Long; +use HTTP::Date; + +my $JOBS_PATH = "autobfc\\"; +my $JOB_QUEUE = 'jobqueue.lst'; +my $CURR_JOB = 'currentjob.bat'; +my $QUIT_BFC = 'quit.txt'; + +my $ENV_BFCPOOL = "AutoBFCServerPool"; + + +SendBFC( ProcessCommandLine() ); + +# SendBFC +# Send a BFC test request to an active Auto BFC server +# +# Return 0 if request was successfully added to the BFC queue. +# +# N.B: Since this script is invoked during the system build, WARNING/ERROR +# messages must NOT be printed out in order to avoid affecting the BRAG status. +# + +sub SendBFC +{ + my ($iProduct, $iBuild, $iCodeline, $iServerPool, $iARMVer, $iMWVer, $iWait, $iExtraArg, $iQuit, $iSubType) = @_; + + # Get server list from ENV or from command line + $iServerPool = $ENV{$ENV_BFCPOOL} if (!defined($iServerPool)); + + my $server = FindAvailableServer(split /\#/, $iServerPool); + + if (!$server) + { + print "Could not find BFC server \n"; + return 1; + } + + my $jobQueue = "\\\\$server\\".$JOBS_PATH.$JOB_QUEUE; + + # Set basic release info + my $request = "Product=$iProduct,SnapshotNumber=$iBuild,CurrentCodeline=$iCodeline"; + + # Set timeout + if (defined($iWait) && !($iExtraArg =~ /-o/)) + { + my $nowStr = HTTP::Date::time2isoz(time() + $iWait*60*60); + $request .= ",BFCTimeout=$nowStr"; + } + + $request .= ",ARMRVCTBLD=$iARMVer" if ($iARMVer); + $request .= ",MWVER=$iMWVer" if ($iMWVer); + + $request .= ",QMAction=$iQuit" if ($iQuit); + + # Get BuildSubType from ENV or from command line, if specified. + $iSubType = $ENV{'BuildSubType'} unless ($iSubType); + $request .= ",BuildSubType=$iSubType" if ($iSubType); + + # Add extra arguments at the end + $request .= ",BFCCommand=$iExtraArg" if ($iExtraArg); + + # Add the request to the server queue + open FILE, ">> $jobQueue" or die "Can't open $jobQueue\n$!\n"; + print FILE "$request \n"; + close FILE; + + print "Added request: $request\nto $server\n"; + return 0; +} + +# FindAvailableServer +# Scan the server list and find an available AutoBFC server. +# +# Return the first bfc server with no jobs or the bfc server with +# the least jobs on the queue. +# +sub FindAvailableServer +{ + my @servers = @_; + + my %bestServer; + foreach my $server (@servers) + { + # Check autobfc shared dir. + my $jobsPath = "\\\\$server\\".$JOBS_PATH; + next if !(-d $jobsPath); + + # This is a valid server. + # Check the job list. + my $jobQueue = $jobsPath.$JOB_QUEUE; + my $currentJob = $jobsPath.$CURR_JOB; + push my @jobs, "current" if (-e $currentJob); + if (open (FH1, $jobQueue)) + { + push @jobs, ; + close FH1; + } + %bestServer = ('Server' => $server, 'Jobs' => scalar @jobs) if (!exists($bestServer{'Server'}) || (scalar @jobs < $bestServer{'Jobs'})); + last if ($bestServer{'Jobs'} == 0); + } + + return $bestServer{'Server'}; +} + + +# ProcessCommandLine +# + +sub ProcessCommandLine +{ + my ($iHelp); + my ($iProduct, $iBuild, $iCodeline, $iServerPool, $iARMVer, $iMWVer, $iWait, $iExtraArg, $iQuit, $iSubType); + + my $ret = GetOptions('h' => \$iHelp, + "product=s" => \$iProduct, + "build=s" => \$iBuild, + "codeline=s" => \$iCodeline, + "server=s" => \$iServerPool, + "arm=s" => \$iARMVer, + "mw=s" => \$iMWVer, + "wait=i" => \$iWait, + "reboot" => \$iQuit, + "type=s" => \$iSubType); + + $iExtraArg = join(' ', @ARGV); + + if ((!$ret) || ($iHelp) || (!defined $iProduct) || (!defined $iBuild) || (!defined $iCodeline)) + { + Usage(); + } + + if (defined($iQuit)) + { + $iQuit = "reboot"; + } + + return ($iProduct, $iBuild, $iCodeline, $iServerPool, $iARMVer, $iMWVer, $iWait, $iExtraArg, $iQuit, $iSubType); +} + +# Usage +# +# Output Usage Information. +# + +sub Usage +{ + print < -b -c -s [options] -- [bfc extra arg] + + --product Specify OS product (e.g. 9.1). + --build Specify Build Number (e.g. M04191). + --codeline Specify Codeline (e.g. Master, Symbian_OS_v9.4) + --server Hash separated BFC server list (e.g lon-engbuild20\#lon-engbuild21). + Alternatively, set $ENV_BFCPOOL. + + [Options] + -h This help + --arm Specify ARM version to be used (435 or 559 or 616). + --mw Specify Metrowerk version to be used (3.0 or 3.1.1 or 3.1.2). + --wait 0..n Force the bfc process to wait no more than n hours from now. + --reboot Force the bfc process to reboot before this task. + --type Specify BuildSubType (e.g. Daily, Test). + + [bfc extra arg] + Any other switches will be passed to the bfc process tools + +USAGE_EOF + exit 0; +} + +