#!/usr/bin/perl use Getopt::Long; # 1. Get parameters versions(); setup(); if ($ownsource) { doOwnSource(); exit(0); } # 2. Prepare RPM (special version needed for SL4, ok for SL5 and later) rpmSetup(); # 4. Install HCAL release installHCAL(); installSetups(); # 5. Environment script makeEnvironment(); system("chmod u+x $binloc/*.exe"); sub versions { @allpackages=("hcalAux","hcalBase","hcalCalib","hcalClassic","hcalDCC","hcalHW","hcalMonVis", "hcalOnlineDB","hcalRBX","hcalSupervisor","hcalTrig","hcalAlarm","hcalCCM","hcalUpgrade","hcalUHTR","hcalUTCA","hcalngRBX"); %versions=(); $versions{"Release"}="13_2_1"; $versions{"HCALdaq"}=$versions{"Release"}; $slc_version=`expr \$(uname -r) : '.*el\\\([0-9]\\\)'`; $cmsos=`expr \$(grep "PACKAGE_RELEASE=" /opt/xdaq/config/mfRPM.release) | sed 's/PACKAGE_RELEASE=//' | tr -d '\n'`; if ($slc_version == 5) { $versions{"ROOT"}="hcal-root-5.28.00f-gcc412"; $versions{"XDAQ"}=$cmsos.".slc5.gcc4_1_2"; } elsif ($slc_version == 6) { $versions{"ROOT"}="hcal-root-5.28.00f-gcc44"; $versions{"XDAQ"}=$cmsos.".slc6.gcc4_4_7"; } else { print "No SLC Version Detected"; exit(1); } } sub setup { $prefix="default"; $xdaqroot="/opt/xdaq"; $arch=`uname -i`; chomp($arch); $xdaqarch=$versions{"XDAQ"}.".".$arch; $mode="unknown"; $hcalRepo="http://cmshcalweb01.cern.ch/hcalsw"; $source="1"; $clean=''; $help=''; $ownsource="default"; $versionInput="default"; $packages="default"; $svnuser="default"; $commonprefix="default"; $forceHCAL=''; $rpmcmd=''; $prepre=""; GetOptions("prefix=s" => \$prefix, "common=s" => \$commonprefix, "mode=s" => \$mode, "source" => \$source, "clean" => \$clean, "help" => \$help, "forceHCAL" => \$forceHCAL, "offsite" => \$offsite, "svnuser=s" => \$svnuser, "ownsource=s" => \$ownsource, "versionInput=s" => \$versionInput, "hcalrepo=s" => \$hcalRepo, "packages=s" => \$packages, "rpm=s" => \$rpmcmd); if ($help || $mode eq "unknown") { help(); exit(0); } if ($ownsource eq "default") { $ownsource="0"; } if ($prefix eq "default") { $aaa=$versions{"Release"}; $aaa=~s/_/./g; if ($mode eq "usc") { $prefix="/nfshome0/hcaldev/releases/"; $commonprefix="/opt/xdaq"; $prefix.="daq.$aaa"; } else { $prefix="/home/daqowner/daq.$aaa"; if ($commonprefix eq "default") { $commonprefix="/home/daqowner/common"; } } } elsif ($commonprefix eq "default") { $commonprefix=$prefix; } if ($mode eq "usc") { $hcalRepo="file:///nfshome0/hcalsw/dist"; @hcalsites=($hcalRepo."/RPM/"); } else { @hcalsites=($hcalRepo."/RPM/"); } $prepre=$prefix; $prepre=~s|/[^/]*$||; $binloc="$prefix/bin"; $libloc="$prefix/lib"; $etcloc="$prefix/etc"; $docloc="$prefix/doc"; $halloc="$prefix/hal"; $tmploc="$prefix/tmp"; $srcloc="$prefix/src"; $logloc="$commonprefix/monlog"; $cacheloc="$commonprefix/cache"; $rootloc="/opt/root/".$versions{"ROOT"}; if ($ownsource) { return; } # check for RPM versions open(RPMV,"rpm --version|"); $al=; $al=~/version ([0-9]+).([0-9]+).([0-9]+)/; if ($1 <= 4 && $2 <= 3) { $rpmMode="special"; } else { $rpmMode="builtin"; } $rpmloc="$prefix/local/rpm"; $rpmdb="$rpmloc/rpmdb"; if ($rpmcmd) { runRPM($rpmcmd); exit(0); } print <&1 |"); my @bits=; close(RPM); foreach (@bits) { chomp(); push @rv, $_; } } else { open(RPM,"$rpmExe --dbpath $rpmdb $arg1 $arg2 $arg3 $arg4 2>&1 |"); while () { next if (/lsetfilecon/); print; } close(RPM); } # print "$cmd\n"; if ($rpmMode eq "special") { $ENV{"LD_LIBRARY_PATH"}=$oldld; } return \@rv; } sub runWGET { my ($argi,$argo) = @_; if ($argi=~/file:\/\//) { my $actual=$argi; $actual=~s|file://||; print " ln -s $actual $argo\n"; system("ln -s $actual $argo"); return 0; } else { open(WG,"wget --no-check-certificate -nv -O $argo $argi 2>&1 |"); my @lines=; close(WG); if ($lines[0]=~/ERROR 404/ || $lines[1]=~/ERROR 404/ || $lines[2]=~/ERROR 404/) { return 404; } print @lines; return 0; } } sub installHCAL { # get the contents file my $contents_base="hcal-".$versions{"HCALdaq"}.".txt"; my $contents_url=$hcalRepo."/release/".$contents_base; my @categories=("base",$mode); if ($source) { push @categories,"devel"; } my $loops=4; my $opts=""; if ($forceHCAL) { $opts="force"; } for ($i=0; $i<$loops; $i++) { my $contentsRef=getNeededContents($contents_url,\@categories,$opts); my $packagesList=downloadPackages($contentsRef,\@hcalsites,$opts); installPackages($packagesList); $opts="nodownload"; } } sub installSetups { # get the contents file my $contents_base="hcal-".$versions{"HCALdaq"}.".txt"; my $contents_url=$hcalRepo."/release/".$contents_base; my @categories=("setup","setup-".$mode); my $contentsRef=getNeededContents($contents_url,\@categories,"nodownload"); my @sites=($hcalRepo."/RPM/"); my $packagesList=downloadPackages($contentsRef,\@sites); installPackages($packagesList,"--nopost --nopre"); } sub getNeededContents { my ($contentsUrl,$categoriesRef,$opts) = @_; my @contentsList=(); if ($opts=~/private/) { $contentsTemp="/tmp/contents_".$ENV{"USER"}; unlink($contentsTemp); } else { $contentsTemp=$contentsUrl; $contentsTemp=~s/.*[\/]//; $contentsTemp=$tmploc."/".$contentsTemp; } if (!($opts=~/nodownload/)) { if (runWGET($contentsUrl,$contentsTemp)) { exit(1); } } # get the list of items open(CONTENTS,"$contentsTemp"); $category=""; $active=0; my %possiblePack=(); my $packlist=""; while () { chomp; s/\#.*//; if (/\[([a-zA-Z0-9-_]+)\]/) { $category=$1; $active=grep { /$category/ } @{$categoriesRef}; } elsif (length($_)>4 && $active>0) { my ($pack,$ver)=split; if ($pack=~/devel/ && $ver=~/\((.*)\)/) { $possiblePack{$pack}=$possiblePack{$1}; } elsif ($ver=~/EXACT/) { # remove the .EXACT $ver=~s/[.]EXACT//; $possiblePack{$pack}=$ver; } else { # add the architecture $possiblePack{$pack}=$ver.".".$xdaqarch; } $packlist.=" $pack"; } } close(CONTENTS); if ($opts=~/tags/) { foreach $pack (keys %possiblePack) { my $ver=$possiblePack{$pack}; $expected="$pack $ver"; push(@contentsList,$expected); } } else { # check for possibility of already being installed $instL=runRPM("-q $packlist"); foreach $pack (keys %possiblePack) { my $ver=$possiblePack{$pack}; $expected="$pack-$ver"; $present=grep { /$expected/ } @{$instL}; if ($pack=~/hcal-base/ && $ver=~/nosbs/) { $actualVer=$ver; $actualVer=~s/[.]nosbs//; $expected="$pack-$actualVer"; $present=grep { /$expected/ } @{$instL}; } if ($opts=~/force/ || $present<1) { my $rpm=sprintf("%s-%s.rpm",$pack,$ver); push(@contentsList,$rpm); } } } return \@contentsList; } sub downloadPackages { my ($contentsL,$sitesL,$opts)=@_; my @packages=(); foreach $rpm (@{$contentsL}) { my $rpmDest=$tmploc."/".$rpm; foreach $site (@{$sitesL}) { my $rpmSrc=$site.$rpm; if ($opts=~/force/) { unlink($rpmDest); # if forcing, remove old files! } if (! -e $rpmDest) { $rv=runWGET($rpmSrc,$rpmDest); if ($rv==404) { unlink($rpmDest); #empty file } else { last; } } } if (-e $rpmDest) { push @packages,$rpmDest; } else { print " ERROR: Unable to download '$rpm'\n"; } } return \@packages; } sub installPackages { my ($packL,$extraArgs)=@_; return if ($#{$packL}<0); my $packlist=""; # install packages foreach $pack (@{$packL}) { $packlist=$packlist." $pack"; } runRPM("--relocate /opt/xdaq=$prefix --excludepath /var/opt/xdaq --excludepath /usr --excludepath /etc --nodeps $extraArgs -UvH $packlist"); } sub makeEnvironment { $javahome="/usr/java/default"; my $toolmode=$mode; $toolmode="central" if ($mode=~/usc/); my $cfgcvspoint="/home/daqowner/cfg"; if ($mode=="usc") { $cfgcvspoint="/nfshome0/hcalcfg"; } if ($mode=="teststand" && $ENV{"HOST"}=~/cern.ch/) { $cfgcvspoint="/opt/cfgcvs"; } system("wget ${hcalRepo}/hcostag -O ${binloc}/hcostag"); system("chmod +x ${binloc}/hcostag"); # create environment files open(ENV,">$etcloc/env.sh"); print ENV <$etcloc/env.csh"); print ENV <$binloc/startxdaq.sh"); print STARTXD <$etcloc/HTBDAQ_configdb.rc"); print RC "export HTBDAQ_CONFIGDB_DEFAULTS=\"--URL=jdbc:mysql://cmssrv0/HcalCfgDb --DBCLASS=hep.cms.hcal.db.config.sql.ConfigDB --USER=hcalwriter --PASSWORD=hadscr1be\"\n"; close(RC); } if ($mode=~/teststand/) { system("mkdir -p $commonprefix/bin"); open(PR,">$commonprefix/bin/pickRelease.sh"); print PR <$ownsource/hcal/config.hcal"); print CFG <