162 lines
4.9 KiB
Python
162 lines
4.9 KiB
Python
|
#!/usr/bin/env python
|
||
|
#
|
||
|
# This file is part of the Coriolis Software.
|
||
|
# Copyright (c) UPMC/LIP6 2015-2015, All Rights Reserved
|
||
|
#
|
||
|
# +-----------------------------------------------------------------+
|
||
|
# | C O R I O L I S |
|
||
|
# | C o r i o l i s - Generic Program Launcher |
|
||
|
# | |
|
||
|
# | Author : Jean-Paul CHAPUT |
|
||
|
# | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||
|
# | =============================================================== |
|
||
|
# | Python : "./src/coriolis.py" |
|
||
|
# +-----------------------------------------------------------------+
|
||
|
|
||
|
|
||
|
import sys
|
||
|
import os.path
|
||
|
import optparse
|
||
|
import subprocess
|
||
|
import distutils.sysconfig
|
||
|
|
||
|
|
||
|
class Location ( object ):
|
||
|
SetCoriolisTop = 0x0001
|
||
|
SetLdLibraryPath = 0x0002
|
||
|
SetBasePythonPath = 0x0004
|
||
|
BaseSysconfDir = 0x0008
|
||
|
BaseSystem = SetCoriolisTop|BaseSysconfDir
|
||
|
Devtoolset2 = SetCoriolisTop|BaseSysconfDir|SetBasePythonPath
|
||
|
UserDefined = SetCoriolisTop|SetLdLibraryPath|SetBasePythonPath
|
||
|
|
||
|
|
||
|
def truncPath ( path, ifirst, ilast ):
|
||
|
rawDirectories = path.split('/')
|
||
|
directories = []
|
||
|
for directory in rawDirectories:
|
||
|
if len(directory): directories.append( directory )
|
||
|
truncated = os.path.join( *directories[ifirst:ilast] )
|
||
|
if ifirst == 0 and rawDirectories[0] == '':
|
||
|
truncated = '/'+truncated
|
||
|
return truncated
|
||
|
|
||
|
|
||
|
def uname ( arguments ):
|
||
|
return subprocess.Popen( ["uname"] + arguments
|
||
|
, stdout=subprocess.PIPE ).stdout.readlines()[0][:-1]
|
||
|
|
||
|
|
||
|
class Pathes ( object ):
|
||
|
|
||
|
def __init__ ( self, name ):
|
||
|
self.name = name
|
||
|
self.components = []
|
||
|
if os.environ.has_key(name):
|
||
|
self.components = os.environ[name].split(':')
|
||
|
return
|
||
|
|
||
|
def asString ( self ):
|
||
|
s = ''
|
||
|
for i in range(len(self.components)):
|
||
|
if s: s += ':'
|
||
|
s += self.components[i]
|
||
|
return s
|
||
|
|
||
|
def export ( self ):
|
||
|
os.environ[self.name] = self.asString()
|
||
|
return
|
||
|
|
||
|
def insert ( self, index, path ):
|
||
|
self.components.insert( index, path )
|
||
|
return
|
||
|
|
||
|
def show ( self ):
|
||
|
print ' %s:' % self.name
|
||
|
for component in self.components:
|
||
|
print ' %s' % component
|
||
|
return
|
||
|
|
||
|
|
||
|
osType = uname( ['-s'] )
|
||
|
arch = uname( ['-m'] )
|
||
|
|
||
|
libDir = '/lib'
|
||
|
if arch == 'x86_64': libDir = '/lib64'
|
||
|
|
||
|
pythonSitePackages = os.path.join( *(distutils.sysconfig.get_python_lib(1).split('/')[-3:]) )
|
||
|
|
||
|
print ' ========================================'
|
||
|
print ' OS:\n %s' % osType
|
||
|
|
||
|
scriptBinPath = os.path.abspath(os.path.dirname(sys.argv[0]))
|
||
|
print ' Script location:\n %s' % scriptBinPath
|
||
|
if scriptBinPath == '/usr/bin':
|
||
|
location = Location.BaseSystem
|
||
|
coriolisTop = '/usr'
|
||
|
print ' Using standard system installation scheme.'
|
||
|
elif scriptBinPath == '/opt/rh/devtoolset-2/root/usr/bin':
|
||
|
location = Location.Devtoolset2
|
||
|
coriolisTop = '/opt/rh/devtoolset-2/root/usr'
|
||
|
print ' Using RHEL6 installation scheme.'
|
||
|
else:
|
||
|
location = Location.UserDefined
|
||
|
coriolisTop = truncPath( scriptBinPath, 0, -1 )
|
||
|
print ' Using User installation scheme.'
|
||
|
|
||
|
if location & Location.SetCoriolisTop:
|
||
|
os.environ['CORIOLIS_TOP'] = coriolisTop
|
||
|
print ' CORIOLIS_TOP:\n %s' % coriolisTop
|
||
|
|
||
|
if location & Location.BaseSysconfDir:
|
||
|
sysConfDir = truncPath( coriolisTop, 0, -1 ) + '/etc/coriolis2'
|
||
|
else:
|
||
|
sysConfDir = coriolisTop + '/etc/coriolis2'
|
||
|
print ' Configuration directory:\n %s' % sysConfDir
|
||
|
|
||
|
os.environ['STRATUS_MAPPING_NAME'] = sysConfDir+'/stratus2sxlib.xml'
|
||
|
|
||
|
binPath = Pathes( 'PATH' )
|
||
|
binPath.insert( 0, scriptBinPath )
|
||
|
binPath.export()
|
||
|
binPath.show()
|
||
|
|
||
|
ldLibraryPathName = 'LD_LIBRARY_PATH'
|
||
|
if osType == 'Darwin':
|
||
|
ldLibraryPathName = 'DYLD_LIBRARY_PATH'
|
||
|
|
||
|
if location & Location.SetLdLibraryPath:
|
||
|
ldLibraryPath = Pathes( ldLibraryPathName )
|
||
|
ldLibraryPath.insert( 0, coriolisTop+libDir )
|
||
|
ldLibraryPath.export()
|
||
|
ldLibraryPath.show()
|
||
|
|
||
|
pythonPath = Pathes( 'PYTHONPATH' )
|
||
|
if location & Location.SetBasePythonPath:
|
||
|
pythonPath.insert( 0, os.path.join(coriolisTop,pythonSitePackages) )
|
||
|
pythonPath.insert( 0, os.path.join(coriolisTop,pythonSitePackages,'crlcore') )
|
||
|
pythonPath.insert( 0, os.path.join(coriolisTop,pythonSitePackages,'stratus') )
|
||
|
pythonPath.insert( 0, os.path.join(coriolisTop,pythonSitePackages,'cumulus') )
|
||
|
pythonPath.insert( 0, os.path.join(coriolisTop,pythonSitePackages,'pharos' ) )
|
||
|
pythonPath.export()
|
||
|
pythonPath.show()
|
||
|
|
||
|
|
||
|
argvStart = 0
|
||
|
slaveScript = 'cgt'
|
||
|
if len(sys.argv) > 1 and sys.argv[1].startswith('--run='):
|
||
|
argvStart = 1
|
||
|
slaveScript = sys.argv[1][6:]
|
||
|
|
||
|
print ' Script:\n %s' % slaveScript
|
||
|
print ' ========================================'
|
||
|
|
||
|
try:
|
||
|
os.execvp( slaveScript, sys.argv[argvStart:] )
|
||
|
except Exception, e:
|
||
|
print '[ERROR] An exception occured while lauching <%s>\n' % slaveScript
|
||
|
print e
|
||
|
sys.exit( 3 )
|
||
|
|
||
|
sys.exit( 0 )
|