coriolis/unicorn/src/coriolis.py

167 lines
5.3 KiB
Python
Executable File

#!/usr/bin/env python3
#
# This file is part of the Coriolis Software.
# Copyright (c) Sorbonne Université 2015-2022, 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' and os.path.exists('/usr/lib64'): 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 == '/soc/coriolis2/bin':
location = Location.Devtoolset2
coriolisTop = '/soc/coriolis2'
print ' Using RHEL6 installation scheme.'
ldLibraryPath = os.getenv('LD_LIBRARY_PATH')
if not 'devtoolset' in ldLibraryPath:
print '[ERROR] You must enable the devtoolset-2 before running Coriolis:'
print ' > scl enable devtoolset-2 bash'
sys.exit( 1 )
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,'oroshi' ) )
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 )