#!/usr/bin/env python
#-*- coding: ISO-8859-1 -*-
#pylint: disable-msg=C0301,W0702,C0103,R0903,R0914,R0912,R0915,R0913,C0302,W0141
"""
File : cmssh_install.py
Author : Valentin Kuznetsov [ vkuznet AT gmail DOT com ]
Description: cmssh installation script
Some useful URLs
http://www.globus.org/ftppub/gt5/5.0/5.0.4/installers/src/gt5.0.4-all-source-installer.tar.bz2
http://www.nikhef.nl/pub/projects/grid/gridwiki/index.php/Using_voms-proxy-init_on_an_OSX_(10.4_or_higher)_system
https://twiki.grid.iu.edu/bin/view/ReleaseDocumentation/VomsInstallGuide
"""
import sys
if sys.version_info < (2, 6):
raise Exception("cmssh requires python 2.6 or higher")
# system modules
import os
import re
import stat
import copy
import time
import shutil
import socket
import urllib2
import tarfile
import subprocess
# local modules
from optparse import OptionParser
def osx_test():
"Test XCode presence for OSX"
for tool in ['/usr/bin/make', '/usr/include/limits.h']:
if not os.path.isfile(tool):
msg = """######## ERROR ########
Can't locate %s
In order to install and run cmssh on Mac OS X, your system must
have the following components:
Snow Leopard (OSX version 10.8.x)
- Install Xcode from your installation media (CD/DVD)
Lion (OSX version 10.7.x)
- Install Xcode 4.2.x from your installation media (CD/DVD) or
from the Mac App Store
Mountain Lion (OSX version 10.8.x)
- Install Xcode 4.4.x from the Mac App Store
- drag the Xcode app to your /Applications folder,
then run it - It will install almost everything needed
- Open Xcode preferences to install command line tools, see
http://bit.ly/TIdOgS
- Make sure that Java is installed, see http://bit.ly/NoAmkv
""" % tool
print msg
sys.exit(1)
def osx_ver():
"Determine OSX version"
cmd = 'sw_vers -productVersion'
res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
ver = res.stdout.read().replace('\n', '').strip()
return '.'.join(ver.split('.')[:2])
def get_scram_arch():
"Determine SCRAM architecture"
if os.uname()[0] == 'Darwin':
osx_test()
# For OSX Lion I need osx107, but existing packages
# have problem with bootstrap, see
# https://hypernews.cern.ch/HyperNews/CMS/get/sw-develtools/1743/1/1/1/1/2/1.html
# I need to wait until it is fixed, therefore I use arch osx106_amd64_gcc421
# which seems to be working
arch = 'osx106_amd64_gcc421'
if osx_ver() == '10.7':
arch = 'osx107_amd64_gcc462'
if osx_ver() == '10.8':
arch = 'osx108_amd64_gcc470'
elif os.uname()[0] == 'Linux':
if os.uname()[-1] == 'x86_64':
arch = 'slc5_amd64_gcc462'
else:
arch = 'slc5_ia32_gcc434'
# test presence of readline
if hasattr(subprocess, "check_output"):
cond = re.search("libreadline\.so\.5", subprocess.check_output(["/sbin/ldconfig", "-p"]))
else:
cmd = "/sbin/ldconfig -p"
res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
libs = [l for l in res.stdout.readlines() if l.find('libreadline.so.5') != -1]
cond = len(libs)
if not cond:
msg = 'cmssh on Linux requires readline5. Please verify that'
msg += ' you have it installed on your system.'
raise Exception(msg)
else:
print 'Unsupported platform'
sys.exit(1)
return arch
# generate pkgconfig pc file
def pc_file(path, name, ver, lib, inc):
"Generate pkgconfig file"
tmpl = """
prefix=%(path)s
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/lib%(lib)s
Name: %(name)s
Description: %(name)s
Version: %(ver)s
Libs: -L${libdir} -l%(lib)s
Libs.private: -lz -lbz2
Cflags: -I${includedir} -I${includedir}/%(inc)s
""" % {'path':path, 'name':name, 'lib': lib, 'inc':inc, 'ver': ver}
return tmpl
# helper function to make natural sort
def try_int(sss):
"Convert to integer if possible."
try:
return int(sss)
except:
return sss
def natsort_key(sss):
"Used internally to get a tuple by which s is sorted."
return map(try_int, re.findall(r'(\d+|\D+)', sss))
def natcmp(aaa, bbb):
"Natural string comparison, case sensitive."
return cmp(natsort_key(aaa), natsort_key(bbb))
def natsort(seq, compare=natcmp):
"In-place natural string sort."
seq.sort(compare)
def natsorted(seq, compare=natcmp):
"Returns a copy of seq, sorted by natural string sort."
temp = copy.copy(seq)
natsort(temp, compare)
return temp
# Retrieve default scram arch based on OS version and use it globally
# in the rest of the code
DEF_SCRAM_ARCH = get_scram_arch()
# IMPORTANT
# The 2.6.4 version of CMSSW python has bug in OpenSSL
# see https://hypernews.cern.ch/HyperNews/CMS/get/sw-develtools/1667/1.html
# We need to avoid it, otherwise usage of HTTPS will be broken
# So, the osx106_amd64_gcc462 has broken python 2.6.4
# the osx106_amd64_gcc461 has correct python 2.6.4, but broken 2.6.4-cmsX
# the osx106_amd64_gcc421 has corrent python 2.6.4, but it picks root 5.30.02
# which does not have pyROOT library
def find_pkg(pkg, rel_pkgs):
"Find given package in list of release packages"
for rel_pkg in rel_pkgs:
if pkg == rel_pkg or rel_pkg.find(pkg) != -1:
return rel_pkg
def find_cms_package(apt_init, pkg, debug=None, lookup=None, rel_pkgs=[]):
"""
Find latest version of given package in CMSSW repository.
"""
if not lookup:
lookup = pkg
cmd = 'source %s; apt-cache search %s | grep "%s" | grep -v toolfile ' % (apt_init, pkg, lookup)
if debug:
print cmd
if DEF_SCRAM_ARCH == 'osx107_amd64_gcc462':
rel_pkg = find_pkg(lookup, rel_pkgs)
if rel_pkg:
name = rel_pkg
elif pkg == 'coral':
# fix coral lib issue for this arch
# https://hypernews.cern.ch/HyperNews/CMS/get/softwareDistrib/682.html
name = 'cms+coral+CORAL_2_3_21-cms25'
else:
res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
vers = [r.replace('\n', '').split()[0] for r in res.stdout.readlines()]
name = natsorted(vers)[-1]
elif DEF_SCRAM_ARCH == 'osx106_amd64_gcc421': # Snow Leopard
if pkg == 'root':
name = 'lcg+root+5.30.02-cms4'
elif pkg == 'py2-matplotlib':
name = 'external+py2-matplotlib+1.0.1-cms3'
elif pkg == 'py2-scipy':
name = 'external+py2-scipy+0.8.0-cms3'
elif pkg == 'coral':
name = 'cms+coral+CORAL_2_3_12-cms30'
elif pkg == 'py2-pycurl':
name = 'external+py2-pycurl+7.19.0'
else:
res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
vers = [r.replace('\n', '').split()[0] for r in res.stdout.readlines()]
name = natsorted(vers)[-1]
else:
rel_pkg = find_pkg(lookup, rel_pkgs)
if rel_pkg:
name = rel_pkg
else:
res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
vers = [r.replace('\n', '').split()[0] for r in res.stdout.readlines()]
name = natsorted(vers)[-1]
return name
def find_installed_pkg(name, debug=0):
"Find latest version (via natural sort) of installed package for a given name"
cmd = 'find $VO_CMS_SW_DIR/$SCRAM_ARCH/%s/*/etc/profile.d -name init.sh' % name
res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
script = '/etc/profile.d/init.sh'
vers = [r.replace('\n', '').split()[0].replace(script, '') for r in res.stdout.readlines()]
try:
init = natsorted(vers)[-1] + script
except:
if debug:
print "Unable to process, name=%s, ver=%s" % (name, vers)
if vers:
print natsorted(vers)
return None, None, None
root = '/'.join(init.split('/')[:-3])
ver = init.split('/')[-4]
return init, root, ver
def available_architectures():
"Fetch CMSSW drivers"
arch = os.uname()[0]
pat1 = re.compile('.*-driver.txt.*')
pat2 = re.compile('^[osx,slc].*')
url = 'http://cmsrep.cern.ch/cmssw/cms/'
data = urllib2.urlopen(url)
for line in data.readlines():
if pat1.match(line):
line = line.split('')[0].split('">')[-1]
if pat2.match(line):
if arch == 'Linux' and line[:3] == 'slc':
yield line.replace('-driver.txt', '')
elif arch == 'Darwin' and line[:3] == 'osx':
yield line.replace('-driver.txt', '')
def install_pip_pkg(pkgs, cms_env, path, debug, pkg, ver=None, opts=None, env_list=None):
"""
Install pip package. User must provide:
- pkgs, installed package list
- cms_env, cms_environment source string
- path, cmssh install path
- debug flag
- pkg to be installed
- optional: version, options and environment list (key-value tuple)
"""
print "Install", pkg
cmd = cms_env
if env_list:
for key, val in env_list:
os.environ[key] = val
if debug:
print "os.environ[%s]=%s" % (key, val)
if not pkgs.has_key(pkg):
if ver:
cmd += '%s/install/bin/pip install %s==%s' % (path, pkg, ver)
else:
cmd += '%s/install/bin/pip install --upgrade %s' % (path, pkg)
if opts:
cmd += ' ' + opts
exe_cmd(path, cmd, debug, log='%s.log' % pkg)
if env_list:
for key, val in env_list:
del os.environ[key] # clean-up env settings
def replace_in_file(fname, pat, new_pat):
"Replace given pattern to new one for given file name"
new_fname = '%s.%s' % (fname, int(time.time()))
with open(fname, 'r') as old_file:
with open(new_fname, 'w') as new_file:
lines = old_file.read()
lines = lines.replace(pat, new_pat)
new_file.write(lines)
os.remove(fname)
shutil.move(new_fname, fname)
def siteconfig():
"Generate dummy site config file used by lumiDB"
header = """"""
bottom = """"""
body = ""
idict = {'proxy': {'host': 'cmst0frontier', 'port': 3128},
'backupproxy': {'host': 'cmsbpfrontier', 'port': 3128},
'server': {'host': 'cmsfrontier', 'port': 8000, 'api': 'FrontierInt'}}
for tag, item in idict.items():
for num in ['', '1', '2']:
url = "http://%s%s.cern.ch:%s" % (item['host'], num, item['port'])
if item.has_key('api'):
url += "/%s" % item['api']
entry = '<%s url="%s"/>' % (tag, url)
body += entry
return header + body + bottom
class MyOptionParser:
"""option parser"""
def __init__(self):
self.parser = OptionParser()
self.parser.add_option("-v", "--verbose", action="store",
type="int", default=0, dest="debug",
help="verbose output")
self.parser.add_option("-d", "--dir", action="store",
type="string", default=None,
dest="install_dir", help="install directory")
self.parser.add_option("-i", "--install", action="store_true",
dest="install", help="install cmssh and its dependencies")
self.parser.add_option("-u", "--upgrade", action="store_true",
dest="upgrade", help="upgrade cmssh")
self.parser.add_option("--version", action="store",
type="string", default="1.0.0",
dest="version", help="get specific version of cmssh, e.g. master")
drivers = ', '.join(available_architectures())
self.parser.add_option("--arch", action="store",
type="string", default=None, dest="arch",
help="CMSSW architectures:\n%s, default %s" % (drivers, DEF_SCRAM_ARCH))
self.parser.add_option("--cmssw", action="store",
type="string", default=None, dest="cmssw",
help="specify location of CMSSW install area")
if socket.gethostname().find('cern.ch') != -1:
lcg_default = '/afs/cern.ch/cms/LCG/LCG-2/UI/cms_ui_env.sh'
else:
lcg_default = ''
self.parser.add_option("--lcg", action="store",
type="string", default=lcg_default, dest="lcg",
help="specify script to setup LCG/OSG environment")
self.parser.add_option("--multi-user", action="store_true",
default=False, dest="multi_user",
help="install cmssh in multi-user environment")
self.parser.add_option("--unsupported", action="store_true",
dest="unsupported",
help="enforce installation on unsupported CMS platforms, e.g. non SLC Linux")
self.parser.add_option("--seed", action="store",
type="string", default="", dest="seed",
help="seed dependencies from given release")
def get_opt(self):
"""Returns parse list of options"""
return self.parser.parse_args()
def getdata(url, verbose=0):
"""Invoke URL call and retrieve data for given url/params/headers"""
headers = {}
if verbose:
print '+++ getdata url=%s' % url
req = urllib2.Request(url)
for key, val in headers.items():
req.add_header(key, val)
if verbose > 1:
handler = urllib2.HTTPHandler(debuglevel=1)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
data = urllib2.urlopen(req)
return data.read()
def is_installed(url, path):
"Check if already installed a package for given URL"
fname = os.path.join(path, '.packages')
if os.path.isfile(fname):
with open(fname, 'r') as packages:
for line in packages.readlines():
if url == line.replace('\n', ''):
return True
return False
def add_url2packages(url, path):
"Add url to packages file"
with open(os.path.join(path, '.packages'), 'a') as packages:
packages.write(url + '\n')
def get_file(url, fname, path, debug, ext='r:gz'):
"""Fetch tarball from given url and store it as fname, untar it into given path"""
os.chdir(path)
with open(fname, 'w') as tar_file:
tar_file.write(getdata(url, debug))
tar = tarfile.open(fname, ext)
top_names = set([r.split('/')[0] for r in tar.getnames()])
if len(top_names) == 1:
dir_name = top_names.pop()
if os.path.isdir(dir_name):
try:
os.removedirs(dir_name)
except:
pass
tar.extractall(path)
tar.close()
add_url2packages(url, path)
def exe_cmd(idir, cmd, debug, msg=None, log='install.log'):
"""Execute given command in a given dir"""
if msg:
print msg
os.chdir(idir)
if debug:
print "cd %s\n%s" % (idir, cmd)
with open(log, 'w') as logstream:
try:
retcode = subprocess.call(cmd, shell=True, stdout=logstream, stderr=logstream)
if retcode < 0:
print >> sys.stderr, "Child was terminated by signal", -retcode
except OSError, err:
print >> sys.stderr, "Execution failed:", err
def check_system(unsupported):
"Check system requirements"
# check presence of Java, required for GRID middleware
if not os.environ.has_key('JAVA_HOME'):
print "JAVA_HOME environment is required to install GRID middleware tools"
print "Please install Java and appropriately setup JAVA_HOME"
print "For example, export JAVA_HOME=/usr"
sys.exit(1)
# check Ubuntu default shell
if os.uname()[3].find('Ubuntu') != -1 or unsupported:
if os.readlink('/bin/sh') != 'bash':
msg = 'The /bin/sh is pointing to %s.\n'
msg += 'For proper installation of CMSSW software\n'
msg += 're-configure /bin/sh to point to /bin/bash.\n'
msg += 'On Ubuntu, if you have /bin/sh -> /bin/dash, just do:\n'
msg += 'sudo dpkg-reconfigure dash'
print msg
sys.exit(1)
def test_Fortran():
"Test presence of Fortran on the system"
for cmd in ['g95', 'f95', 'f90', 'f77', \
'xlf90', 'xlf', 'ifort', 'ifc', \
'g77', 'gfortran', 'pgfortran']:
cmd = 'which %s' % cmd
res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
rpath = res.stdout.read()
return rpath
def main():
"Main function"
mgr = MyOptionParser()
opts, _ = mgr.get_opt()
use_lcg = opts.lcg
platform = os.uname()[0]
if platform == 'Darwin':
if not os.environ.has_key('JAVA_HOME'):
os.environ['JAVA_HOME'] = '/Library/Java/Home'
elif platform == 'Linux':
if not os.environ.has_key('JAVA_HOME'):
if os.path.isfile('/usr/bin/java') or os.path.islink('/usr/bin/java'):
os.environ['JAVA_HOME'] = '/usr'
elif os.path.isfile('/usr/local/bin/java') or os.path.islink('/usr/local/bin/java'):
os.environ['JAVA_HOME'] = '/usr/local'
elif os.path.isfile('/opt/local/bin/java') or os.path.islink('/opt/local/bin/java'):
os.environ['JAVA_HOME'] = '/opt/local'
if not opts.install and not opts.upgrade:
print "Usage: cmssh_install.py --help"
sys.exit(0)
check_system(opts.unsupported)
debug = opts.debug
idir = opts.install_dir
if not idir:
msg = "Please specify the install area"
msg += " (it should have enough space to hold CMSSW releases)"
print msg
sys.exit(1)
if idir[0] != '/':
msg = "Please specify absolute path for install area, e.g. /path/%s" % idir
print msg
sys.exit(1)
arch = opts.arch
path = os.path.join(idir, 'soft')
# setup platform and unsupported flag
unsupported_linux = False
if os.uname()[3].find('Ubuntu') != -1 or opts.unsupported:
unsupported_linux = True
# setup system architecture
parch = 'x86'
arch = opts.__dict__.get('arch', None)
if platform == 'Linux':
parch = 'x86_64'
if unsupported_linux:
vdt_ver = 'deb_5.0'
else:
vdt_ver = 'rhap_5'
if not arch:
arch = DEF_SCRAM_ARCH
elif platform == 'Darwin':
vdt_ver = 'macos_10.4'
if not arch:
arch = DEF_SCRAM_ARCH
else:
print 'Unsupported OS "%s"' % platform
sys.exit(1)
if not arch:
print "Unsupported architecture"
sys.exit(1)
print 'Checking CMSSW'
if debug:
print 'Probe architecture', arch
try:
os.makedirs(os.path.join(path, 'logs'))
except:
pass
os.chdir(path)
os.environ['LANG'] = 'C'
sdir = '%s/CMSSW' % path
if opts.cmssw:
# check if default architecture is present
if arch in os.listdir(opts.cmssw):
if not os.path.islink(sdir):
os.symlink(opts.cmssw, sdir)
os.environ['SCRAM_ARCH'] = arch
os.environ['VO_CMS_SW_DIR'] = sdir
if debug:
print 'Will use %s/%s' % (sdir, arch)
else:
print "Please supply via --arch the architecture from %s you wish to use"\
% opts.cmssh
sys.exit(1)
else: # do local CMSSW bootstrap
try:
os.makedirs(sdir)
except:
pass
os.environ['VO_CMS_SW_DIR'] = sdir
os.environ['SCRAM_ARCH'] = arch
url = 'http://cmsrep.cern.ch/cmssw/cms/bootstrap.sh'
os.chdir(path)
if not is_installed(url, path):
os.chdir(sdir)
with open('bootstrap.sh', 'w') as bootstrap:
bootstrap.write(getdata(url, debug))
if os.uname()[0].lower() == 'linux':
os.rename('bootstrap.sh', 'b.sh')
cmd = 'cat b.sh | sed "s,\$seed \$unsupportedSeeds,\$seed \$unsupportedSeeds libreadline5,g" > bootstrap.sh'
subprocess.call(cmd, shell=True)
os.chmod('bootstrap.sh', 0755)
cmd = 'sh -x $VO_CMS_SW_DIR/bootstrap.sh setup -path $VO_CMS_SW_DIR -arch $SCRAM_ARCH'
if unsupported_linux:
cmd += ' -unsupported_distribution_hack'
os.chdir(path)
exe_cmd(sdir, cmd, debug, 'Bootstrap CMSSW', log='bootstrap.log')
apt_init, _root, _ver = find_installed_pkg('external/apt', debug)
cmd = 'source %s' % apt_init
cmd += 'apt-get install external+fakesystem+1.0; '
cmd += 'apt-get update; '
exe_cmd(sdir, cmd, debug, 'Init CMSSW apt repository', log='aptget.log')
# get latest non-patched/non-pre release and find out package versions
latest_release = opts.seed
if not latest_release:
cmd = "source %s; apt-cache search CMSSW_ " % apt_init
cmd += '| egrep -v -i "fwlite|pre|patch|dqm"'
cmd += "| awk '{print $1}'"
cmd += '| grep "^cms[+]cmssw[+]CMSSW_[0-9]_[0-9]_[0-9]$"'
cmd += "| tail -1"
exe_cmd(sdir, cmd, debug, 'Find latest CMSSW release', log='cmssw_rel.log')
with open('cmssw_rel.log', 'r') as stream:
latest_release = stream.read().replace('\n', '').strip()
rel_pkgs = []
if latest_release:
cmd = 'source %s; echo "N" | apt-get install %s' % (apt_init, latest_release)
exe_cmd(sdir, cmd, debug, 'Find %s release deps' % latest_release, log='cmssw_rel_dep.log')
with open('cmssw_rel_dep.log', 'r') as stream:
rel_pkgs = [p for p in stream.read().split() if p.find('+')!=-1]
if debug:
print "Packages:"
for pkg in rel_pkgs:
print pkg
# install useful set of CMS libraries
cms_libs = ['root', 'coral', 'py2-pycurl', 'py2-matplotlib', 'py2-scipy']
if platform == 'Darwin' and osx_ver() == '10.6':
cms_libs += ['freetype']
for cmspkg in cms_libs:
msg = 'Install CMSSW %s' % cmspkg
if cmspkg == 'root':
lookup = 'lcg+root'
elif cmspkg == 'coral':
lookup = 'coral+CORAL'
else:
lookup = ''
name = find_cms_package(apt_init, cmspkg, debug, lookup, rel_pkgs)
cmd = 'source %s; echo "Y" | apt-get install %s' % (apt_init, name)
log = '%s/logs/%s.log' % (path, cmspkg)
exe_cmd(sdir, cmd, debug, msg, log)
# add bootstrap url into soft/.packages
add_url2packages(url, path)
# command to setup CMSSW python
_coral_init, coral_root, coral_ver = find_installed_pkg('cms/coral', debug)
python_init, python_root, python_ver = find_installed_pkg('external/python', debug)
if not python_init.find('init.sh') != -1:
msg = '\nUnable to locate python in:'
msg += '\n%s/%s/external/python' % (os.environ['VO_CMS_SW_DIR'], os.environ['SCRAM_ARCH'])
msg += '\nPlease check CMSSW area and/or choose another architecture\n'
print msg
sys.exit(1)
pver = '.'.join(python_ver.split('.')[0:2])
install_dir = '%s/install/lib/python%s/site-packages' % (path, pver)
os.environ['PYTHONPATH'] = install_dir
try:
os.makedirs(install_dir)
except:
pass
cms_env = 'source %s;' % python_init
if debug:
print "CMSSW python: %s/%s" % (python_root, python_ver)
print "python version", pver
if platform == 'Darwin' and osx_ver() == '10.6':
# CMSSW pcre is too old and srm software uses grep which linked to newer
# pcre library, therefore install pcre 7.9 which is suitable for this case
print "Install pcre"
ver = '7.9'
url = 'http://downloads.sourceforge.net/pcre/%s/pcre-%s.tar.gz' % (ver, ver)
if not is_installed(url, path):
get_file(url, 'expat-%s.tar.gz' % ver, path, debug)
cmd = cms_env + './configure --prefix=%s/install; make; make install' % path
os.chdir(os.path.join(path, 'pcre-%s' % ver))
exe_cmd(os.path.join(path, 'pcre-%s' % ver), cmd, debug, log='pcre.log')
print "Install expat"
ver = '2.0.1'
url = 'http://sourceforge.net/projects/expat/files/expat/%s/expat-%s.tar.gz/download?use_mirror=iweb' % (ver, ver)
if not is_installed(url, path):
get_file(url, 'expat-%s.tar.gz' % ver, path, debug)
if parch == 'x86':
cflags = 'CFLAGS=-m32'
else:
cflags = ''
cmd = cms_env + '%s ./configure --prefix=%s/install; make; make install' % (cflags, path)
os.chdir(os.path.join(path, 'expat-%s' % ver))
exe_cmd(os.path.join(path, 'expat-%s' % ver), cmd, debug, log='expat.log')
# I need to clone whole CMSSW and then copy PythonUtilities into FWCore
print "Download CMSSW"
ver = 'CMSSW_7_0_X'
if not os.path.isfile('%s.zip' % ver):
cmd = 'curl -L -O https://github.com/cms-sw/cmssw/archive/%s.zip' % ver
exe_cmd(path, cmd, debug)
cmssw_gdir = 'cmssw-%s' % ver
if not os.path.isdir(cmssw_gdir):
cmd = 'unzip -qq %s.zip' % ver
exe_cmd(path, cmd, debug)
# install python utilities
print "Install PythonUtilities"
cmd = 'mkdir FWCore; touch FWCore/__init__.py'
exe_cmd(path, cmd, debug)
cmd = 'cp -r %s/FWCore/PythonUtilities/{python,scripts} FWCore' % cmssw_gdir
exe_cmd(path, cmd, debug)
# print "Install CRAB3"
# ver = '3.0.6a'
# url = 'http://cmsrep.cern.ch/cmssw/comp/SOURCES/slc5_amd64_gcc461/cms/crab-client3/%s/crabclient3.tar.gz' % ver
# if not is_installed(url, path):
# get_file(url, 'crabclient3.tar.gz', path, debug)
print "Install CRAB"
os.chdir(path)
crab_ver = 'CRAB_current'
url = 'http://cmsdoc.cern.ch/cms/ccs/wm/www/Crab/Docs/%s.tgz' % crab_ver
if not is_installed(url, path):
try:
get_file(url, 'crab.tar.gz', path, debug)
cmd = 'cd %s; ./configure' % crab_ver
exe_cmd(path, cmd, debug, log='crab.log')
except:
print "Unable to fetch CRAB tar ball, will skip this step"
print "Install WMCore"
ver = '0.8.21'
url = 'http://cmsrep.cern.ch/cmssw/comp/SOURCES/slc5_amd64_gcc461/cms/wmcore/%s/WMCORE.tar.gz' % ver
if not is_installed(url, path):
get_file(url, 'wmcore.tar.gz', path, debug)
print "Install certificates"
url = 'http://vdt.cs.wisc.edu/software/certificates/62/certificates-62-1.tar.gz'
url = 'http://dist.eugridpma.info/distribution/igtf/current/accredited/igtf-preinstalled-bundle-classic.tar.gz'
opath = os.getcwd()
cpath = os.path.join(path, 'certificates')
if not is_installed(url, cpath):
os.makedirs(cpath)
get_file(url, 'certificates.tar.gz', cpath, debug)
os.chdir(opath)
# test local setup of GRID middleware (LCG/OSG)
if platform == 'Linux' and use_lcg:
print "Skip GRID middleware install, use local setup"
else:
print "Install Globus"
os.chdir(path)
url = 'http://vdt.cs.wisc.edu/software/globus/4.0.8_VDT2.0.0gt4nbs/vdt_globus_essentials-VDT2.0.0-3-%s_%s.tar.gz' % (parch, vdt_ver)
if not is_installed(url, path):
get_file(url, 'globus.tar.gz', path, debug)
print "Install Myproxy"
url = 'http://vdt.cs.wisc.edu/software/myproxy/5.3_VDT-2.0.0/myproxy_client-5.3-%s_%s.tar.gz' % (parch, vdt_ver)
if not is_installed(url, path):
get_file(url, 'myproxy_client.tar.gz', path, debug)
url = 'http://vdt.cs.wisc.edu/software/myproxy/5.3_VDT-2.0.0/myproxy_essentials-5.3-%s_%s.tar.gz' % (parch, vdt_ver)
if not is_installed(url, path):
get_file(url, 'myproxy_essentials.tar.gz', path, debug)
print "Install VOMS"
url = 'http://vdt.cs.wisc.edu/software/voms/1.8.8-2p1-1/voms-client-1.8.8-2p1-%s_%s.tar.gz' % (parch, vdt_ver)
if not is_installed(url, path):
get_file(url, 'voms-client.tar.gz', path, debug)
url = 'http://vdt.cs.wisc.edu/software/voms/1.8.8-2p1-1/voms-essentials-1.8.8-2p1-%s_%s.tar.gz' % (parch, vdt_ver)
if not is_installed(url, path):
get_file(url, 'voms-essentials.tar.gz', path, debug)
print "Install LCG info"
url = 'http://vdt.cs.wisc.edu/software/lcg-infosites/2.6-2/lcg-infosites-2.6-2.tar.gz'
if not is_installed(url, path):
get_file(url, 'lcg-infosites.tar.gz', path, debug)
url = 'http://vdt.cs.wisc.edu/software/lcg-info//1.11.4-1/lcg-info-1.11.4-1.tar.gz'
if not is_installed(url, path):
get_file(url, 'lcg-info.tar.gz', path, debug)
print "Install SRM client"
ver = '2.2.1.3.19'
url = 'http://vdt.cs.wisc.edu/software/srm-client-lbnl/%s/srmclient2-%s.tar.gz' \
% (ver, ver)
if not is_installed(url, path):
get_file(url, 'srmclient.tar.gz', path, debug)
cmd = cms_env + './configure --with-java-home=$JAVA_HOME --enable-clientonly'
cmd += ' --with-globus-location=%s/globus' % path
cmd += ' --with-cacert-path=%s/certificates' % path
cmd += ' --with-srm-home=%s/srmclient2' % path
exe_cmd(os.path.join(path, 'srmclient2/setup'), cmd, debug, log='srmclient.log')
# fix Lion, Unable to load native library: libjava.jnilib problem
# http://stackoverflow.com/questions/1482450/broken-java-mac-10-6
if platform == 'Darwin' and osx_ver() == '10.6':
pat = 'export CLASSPATH'
new_pat = pat + '\nunset DYLD_LIBRARY_PATH\n'
for fname in os.listdir(os.path.join(path, 'srmclient2/bin')):
if fname.find('srm-') != -1:
filename = os.path.join(path, 'srmclient2/bin/' + fname)
replace_in_file(filename, pat, new_pat)
os.chmod(filename, 0755)
print "Install zmq"
os.chdir(path)
zmq_ver = '2.2.0'
url = 'http://download.zeromq.org/zeromq-%s.tar.gz' % zmq_ver
if not is_installed(url, path):
get_file(url, 'zmq.tar.gz', path, debug) # it call add_url2packages
cmd = 'cd zeromq-%s; ./configure --prefix=%s/install' % (zmq_ver, path)
cmd += '; make install'
exe_cmd(path, cmd, debug, log='zmq.log')
print "Install setuptools"
os.chdir(path)
s_ver = '0.6c11'
url = 'http://pypi.python.org/packages/source/s/setuptools/setuptools-%s.tar.gz' % s_ver
if not is_installed(url, path):
get_file(url, 'setuptools.tar.gz', path, debug) # it call add_url2packages
cmd = cms_env + 'cd setuptools-%s; python setup.py install --prefix=%s/install' % (s_ver, path)
exe_cmd(path, cmd, debug, log='setuptools.log')
print "Install pip"
os.chdir(path)
ver = '1.10.1'
url = 'https://pypi.python.org/packages/source/v/virtualenv/virtualenv-%s.tar.gz' % ver
if not is_installed(url, path):
get_file(url, 'virtualenv.tar.gz', path, debug) # it call add_url2packages
cmd = cms_env + 'python virtualenv.py %s/install' % path
cmd += '; . %s/install/activate' % path
idir = '%s/virtualenv-%s' % (path, ver)
exe_cmd(idir, cmd, debug, log='pip.log')
add_url2packages(url, path)
# url = 'https://raw.github.com/pypa/virtualenv/master/virtualenv.py'
# if not is_installed(url, path):
# with open('virtualenv.py', 'w') as fname:
# fname.write(getdata(url, debug))
# cmd = cms_env + 'python %s/virtualenv.py %s/install' % (path, path)
# cmd += '; . %s/install/activate' % path
# exe_cmd(path, cmd, debug, log='pip.log')
# add_url2packages(url, path)
# get list of installed packages in pip repository
cmd = cms_env + '%s/install/bin/pip freeze' % path
exe_cmd(path, cmd, debug, log='installed.pkg')
pip_packages = {}
logfile = '%s/installed.pkg' % path
with open(logfile, 'r') as installed_packages:
for line in installed_packages.readlines():
if line.lower().find('warning') != -1 or line.find('#') != -1:
continue
if not line:
continue
try:
pkg, ver = line.replace('\n', '').split('==')
pip_packages[pkg] = ver
except Exception as exp:
print "Fail at line '%s'" % line
print exp
raise
pkg = 'ipython'
install_pip_pkg(pip_packages, cms_env, path, debug, pkg)
# fix pylab message
fname = '%s/install/lib/python%s/site-packages/IPython/core/pylabtools.py' \
% (path, pver)
content = None
with open(fname, 'r') as source:
content = source.read()
content = content.replace('Welcome to pylab, a matplotlib-based', 'cmssh+pylab')
content = content.replace("For more information, type 'help(pylab)'.", '')
if content:
with open(fname, 'w') as output:
output.write(content)
# update local pkgconfig with libpng/freetype
try:
os.makedirs('%s/install/lib/pkgconfig' % path)
except:
pass
with open('%s/install/lib/pkgconfig/libpng.pc' % path, 'w') as stream:
png_init, png_root, png_ver = find_installed_pkg('external/libpng', debug)
prefix = '%s/install' % path
name = 'libpng'
lib = 'png%s' % ''.join(png_ver.split('.')[:2])
ver = png_ver
inc = ''
stream.write(pc_file(prefix, name, ver, lib, inc))
with open('%s/install/lib/pkgconfig/freetype2.pc' % path, 'w') as stream:
ft_init, ft_root, ft_ver = find_installed_pkg('external/freetype', debug)
prefix = '%s/install' % path
name = 'freetype'
lib = 'freetype'
ver = ft_ver
inc = 'freetype2'
stream.write(pc_file(prefix, name, ver, lib, inc))
# install standard libraries
std_pkgs = ['Routes', 'python-dateutil', 'decorator',
'pyOpenSSL', 'paramiko', 'pyzmq', 'tornado', 'pytz', 'pycrypto',
'numpy', 'matplotlib', 'html2text', 'feedparser', 'jinja2',
]
for pkg in std_pkgs:
ver = None
args = None
env_list = []
if pkg.lower() == 'feedparser':
ver = '5.1.2' # tested
if pkg.lower() == 'pyopenssl':
# use 0.12 version of pyOpenSSL due to
# http://stackoverflow.com/questions/7340784/easy-install-pyopenssl-error
ver = '0.12'
if pkg.lower() == 'pyzqm':
# add intstall path option for zmq
args = '--install-option="--zmq=%s/install"' % path
if pkg == 'matplotlib':
try:
if platform == 'Darwin' and \
os.path.isfile('/usr/bin/llvm-gcc') and \
os.path.isfile('/usr/bin/llvm-g++'):
env_list = [('CC', 'llvm-gcc'), ('CXX', 'llvm-g++')]
env_list += [('MACOSX_DEPLOYMENT_TARGET', osx_ver())]
ft_init, ft_root, _ = find_installed_pkg('external/freetype', debug)
png_init, png_root, _ = find_installed_pkg('external/libpng', debug)
cms_env2 = 'source %s; source %s; source %s;' \
% (python_init, ft_init, png_init)
cflags = '-I%s/include -I%s/include/freetype2 -I%s/include' \
% (ft_root, ft_root, png_root)
ldflags = '-L%s/lib -L%s/lib' % (ft_root, png_root)
env_list += [('CFLAGS', cflags), ('LDFLAGS', ldflags)]
pkgconfig = '%s/install/lib/pkgconfig' % path
env_list += [('PKG_CONFIG_PATH', pkgconfig)]
install_pip_pkg(pip_packages, cms_env2, path, debug, pkg, ver, args, env_list)
except:
pass
else:
install_pip_pkg(pip_packages, cms_env, path, debug, pkg, ver, args, env_list)
# install readline after pip, since it requires setuptools
print "Install readline"
# if platform == 'Darwin' and not is_installed(url, path):
# if pver == '2.7':
# url = 'http://pypi.python.org/packages/2.7/r/readline/readline-6.2.2-py2.7-macosx-10.7-intel.egg'
# md5 = '25383d860632d4a1521961ba68a52fe2'
# if pver == '2.6':
# url = 'http://pypi.python.org/packages/2.6/r/readline/readline-6.2.2-py2.6-macosx-10.6-universal.egg'
# md5 = '13d63c76be4ff09c5d55fbbe3b6ab2c7'
# with open('readline.egg', 'w') as readline:
# readline.write(getdata(url, debug))
# cmd = 'cd %s/install/lib/python%s/site-packages; unzip -n %s/readline.egg' % (path, pver, path)
# exe_cmd(path, cmd, debug, log='readline.log')
ver = '6.2.2'
url = 'http://pypi.python.org/packages/source/r/readline/readline-%s.tar.gz' % ver
if platform == 'Darwin' and not is_installed(url, path):
get_file(url, 'readline.tar.gz', path, debug)
cmd = """#!/bin/bash
export CMSSH_ROOT={path}
export VO_CMS_SW_DIR=$CMSSH_ROOT/CMSSW
export SCRAM_ARCH={arch}
export LANG="C"
source {python_init}
idir={path}/install
mkdir -p $idir/lib/python{pver}/site-packages
export PYTHONPATH=$PYTHONPATH:$CMSSH_ROOT/install/lib/python{pver}/site-packages:$idir/lib/python{pver}/site-packages
python setup.py install --prefix=$idir
export CFLAGS='-arch x86_64'
export LDFLAGS='-arch x86_64'
cd readline
./configure CPPFLAGS='-DNEED_EXTERN_PC -fPIC'
make
cd -
python setup.py install --prefix=$idir
""".format(path=path, arch=arch, pver=pver, python_init=python_init)
exe_cmd(os.path.join(path, 'readline-%s' % ver), cmd, debug, log='readline.log')
print "Install LumiDB"
os.chdir(path)
dst = os.path.join(path, 'install/lib/python%s/site-packages/RecoLuminosity' % pver)
if not os.path.isdir(dst):
try:
os.makedirs(dst)
except:
pass
shutil.copytree('%s/RecoLuminosity/LumiDB/python' % cmssw_gdir, os.path.join(dst, 'LumiDB'))
with open(os.path.join(dst, '__init__.py'), 'w') as init_file:
init_file.write("")
shutil.copy(os.path.join(dst, '__init__.py'), os.path.join(dst, 'LumiDB'))
if opts.upgrade:
print "Upgrade cmssh"
else:
print "Install cmssh"
os.chdir(path)
url = 'http://github.com/dmwm/cmssh/tarball/%s/' % opts.version
cmssh_ver = [i for i in url.split('/') if i][-1]
cmssh_ts = time.strftime("%Y-%m-%d %H:%M:%S GMT", time.gmtime())
if opts.upgrade or not is_installed(url, path):
try:
cmd = 'rm -rf dmwm-cmssh*; rm -rf cmssh'
exe_cmd(path, cmd, debug)
except:
pass
try:
cmd = 'rm -rf .ipython'
exe_cmd(path, cmd, debug)
except:
pass
get_file(url, 'cmssh.tar.gz', path, debug)
cmd = 'mv dmwm-cmssh* %s/cmssh' % path
exe_cmd(path, cmd, debug)
print "Create configuration"
os.chdir(path)
with open('setup.sh', 'w') as setup:
msg = '#!/bin/bash\nexport CMSSH_ROOT=%s\n' % path
msg += """
# Clean-up release environment
dir=$CMSSH_ROOT/install/lib/release_lib
if [ -d $dir ] || [ -L $dir ]; then
rm -rf $dir
fi
dir=$CMSSH_ROOT/install/lib/release_root
if [ -d $dir ] || [ -L $dir ]; then
rm -rf $dir
fi
dir=$CMSSH_ROOT/install/lib/release_external
if [ -d $dir ] || [ -L $dir ]; then
rm -rf $dir
fi
"""
msg += 'export CMSSH_INSTALL_DIR=$CMSSH_ROOT/install/lib/python%s/site-packages\n' % pver
msg += 'echo -n "Loading dependencies:"\n'
msg += """cms_init()
{
if [ -f $VO_CMS_SW_DIR/$SCRAM_ARCH/$1/$2/etc/profile.d/init.sh ]; then
echo -n "."
source $VO_CMS_SW_DIR/$SCRAM_ARCH/$1/$2/etc/profile.d/init.sh
fi
}
set_cmd()
{
if [ "$1" == "lcg" ]; then
export LCG_CP=`command -v lcg-cp`
export LCG_LS=`command -v lcg-ls`
export LCG_RM=`command -v lcg-del`
fi
if [ "$1" == "srm" ]; then
if [ -n "`command -v srm-ls`" ]; then
export SRM_CP=`command -v srm-copy`
export SRM_LS=`command -v srm-ls`
export SRM_RM=`command -v srm-rm`
export SRM_MKDIR=`command -v srm-mkdir`
export SRM_RMDIR=`command -v srm-rmdir`
fi
if [ -n "`command -v srmls`" ]; then
export SRM_CP=`command -v srmcp`
export SRM_LS=`command -v srmls`
export SRM_RM=`command -v srmrm`
export SRM_MKDIR=`command -v srmmkdir`
export SRM_RMDIR=`command -v srmrmdir`
fi
fi
}
link_root()
{
dir=$CMSSH_ROOT/install/lib/release_root
if [ -d $dir ] || [ -L $dir ]; then
rm -rf $dir
fi
ln -s $VO_CMS_SW_DIR/$SCRAM_ARCH/$1/$2 $dir
}
coral_init()
{
coral=$CORAL_DIR/$SCRAM_ARCH
coral_external=$CORAL_DIR/external/$SCRAM_ARCH/lib
export PYTHONPATH=$PYTHONPATH:$CMSSH_ROOT:$coral/python:$coral/lib:$coral_external
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$coral/lib:$coral_external
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$coral/lib:$coral_external
if [ -f $CORAL_DIR/$SCRAM_ARCH/lib/liblcg_PyCoral.dylib ]; then
if [ ! -f $CORAL_DIR/$SCRAM_ARCH/lib/liblcg_PyCoral.so ]; then
ln -s $CORAL_DIR/$SCRAM_ARCH/lib/liblcg_PyCoral.dylib $CORAL_DIR/$SCRAM_ARCH/lib/liblcg_PyCoral.so
fi
fi
if [ -f $CORAL_DIR/$SCRAM_ARCH/lib/liblcg_ConnectionService.dylib ]; then
if [ ! -f $CORAL_DIR/$SCRAM_ARCH/lib/liblcg_ConnectionService.so ]; then
ln -s $CORAL_DIR/$SCRAM_ARCH/lib/liblcg_ConnectionService.dylib $CORAL_DIR/$SCRAM_ARCH/lib/liblcg_ConnectionService.so
fi
fi
}
\n
"""
msg += 'export VO_CMS_SW_DIR=$CMSSH_ROOT/CMSSW\n'
msg += 'export SCRAM_ARCH=%s\n' % arch
msg += 'export LANG="C"\n'
if not opts.multi_user:
msg += 'export CMSSW_RELEASES=$CMSSH_ROOT/Releases\n'
msg += 'if [ -f $VO_CMS_SW_DIR/cmsset_default.sh ]; then\n'
msg += ' source $VO_CMS_SW_DIR/cmsset_default.sh\nfi\n'
msg += "network=`hostname -d 2> /dev/null`\n"
msg += 'if [ X$network == X"cern.ch" ]; then\n'
msg += "source /afs/cern.ch/project/eos/installation/pro/etc/setup.sh\n"
msg += "export CMSSH_EOS=1\nfi\n"
msg += 'export CRAB_ROOT=$CMSSH_ROOT/%s\n' % crab_ver
if not opts.multi_user:
msg += 'export OLD_PATH=$PATH\n'
msg += 'export PATH=/usr/bin:/bin:/usr/sbin:/sbin\n'
msg += 'unset PYTHONPATH\n'
if use_lcg:
msg += '# use local LCG installation\n'
msg += '. %s\n\n' % use_lcg
if os.environ.has_key('LD_LIBRARY_PATH'):
msg += 'export LD_LIBRARY_PATH=%s\n' % os.environ['LD_LIBRARY_PATH']
deps = ['external/apt', 'lcg/root', 'external/python',
'external/xz', 'external/pcre',
'external/freetype', 'external/libpng', 'external/lapack',
'external/libjpg', 'external/libtiff', 'external/libungif',
'external/py2-matplotlib', 'external/py2-scipy',
'external/py2-numpy', 'external/curl', 'external/py2-pycurl',
'external/xrootd', 'external/boost', 'cms/coral']
if platform == 'Darwin' and osx_ver() == '10.6':
deps += ['external/xerces-c', 'external/frontier_client']
matplotlib_ver = None
for pkg in deps:
func = 'cms_init'
_init, _root, pkg_ver = find_installed_pkg(pkg, debug)
if pkg == 'external/py2-matplotlib':
matplotlib_ver = pkg_ver
if not pkg_ver:
continue
if pkg == 'lcg/root':
func = 'link_root'
msg += '%s "%s" "%s"\n' % (func, pkg, pkg_ver)
msg += '# Recreate release dirs in order to add them to PATHs\n'
msg += 'mkdir -p $CMSSH_ROOT/install/lib/release_lib\n'
msg += 'mkdir -p $CMSSH_ROOT/install/lib/release_root/lib\n'
msg += 'mkdir -p $CMSSH_ROOT/install/lib/release_external/lib\n'
msg += 'export DYLD_LIBRARY_PATH=$CMSSH_ROOT/globus/lib:$CMSSH_ROOT/glite/lib:$CMSSH_ROOT/install/lib\n'
msg += 'export DYLD_LIBRARY_PATH=$CMSSH_ROOT/install/lib/release_lib:$CMSSH_ROOT/install/lib/release_external:$CMSSH_ROOT/install/lib/release_external/lib:$DYLD_LIBRARY_PATH\n'
msg += 'export LD_LIBRARY_PATH=$CMSSH_ROOT/globus/lib:$CMSSH_ROOT/glite/lib:$CMSSH_ROOT/install/lib:$LD_LIBRARY_PATH\n'
msg += 'export LD_LIBRARY_PATH=$CMSSH_ROOT/install/lib/release_lib:$CMSSH_ROOT/install/lib/release_external/lib:$CMSSH_ROOT/install/lib/release_root/lib:$LD_LIBRARY_PATH\n'
if parch == 'x86_64':
msg += 'export LD_LIBRARY_PATH=$CMSSH_ROOT/globus/lib64:$CMSSH_ROOT/glite/lib64:$CMSSH_ROOT/install/lib64:$LD_LIBRARY_PATH\n'
msg += 'export PATH=$VO_CMS_SW_DIR/bin:$CMSSH_ROOT/install/bin:$PATH\n'
msg += 'export PATH=$PATH:$CMSSH_ROOT/globus/bin\n'
msg += 'export PATH=$PATH:$CMSSH_ROOT/glite/bin\n'
msg += 'export PATH=$PATH:$CMSSH_ROOT/srmclient2/bin\n'
msg += 'export PATH=$PATH:$CMSSH_ROOT/bin\n'
msg += 'export PATH=$PATH:$CMSSH_ROOT/lcg/bin\n'
msg += 'export PATH=$PATH:$CMSSH_ROOT/CRABClient/bin\n'
msg += 'set_cmd "lcg"\n'
msg += 'set_cmd "srm"\n'
msg += 'export PYTHONPATH=$CMSSH_ROOT/cmssh/src:$PYTHONPATH\n'
msg += 'export PYTHONPATH=$CMSSH_ROOT/install/lib/release_root/lib:$PYTHONPATH\n'
msg += 'export PYTHONPATH=$PYTHONPATH:$CMSSH_ROOT\n'
msg += 'export PYTHONPATH=$PYTHONPATH:$CMSSH_ROOT/CRABClient/src/python\n'
msg += 'export PYTHONPATH=$PYTHONPATH:$CMSSH_ROOT/WMCore/src/python\n'
msg += 'export PYTHONPATH=$CMSSH_ROOT/install/lib/python%s/site-packages:$PYTHONPATH\n' % pver
msg += 'export DBS_INSTANCE=cms_dbs_prod_global\n'
msg += 'export LCG_GFAL_INFOSYS=lcg-bdii.cern.ch:2170\n'
msg += 'export VOMS_USERCONF=$CMSSH_ROOT/glite/etc/vomses\n'
msg += 'export VOMS_LOCATION=$CMSSH_ROOT/glite\n'
msg += 'export MYPROXY_SERVER=myproxy.cern.ch\n'
msg += 'export X509_CERT_DIR=$CMSSH_ROOT/certificates\n'
msg += 'export GLOBUS_ERROR_VERBOSE=true\n'
msg += 'export GLOBUS_OPTIONS=-Xmx512M\n'
msg += 'export GLOBUS_TCP_PORT_RANGE=34000,35000\n'
msg += 'export GLOBUS_PATH=$CMSSH_ROOT/globus\n'
msg += 'export GLOBUS_LOCATION=$CMSSH_ROOT/globus\n'
msg += 'export VOMS_PROXY_INFO_DONT_VERIFY_AC=anything_you_want\n'
msg += 'export MATPLOTLIBRC=$CMSSH_ROOT/cmssh/src/config\n'
msg += 'export CORAL_DIR=$CMSSH_ROOT/CMSSW/$SCRAM_ARCH/cms/coral/%s\n' % coral_ver
fname = '/afs/cern.ch/cms/CAF/CMSCOMM/COMM_DQM/certification/Collisions12/8TeV/Prompt/Cert_190456-202305_8TeV_PromptReco_Collisions12_JSON.txt'
if os.path.isfile(fname):
msg += 'export CMS_JSON=%s\n' % fname
else:
msg += 'export CMS_JSON=None\n'
msg += 'coral_init\n'
cmssw = opts.cmssw if opts.cmssw else ''
msg += 'export CMSSH_CMSSW=%s\n' % cmssw
msg += 'echo " DONE"'
if debug:
print "+++ write setup.sh"
setup.write(msg)
os.chmod('setup.sh', 0755)
if not os.path.islink(os.path.join(path, 'CMSSW')):
sconfig_dir = os.path.join(path, 'CMSSW/SITECONF/local/JobConfig')
try:
os.makedirs(sconfig_dir)
except:
pass
with open(os.path.join(sconfig_dir, 'site-local-config.xml'), 'w') as sconfig:
sconfig.write(siteconfig() + '\n')
vomses = os.path.join(path, 'glite')
print "Create vomses area"
vdir = os.path.join(vomses, 'etc')
try:
os.makedirs(vdir)
except:
pass
fname = os.path.join(vdir, 'vomses')
if not os.path.isfile(fname):
with open(fname, 'w') as fds:
msg = '"cms" "voms.fnal.gov" "15015" "/DC=org/DC=doegrids/OU=Services/CN=http/voms.fnal.gov" "cms"'
fds.write(msg + '\n')
msg = '"cms" "voms.cern.ch" "15002" "/DC=ch/DC=cern/OU=computers/CN=voms.cern.ch" "cms"'
fds.write(msg + '\n')
msg = '"cms" "lcg-voms.cern.ch" "15002" "/DC=ch/DC=cern/OU=computers/CN=lcg-voms.cern.ch" "cms"'
fds.write(msg + '\n')
os.chmod(fname, stat.S_IRUSR | stat.S_IROTH | stat.S_IRGRP)
print "Create cmssh"
try:
os.makedirs(os.path.join(path, 'bin'))
except:
pass
with open(os.path.join(path, 'bin/cmssh'), 'w') as cmssh:
msg = '#!/bin/bash\n'
msg += """
if [ $# == 1 ]; then
list="help -help --help -h"
if [[ $list =~ $1 ]]; then
echo "Usage: $0 "
echo " notebook - start cmssh in notebook mode"
echo " (will start cmssh session in a browser)"
exit;
fi
fi\n"""
msg += 'echo "Welcome to cmssh, %s@%s"\n' % (cmssh_ver, cmssh_ts)
msg += 'source %s/setup.sh\n' % path
if opts.multi_user:
msg += 'ipdir="/tmp/$USER/.ipython"\nmkdir -p $ipdir\n'
else:
msg += 'ipdir="%s/.ipython"\nmkdir -p $ipdir\n' % path
msg += """
soft_dir=%(path)s
if [ ! -d $ipdir/extensions ]; then
mkdir -p $ipdir/extensions
fi
if [ ! -d $ipdir/profile_cmssh ]; then
mkdir -p $ipdir/profile_cmssh
fi
if [ -f $ipdir/extensions/cmssh_extension.py ]; then
/bin/rm -f /tmp/$USER/.ipython/extensions/cmssh_extension.py
fi
if [ ! -f $ipdir/extensions/cmssh_extension.py ]; then
cp $soft_dir/cmssh/src/config/cmssh_extension.py $ipdir/extensions/
fi
if [ ! -f $ipdir/profile_cmssh/ipython_config.py ]; then
cp $soft_dir/cmssh/src/config/ipython_config.py $ipdir/profile_cmssh/
fi
if [ ! -f $HOME/.globus/userkey.pem ]; then
echo "You don't have $HOME/.globus/userkey.pem on this system"
echo "Please install it to proceed"
exit -1
fi
if [ ! -f $HOME/.globus/usercert.pem ]; then
echo "You don't have $HOME/.globus/usercert.pem on this system"
echo "Please install it to proceed"
exit -1
fi
export IPYTHONDIR=$ipdir
pylab=" --pylab=auto"
osname=`uname -s`
if [ "$osname" == "Darwin" ]; then
cms_osx_driver=$CMSSH_ROOT/CMSSW/$SCRAM_ARCH/external/py2-matplotlib/%(mver)s/lib/python2.7/site-packages/matplotlib/backends_macosx.so
osx_driver=$CMSSH_ROOT/install/lib/python%(pver)s/site-packages/matplotlib/backends/_macosx.so
if [ -f "$osx_driver" ] || [ -f "$cms_osx_driver" ]; then
pylab=" --pylab=osx"
fi
fi
notebook="--no-banner"
if [ $# == 1 ]; then
if [ $1 == "notebook" ]; then
notebook="notebook"
pylab="--pylab=inline"
export CMSSH_NOTEBOOK=1
fi
fi
# TODO: fix pylab issue on OSX, upon load it claims that python is not installed as framework
#opts="$notebook $pylab"
opts="$notebook"
ipython $opts --ipython-dir=$ipdir --profile=cmssh
""" % {'path':path, 'pver':pver, 'mver': matplotlib_ver}
cmssh.write(msg)
os.chmod('bin/cmssh', 0755)
# remove soflinks in coral, since matplotlib fails to load
if platform == 'Darwin' and osx_ver() == '10.6':
cdir = coral_root + '/external/%s/lib' % get_scram_arch()
for item in os.listdir(cdir):
fname = os.path.join(cdir, item)
if os.path.islink(fname):
os.remove(fname)
print "Make links"
xrdcp = os.path.join(path, 'install/bin/xrdcp')
if not os.path.islink(xrdcp):
_xrootd_init, xrootd_root, _xrootd_ver = find_installed_pkg('external/xrootd', debug)
os.symlink(os.path.join(xrootd_root, 'bin/xrdcp'), xrdcp)
print "Clean-up soft area"
os.chdir(path)
subprocess.call("rm *.tar.gz", shell=True)
if not os.path.isdir('logs'):
os.makedirs('logs')
subprocess.call("mv *.log logs", shell=True)
print "Congratulations, cmssh is available at %s/bin/cmssh" % path
if __name__ == '__main__':
main()