X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=bin%2FrunSalome.py;h=ce89f82697bdc37771fd5109f20e25185e725fd9;hb=03b27bb3323e9cfeb8761be2306a2a57d945a7f5;hp=9d0a669711ce120fc1f792b9b2672313730f2ede;hpb=36b4d0d5e82155abafd70bd5e61660744da41a4d;p=modules%2Fkernel.git diff --git a/bin/runSalome.py b/bin/runSalome.py index 9d0a66971..ce89f8269 100755 --- a/bin/runSalome.py +++ b/bin/runSalome.py @@ -1,208 +1,36 @@ #!/usr/bin/env python +# Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +# +# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +## @package runSalome +# \brief Module that provides services to launch SALOME +# +# -import sys, os, string, glob, time, pickle +import sys, os, string, glob, time, pickle, re import orbmodule - -process_id = {} - -# salome_subdir variable is used for composing paths like $KERNEL_ROOT_DIR/share/salome/resources, etc. -# before moving to SUIT-based gui, instead of salome_subdir there was args['appname'] used. -# but after - 'appname' = "SalomeApp", so using it in making the subdirectory is an error. -salome_subdir = "salome" - -# ----------------------------------------------------------------------------- - -def add_path(directory, variable_name): - """Function helper to add environment variables""" - if not os.environ.has_key(variable_name): - os.environ[variable_name] = "" - pass - if os.path.exists(directory): - newpath=[] - for _dir in os.environ[variable_name].split(":"): - if os.path.exists(_dir): - if not os.path.samefile(_dir, directory): - newpath.append(_dir) - else: - if os.path.abspath(_dir) != os.path.abspath(directory): - newpath.append(_dir) - pass - import string - newpath[:0] = [ directory ] - newpath = string.join(newpath,":") - os.environ[variable_name] = newpath - if variable_name == "PYTHONPATH": - sys.path[:0] = [directory] - -# ----------------------------------------------------------------------------- - -def get_config(): - """ - Get list of modules, paths. - - Read args from launch configure xml file and command line options. - Check variables _ROOT_DIR and set list of used modules. - Return args, modules_list, modules_root_dir - """ - - # read args from launch configure xml file and command line options - - import launchConfigureParser - args = launchConfigureParser.args - - # Check variables _ROOT_DIR - # and set list of used modules (without KERNEL) - - modules_list = [] - if args.has_key("modules"): - modules_list += args["modules"] - # KERNEL must be last in the list to locate it at the first place in PATH - modules_list[:0] = ["GUI"] - modules_list[:0] = ["KERNEL"] - modules_list.reverse() - - modules_root_dir = {} - - to_remove_list=[] - for module in modules_list : - module_variable=module.upper()+"_ROOT_DIR" - if not os.environ.has_key(module_variable): - print "*******************************************************" - print "*" - print "* Environment variable",module_variable,"must be set" - print "* Module", module, "will be not available" - print "*" - print "********************************************************" - to_remove_list.append(module) - continue - pass - module_root_dir = os.environ[module_variable] - modules_root_dir[module]=module_root_dir - - for to_remove in to_remove_list: - modules_list.remove(to_remove) - - while "KERNEL" in modules_list: - modules_list.remove("KERNEL") - pass - - while "GUI" in modules_list: - modules_list.remove("GUI") - pass - - if "SUPERV" in modules_list and not 'superv' in args['standalone']: - args['standalone'].append("superv") - pass - - return args, modules_list, modules_root_dir - -# ----------------------------------------------------------------------------- - -def set_env(args, modules_list, modules_root_dir): - """Add to the PATH-variables modules specific paths""" - - python_version="python%d.%d" % sys.version_info[0:2] - modules_root_dir_list = [] - modules_list = modules_list[:] + ["GUI"] - modules_list = modules_list[:] + ["KERNEL"] - for module in modules_list : - if modules_root_dir.has_key(module): - module_root_dir = modules_root_dir[module] - modules_root_dir_list[:0] = [module_root_dir] - add_path(os.path.join(module_root_dir,"lib",salome_subdir), - "LD_LIBRARY_PATH") - add_path(os.path.join(module_root_dir,"bin",salome_subdir), - "PATH") - if os.path.exists(module_root_dir + "/examples") : - add_path(os.path.join(module_root_dir,"examples"), - "PYTHONPATH") - pass - add_path(os.path.join(module_root_dir,"bin",salome_subdir), - "PYTHONPATH") - add_path(os.path.join(module_root_dir,"lib", - python_version,"site-packages", - salome_subdir), - "PYTHONPATH") - add_path(os.path.join(module_root_dir,"lib",salome_subdir), - "PYTHONPATH") - add_path(os.path.join(module_root_dir,"lib", - python_version,"site-packages", - salome_subdir, - "shared_modules"), - "PYTHONPATH") - pass - pass - - - os.environ["SALOMEPATH"]=":".join(modules_root_dir_list) - - # set trace environment variable - - if not os.environ.has_key("SALOME_trace"): - os.environ["SALOME_trace"]="local" - if args['file']: - os.environ["SALOME_trace"]="file:"+args['file'][0] - if args['logger']: - os.environ["SALOME_trace"]="with_logger" - - # set environment for SMESH plugins - - if "SMESH" in modules_list: - os.environ["SMESH_MeshersList"]="StdMeshers" - if not os.environ.has_key("SALOME_StdMeshersResources"): - os.environ["SALOME_StdMeshersResources"] \ - = modules_root_dir["SMESH"]+"/share/"+args["appname"]+"/resources" - pass - if args.has_key("SMESH_plugins"): - for plugin in args["SMESH_plugins"]: - if os.environ.has_key(plugin.upper()+"_ROOT_DIR"): - os.environ["SMESH_MeshersList"] \ - = os.environ["SMESH_MeshersList"]+":"+plugin - plugin_root = os.environ[plugin.upper()+"_ROOT_DIR"] - if not os.environ.has_key("SALOME_"+plugin+"Resources"): - os.environ["SALOME_"+plugin+"Resources"] \ - = plugin_root+"/share/"+args["appname"]+"/resources" - add_path(os.path.join(plugin_root,"lib",python_version, - "site-packages",salome_subdir), - "PYTHONPATH") - add_path(os.path.join(plugin_root,"lib",salome_subdir), - "PYTHONPATH") - add_path(os.path.join(plugin_root,"lib",salome_subdir), - "LD_LIBRARY_PATH") - add_path(os.path.join(plugin_root,"bin",salome_subdir), - "PYTHONPATH") - add_path(os.path.join(plugin_root,"bin",salome_subdir), - "PATH") - pass - pass - - # set environment for SUPERV module - os.environ["ENABLE_MACRO_NODE"]="1" - # set resources variables if not yet set - if os.getenv("GUI_ROOT_DIR"): - if not os.getenv("SUITRoot"): os.environ["SUITRoot"] = os.getenv("GUI_ROOT_DIR") + "/share/salome" - if not os.getenv("SalomeAppConfig"): os.environ["SalomeAppConfig"] = os.getenv("GUI_ROOT_DIR") + "/share/salome/resources" - pass - - # set CSF_PluginDefaults variable only if it is not customized - # by the user - if not os.getenv("CSF_PluginDefaults"): - os.environ["CSF_PluginDefaults"] \ - = os.path.join(modules_root_dir["KERNEL"],"share", - salome_subdir,"resources") - os.environ["CSF_SALOMEDS_ResourcesDefaults"] \ - = os.path.join(modules_root_dir["KERNEL"],"share", - salome_subdir,"resources") - - if "GEOM" in modules_list: - print "GEOM OCAF Resources" - os.environ["CSF_GEOMDS_ResourcesDefaults"] \ - = os.path.join(modules_root_dir["GEOM"],"share", - salome_subdir,"resources") - print "GEOM Shape Healing Resources" - os.environ["CSF_ShHealingDefaults"] \ - = os.path.join(modules_root_dir["GEOM"],"share", - salome_subdir,"resources") +import setenv +from server import * +from launchConfigureParser import verbose +from server import process_id # ----------------------------------------------------------------------------- @@ -249,54 +77,27 @@ def kill_salome(args): killAllPorts() elif args['portkill']: givenPortKill(str(args['port'])) - + # ----------------------------------------------------------------------------- # -# Definition des classes d'objets pour le lancement des Server CORBA +# Class definitions to launch CORBA Servers # -class Server: - """Generic class for CORBA server launch""" - - def initArgs(self): - self.PID=None - self.CMD=[] - self.ARGS=[] - if self.args['xterm']: - self.ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-hold'] - - def __init__(self,args): - self.args=args - self.initArgs() - - - def run(self): - global process_id - myargs=self.ARGS - if self.args['xterm']: - # (Debian) send LD_LIBRARY_PATH to children shells (xterm) - env_ld_library_path=['env', 'LD_LIBRARY_PATH=' - + os.getenv("LD_LIBRARY_PATH")] - myargs = myargs +['-T']+self.CMD[:1]+['-e'] + env_ld_library_path - command = myargs + self.CMD - print "command = ", command - pid = os.spawnvp(os.P_NOWAIT, command[0], command) - process_id[pid]=self.CMD - self.PID = pid - - class InterpServer(Server): def __init__(self,args): self.args=args env_ld_library_path=['env', 'LD_LIBRARY_PATH=' + os.getenv("LD_LIBRARY_PATH")] self.CMD=['xterm', '-e']+ env_ld_library_path + ['python'] - #self.CMD=['xterm', '-e', 'python'] def run(self): global process_id command = self.CMD - #print "command = ", command - pid = os.spawnvp(os.P_NOWAIT, command[0], command) + print "INTERPSERVER::command = ", command + if sys.platform == "win32": + import win32pm + pid = win32pm.spawnpid( string.join(command, " "),'-nc' ) + else: + pid = os.spawnvp(os.P_NOWAIT, command[0], command) process_id[pid]=self.CMD self.PID = pid @@ -306,6 +107,9 @@ class CatalogServer(Server): def __init__(self,args): self.args=args self.initArgs() + #if sys.platform == "win32": + # self.SCMD1=[os.environ["KERNEL_ROOT_DIR"] + "/win32/" + os.environ["BIN_ENV"] + "/" + 'SALOME_ModuleCatalog_Server' + ".exe",'-common'] + #else: self.SCMD1=['SALOME_ModuleCatalog_Server','-common'] self.SCMD2=[] home_dir=os.getenv('HOME') @@ -316,18 +120,34 @@ class CatalogServer(Server): cata_path=[] list_modules = modules_list[:] list_modules.reverse() - for module in ["KERNEL", "GUI"] + list_modules: + if self.args["gui"] : + list_modules = ["KERNEL", "GUI"] + list_modules + else : + list_modules = ["KERNEL"] + list_modules + for module in list_modules: if modules_root_dir.has_key(module): module_root_dir=modules_root_dir[module] module_cata=module+"Catalog.xml" #print " ", module_cata - cata_path.extend( - glob.glob(os.path.join(module_root_dir, - "share",salome_subdir, - "resources",module_cata))) + if os.path.exists(os.path.join(module_root_dir, + "share",setenv.salome_subdir, + "resources",module.lower(), + module_cata)): + cata_path.extend( + glob.glob(os.path.join(module_root_dir, + "share",setenv.salome_subdir, + "resources",module.lower(), + module_cata))) + else: + cata_path.extend( + glob.glob(os.path.join(module_root_dir, + "share",setenv.salome_subdir, + "resources", + module_cata))) pass pass - self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2 + #self.CMD=self.SCMD1 + ['\"']+[string.join(cata_path,'\"::\"')] + ['\"'] + self.SCMD2 + self.CMD=self.SCMD1 + ['\"' + string.join(cata_path,'\"::\"') + '\"'] + self.SCMD2 # --- @@ -339,35 +159,38 @@ class SalomeDSServer(Server): # --- -class RegistryServer(Server): +class ConnectionManagerServer(Server): def __init__(self,args): self.args=args self.initArgs() - self.CMD=['SALOME_Registry_Server', '--salome_session','theSession'] + self.CMD=['SALOME_ConnectionManagerServer'] # --- -class ContainerCPPServer(Server): +class RegistryServer(Server): def __init__(self,args): self.args=args self.initArgs() - self.CMD=['SALOME_Container','FactoryServer'] + self.CMD=['SALOME_Registry_Server', '--salome_session','theSession'] # --- -class ContainerPYServer(Server): +class ContainerCPPServer(Server): def __init__(self,args): self.args=args self.initArgs() - self.CMD=['SALOME_ContainerPy.py','FactoryServerPy'] + self.CMD=['SALOME_Container','FactoryServer'] # --- -class ContainerSUPERVServer(Server): +class ContainerPYServer(Server): def __init__(self,args): self.args=args self.initArgs() - self.CMD=['SALOME_Container','SuperVisionContainer'] + if sys.platform == "win32": + self.CMD=[os.environ["PYTHONBIN"], '\"'+os.environ["KERNEL_ROOT_DIR"] + '/bin/salome/SALOME_ContainerPy.py'+'\"','FactoryServerPy'] + else: + self.CMD=['SALOME_ContainerPy.py','FactoryServerPy'] # --- @@ -375,13 +198,31 @@ class LoggerServer(Server): def __init__(self,args): self.args=args self.initArgs() - self.CMD=['SALOME_Logger_Server', 'logger.log'] + from salome_utils import generateFileName + if sys.platform == "win32": dirpath = os.environ["HOME"] + else: dirpath = "/tmp" + logfile = generateFileName( dirpath, + prefix="logger", + extension="log", + with_username=True, + with_hostname=True, + with_port=True) + print "===========================================================" + print "Logger server: put log to the file:" + print logfile + print "===========================================================" + self.CMD=['SALOME_Logger_Server', logfile] + pass + pass # end of LoggerServer class # --- class SessionServer(Server): def __init__(self,args): - self.args=args + self.args = args.copy() + # Bug 11512 (Problems with runSalome --xterm on Mandrake and Debian Sarge) + #self.args['xterm']=0 + # self.initArgs() self.SCMD1=['SALOME_Session_Server'] self.SCMD2=[] @@ -405,73 +246,130 @@ class SessionServer(Server): self.SCMD2+=['CPP'] if 'pyContainer' in self.args['standalone'] or 'pyContainer' in self.args['embedded']: self.SCMD2+=['PY'] - if 'supervContainer' in self.args['containers'] or 'supervContainer' in self.args['standalone']: - self.SCMD2+=['SUPERV'] if self.args['gui']: - self.SCMD2+=['GUI'] - if self.args['splash']: - self.SCMD2+=['SPLASH'] + session_gui = True + if self.args.has_key('session_gui'): + session_gui = self.args['session_gui'] + if session_gui: + self.SCMD2+=['GUI'] + if self.args['splash']: + self.SCMD2+=['SPLASH'] + pass + if self.args['study_hdf'] is not None: + self.SCMD2+=['--study-hdf=%s'%self.args['study_hdf']] + pass + pass + pass if self.args['noexcepthandler']: self.SCMD2+=['noexcepthandler'] + if self.args.has_key('user_config'): + self.SCMD2+=['--resources=%s'%self.args['user_config']] if self.args.has_key('modules'): - self.SCMD2+=['--modules ('] - for mod in self.args['modules']: - self.SCMD2+=[mod + ':'] - self.SCMD2+=[')'] + self.SCMD2+=['--modules (%s)'%":".join(self.args['modules'])] + if self.args.has_key('pyscript') and len(self.args['pyscript']) > 0: + self.SCMD2+=['--pyscript=%s'%(",".join(self.args['pyscript']))] def setpath(self,modules_list,modules_root_dir): cata_path=[] list_modules = modules_list[:] list_modules.reverse() - for module in ["KERNEL", "GUI"] + list_modules: + if self.args["gui"] : + list_modules = ["KERNEL", "GUI"] + list_modules + else : + list_modules = ["KERNEL"] + list_modules + for module in list_modules: module_root_dir=modules_root_dir[module] module_cata=module+"Catalog.xml" #print " ", module_cata - cata_path.extend( - glob.glob(os.path.join(module_root_dir,"share", - salome_subdir,"resources", - module_cata))) - if 'moduleCatalog' in self.args['embedded']: - self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2 + if os.path.exists(os.path.join(module_root_dir, + "share",setenv.salome_subdir, + "resources",module.lower(), + module_cata)): + cata_path.extend( + glob.glob(os.path.join(module_root_dir,"share", + setenv.salome_subdir,"resources", + module.lower(),module_cata))) + else: + cata_path.extend( + glob.glob(os.path.join(module_root_dir,"share", + setenv.salome_subdir,"resources", + module_cata))) + pass + if (self.args["gui"]) & ('moduleCatalog' in self.args['embedded']): + #Use '::' instead ":" because drive path with "D:\" is invalid on windows platform + #self.CMD=self.SCMD1 + ['\"']+[string.join(cata_path,'\"::\"')] + ['\"'] + self.SCMD2 + self.CMD=self.SCMD1 + ['\"' + string.join(cata_path,'\"::\"') + '\"'] + self.SCMD2 else: self.CMD=self.SCMD1 + self.SCMD2 - + if self.args.has_key('test'): + self.CMD+=['-test'] + self.args['test'] + elif self.args.has_key('play'): + self.CMD+=['-play'] + self.args['play'] + + if self.args["gdb_session"] or self.args["ddd_session"]: + f = open(".gdbinit4salome", "w") + f.write("set args ") + args = " ".join(self.CMD[1:]) + args = args.replace("(", "\(") + args = args.replace(")", "\)") + f.write(args) + f.write("\n") + f.close() + if self.args["ddd_session"]: + self.CMD = ["ddd", "--command=.gdbinit4salome", self.CMD[0]] + elif self.args["gdb_session"]: + self.CMD = ["xterm", "-e", "gdb", "--command=.gdbinit4salome", self.CMD[0]] + pass + pass + # --- -class ContainerManagerServer(Server): +class LauncherServer(Server): def __init__(self,args): self.args=args self.initArgs() - self.SCMD1=['SALOME_ContainerManagerServer'] + self.SCMD1=['SALOME_LauncherServer'] self.SCMD2=[] - if 'registry' in self.args['embedded']: - self.SCMD1+=['--with','Registry', - '(','--salome_session','theSession',')'] - if 'moduleCatalog' in self.args['embedded']: - self.SCMD1+=['--with','ModuleCatalog','(','-common'] - self.SCMD2+=['-personal', - '${HOME}/Salome/resources/CatalogModulePersonnel.xml',')'] - if 'study' in self.args['embedded']: - self.SCMD2+=['--with','SALOMEDS','(',')'] - if 'cppContainer' in self.args['embedded']: - self.SCMD2+=['--with','Container','(','FactoryServer',')'] + if args["gui"] : + if 'registry' in self.args['embedded']: + self.SCMD1+=['--with','Registry', + '(','--salome_session','theSession',')'] + if 'moduleCatalog' in self.args['embedded']: + self.SCMD1+=['--with','ModuleCatalog','(','-common'] + self.SCMD2+=['-personal', + '${HOME}/Salome/resources/CatalogModulePersonnel.xml',')'] + if 'study' in self.args['embedded']: + self.SCMD2+=['--with','SALOMEDS','(',')'] + if 'cppContainer' in self.args['embedded']: + self.SCMD2+=['--with','Container','(','FactoryServer',')'] def setpath(self,modules_list,modules_root_dir): cata_path=[] list_modules = modules_list[:] list_modules.reverse() - for module in ["KERNEL", "GUI"] + list_modules: + if self.args["gui"] : + list_modules = ["GUI"] + list_modules + for module in ["KERNEL"] + list_modules: if modules_root_dir.has_key(module): module_root_dir=modules_root_dir[module] module_cata=module+"Catalog.xml" #print " ", module_cata - cata_path.extend( - glob.glob(os.path.join(module_root_dir,"share", - self.args['appname'],"resources", - module_cata))) + if os.path.exists(os.path.join(module_root_dir, + "share",setenv.salome_subdir, + "resources",module.lower(), + module_cata)): + cata_path.extend( + glob.glob(os.path.join(module_root_dir,"share", + setenv.salome_subdir,"resources", + module.lower(),module_cata))) + else: + cata_path.extend( + glob.glob(os.path.join(module_root_dir,"share", + setenv.salome_subdir,"resources", + module_cata))) pass pass - if 'moduleCatalog' in self.args['embedded']: + if (self.args["gui"]) & ('moduleCatalog' in self.args['embedded']): self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2 else: self.CMD=self.SCMD1 + self.SCMD2 @@ -483,7 +381,7 @@ class NotifyServer(Server): self.modules_root_dir=modules_root_dir myLogName = os.environ["LOGNAME"] self.CMD=['notifd','-c', - self.modules_root_dir["KERNEL"] +'/share/salome/resources/channel.cfg', + self.modules_root_dir["KERNEL"] +'/share/salome/resources/kernel/channel.cfg', '-DFactoryIORFileName=/tmp/'+myLogName+'_rdifact.ior', '-DChannelIORFileName=/tmp/'+myLogName+'_rdichan.ior', '-DReportLogFile=/tmp/'+myLogName+'_notifd.report', @@ -495,7 +393,10 @@ class NotifyServer(Server): def startGUI(): """Salome Session Graphic User Interface activation""" + import Engines import SALOME + import SALOMEDS + import SALOME_ModuleCatalog import SALOME_Session_idl session=clt.waitNS("/Kernel/Session",SALOME.Session) session.GetInterface() @@ -506,16 +407,28 @@ def startSalome(args, modules_list, modules_root_dir): """Launch all SALOME servers requested by args""" init_time = os.times() - print "startSalome ", args + if verbose(): print "startSalome ", args # - # Initialisation ORB et Naming Service + # Initialisation ORB and Naming Service # - clt=orbmodule.client() + clt=orbmodule.client(args) + # Save Naming service port name into + # the file args["ns_port_log_file"] + if args.has_key('ns_port_log_file'): + home = os.environ['HOME'] + appli= os.environ.get("APPLI") + if appli is not None: + home='%s/%s'%(home,appli) + pass + file_name= '%s/%s'%(home, args["ns_port_log_file"]) + f = open(file_name, "w") + f.write(os.environ['NSPORT']) + f.close() - # (non obligatoire) Lancement Logger Server - # et attente de sa disponibilite dans le naming service + # Launch Logger Server (optional) + # and wait until it is registered in naming service # if args['logger']: @@ -526,54 +439,78 @@ def startSalome(args, modules_list, modules_root_dir): # Notify Server launch # - print "Notify Server to launch" + if sys.platform != "win32": + if verbose(): print "Notify Server to launch" + + myServer=NotifyServer(args,modules_root_dir) + myServer.run() + + # Launch Session Server (to show splash ASAP) + # - myServer=NotifyServer(args,modules_root_dir) - myServer.run() + if args["gui"]: + mySessionServ = SessionServer(args) + mySessionServ.setpath(modules_list,modules_root_dir) + mySessionServ.run() # - # Lancement Registry Server, - # attente de la disponibilite du Registry dans le Naming Service + # Launch Registry Server, + # and wait until it is registered in naming service # - if 'registry' not in args['embedded']: + if ('registry' not in args['embedded']) | (args["gui"] == 0) : myServer=RegistryServer(args) myServer.run() - clt.waitNSPID("/Registry",myServer.PID) + if sys.platform == "win32": + clt.waitNS("/Registry") + else: + clt.waitNSPID("/Registry",myServer.PID) # - # Lancement Catalog Server, - # attente de la disponibilite du Catalog Server dans le Naming Service + # Launch Catalog Server, + # and wait until it is registered in naming service # - - if 'moduleCatalog' not in args['embedded']: + if ('moduleCatalog' not in args['embedded']) | (args["gui"] == 0): cataServer=CatalogServer(args) cataServer.setpath(modules_list,modules_root_dir) cataServer.run() import SALOME_ModuleCatalog - clt.waitNSPID("/Kernel/ModulCatalog",cataServer.PID,SALOME_ModuleCatalog.ModuleCatalog) + if sys.platform == "win32": + clt.waitNS("/Kernel/ModulCatalog",SALOME_ModuleCatalog.ModuleCatalog) + else: + clt.waitNSPID("/Kernel/ModulCatalog",cataServer.PID,SALOME_ModuleCatalog.ModuleCatalog) # - # Lancement SalomeDS Server, - # attente de la disponibilite du SalomeDS dans le Naming Service + # Launch SalomeDS Server, + # and wait until it is registered in naming service # #print "ARGS = ",args - if 'study' not in args['embedded']: + if ('study' not in args['embedded']) | (args["gui"] == 0): print "RunStudy" myServer=SalomeDSServer(args) myServer.run() - clt.waitNSPID("/myStudyManager",myServer.PID) + if sys.platform == "win32": + clt.waitNS("/myStudyManager") + else: + clt.waitNSPID("/myStudyManager",myServer.PID) # - # Lancement ContainerManagerServer + # Launch LauncherServer # - myCmServer = ContainerManagerServer(args) + myCmServer = LauncherServer(args) myCmServer.setpath(modules_list,modules_root_dir) myCmServer.run() + # + # Launch ConnectionManagerServer + # + + myConnectionServer = ConnectionManagerServer(args) + myConnectionServer.run() + from Utils_Identity import getShortHostName @@ -586,55 +523,48 @@ def startSalome(args, modules_list, modules_root_dir): theComputer = getShortHostName() # - # Lancement Container C++ local, - # attente de la disponibilite du Container C++ local dans le Naming Service + # Launch local C++ Container (FactoryServer), + # and wait until it is registered in naming service # - if 'cppContainer' in args['standalone']: + if ('cppContainer' in args['standalone']) | (args["gui"] == 0) : myServer=ContainerCPPServer(args) myServer.run() - clt.waitNSPID("/Containers/" + theComputer + "/FactoryServer",myServer.PID) + if sys.platform == "win32": + clt.waitNS("/Containers/" + theComputer + "/FactoryServer") + else: + clt.waitNSPID("/Containers/" + theComputer + "/FactoryServer",myServer.PID) # - # Lancement Container Python local, - # attente de la disponibilite du Container Python local - # dans le Naming Service + # Launch local Python Container (FactoryServerPy), + # and wait until it is registered in naming service # if 'pyContainer' in args['standalone']: myServer=ContainerPYServer(args) myServer.run() - clt.waitNSPID("/Containers/" + theComputer + "/FactoryServerPy",myServer.PID) - - # - # Lancement Container Supervision local, - # attente de la disponibilite du Container Supervision local - # dans le Naming Service - # - - if 'supervContainer' in args['standalone']: - myServer=ContainerSUPERVServer(args) - myServer.run() - clt.waitNSPID("/Containers/" + theComputer + "/SuperVisionContainer",myServer.PID) + if sys.platform == "win32": + clt.waitNS("/Containers/" + theComputer + "/FactoryServerPy") + else: + clt.waitNSPID("/Containers/" + theComputer + "/FactoryServerPy",myServer.PID) # - # Lancement Session Server + # Wait until Session Server is registered in naming service # - - mySessionServ = SessionServer(args) - mySessionServ.setpath(modules_list,modules_root_dir) - mySessionServ.run() + + if args["gui"]: ##---------------- - - # Attente de la disponibilite du Session Server dans le Naming Service - # - - import SALOME - import SALOME_Session_idl - session=clt.waitNSPID("/Kernel/Session",mySessionServ.PID,SALOME.Session) - + import Engines + import SALOME + import SALOMEDS + import SALOME_ModuleCatalog + import SALOME_Session_idl + if sys.platform == "win32": + session=clt.waitNS("/Kernel/Session",SALOME.Session) + else: + session=clt.waitNSPID("/Kernel/Session",mySessionServ.PID,SALOME.Session) end_time = os.times() - print + if verbose(): print print "Start SALOME, elapsed time : %5.1f seconds"% (end_time[4] - init_time[4]) @@ -649,8 +579,7 @@ def startSalome(args, modules_list, modules_root_dir): try: if 'interp' in args: - if args['interp']: - nbaddi = int(args['interp'][0]) + nbaddi = args['interp'] except: import traceback traceback.print_exc() @@ -664,7 +593,12 @@ def startSalome(args, modules_list, modules_root_dir): print "i=",i anInterp=InterpServer(args) anInterp.run() - + + # set PYTHONINSPECT variable (python interpreter in interactive mode) + if args['pinter']: + os.environ["PYTHONINSPECT"]="1" + import readline + return clt # ----------------------------------------------------------------------------- @@ -675,6 +609,7 @@ def useSalome(args, modules_list, modules_root_dir): save list of process, give info to user, show registered objects in Naming Service. """ + global process_id clt=None try: @@ -684,27 +619,19 @@ def useSalome(args, modules_list, modules_root_dir): traceback.print_exc() print print - print "--- erreur au lancement Salome ---" + print "--- Error during Salome launch ---" #print process_id + from addToKillList import addToKillList from killSalomeWithPort import getPiDict - filedict = getPiDict(args['port']) - process_ids = [] - try: - fpid=open(filedict, 'r') - process_ids=pickle.load(fpid) - fpid.close() - except: + filedict = getPiDict(args['port']) + for pid, cmd in process_id.items(): + addToKillList(pid, cmd, args['port']) pass - - fpid=open(filedict, 'w') - process_ids.append(process_id) - pickle.dump(process_ids,fpid) - fpid.close() - - print """ + + if verbose(): print """ Saving of the dictionary of Salome processes in %s To kill SALOME processes from a console (kill all sessions from all ports): python killSalome.py @@ -719,13 +646,56 @@ def useSalome(args, modules_list, modules_root_dir): """%filedict # - # Impression arborescence Naming Service + # Print Naming Service directory list # if clt != None: - print - print " --- registered objects tree in Naming Service ---" - clt.showNS() + if verbose(): + print + print " --- registered objects tree in Naming Service ---" + clt.showNS() + pass + + if not args['gui'] or not args['session_gui']: + if args['shutdown_servers']: + class __utils__(object): + def __init__(self, port): + self.port = port + import killSalomeWithPort + self.killSalomeWithPort = killSalomeWithPort + return + def __del__(self): + self.killSalomeWithPort.killMyPort(self.port) + return + pass + args['shutdown_servers'] = __utils__(args['port']) + pass + pass + + # run python scripts, passed via --execute option + toimport = [] + if args.has_key('pyscript'): + if args.has_key('gui') and args.has_key('session_gui'): + if not args['gui'] or not args['session_gui']: + toimport = args['pyscript'] + i = 0 + while i < len( toimport ) : + if toimport[ i ] == 'killall': + clt.showNS() + killAllPorts() + sys.exit(0) + else: + scrname = toimport[ i ] + if len(scrname) > 2 and (len(scrname) - string.rfind(scrname, ".py") == 3): + print 'executing',scrname + sys.path.insert( 0, os.path.dirname(scrname)) + execfile(scrname,globals()) + del sys.path[0] + else: + print 'importing',scrname + doimport = 'import ' + scrname + exec doimport + i = i + 1 return clt @@ -736,7 +706,12 @@ def registerEnv(args, modules_list, modules_root_dir): Register args, modules_list, modules_root_dir in a file for further use, when SALOME is launched embedded in an other application. """ - fileEnv = '/tmp/' + os.getenv('USER') + "_" + str(args['port']) \ + if sys.platform == "win32": + fileEnv = os.getenv('TEMP') + else: + fileEnv = '/tmp/' + + fileEnv += os.getenv('USER') + "_" + str(args['port']) \ + '_' + args['appname'].upper() + '_env' fenv=open(fileEnv,'w') pickle.dump((args, modules_list, modules_root_dir),fenv) @@ -745,6 +720,112 @@ def registerEnv(args, modules_list, modules_root_dir): # ----------------------------------------------------------------------------- +def searchFreePort(args, save_config=1): + print "Searching for a free port for naming service:", + # + if sys.platform == "win32": + tmp_file = os.getenv('TEMP'); + else: + tmp_file = '/tmp' + tmp_file = os.path.join(tmp_file, '.netstat_%s'%os.getpid()) + # + ###status = os.system("netstat -ltn | grep -E :%s > /dev/null 2>&1"%(NSPORT)) + os.system( "netstat -a -n > %s" % tmp_file ); + f = open( tmp_file, 'r' ); + ports = f.readlines(); + f.close(); + os.remove( tmp_file ); + # + def portIsUsed(port, data): + regObj = re.compile( ".*tcp.*:([0-9]+).*:.*listen", re.IGNORECASE ); + for item in data: + try: + p = int(regObj.match(item).group(1)) + if p == port: return True + pass + except: + pass + pass + return False + # + NSPORT=2810 + limit=NSPORT+100 + # + while 1: + if not portIsUsed(NSPORT, ports): + print "%s - OK"%(NSPORT) + # + from salome_utils import generateFileName, getHostName + hostname = getHostName() + # + home = os.getenv("HOME") + appli = os.getenv("APPLI") + kwargs={} + if appli is not None: + home = os.path.join(home, appli,"USERS") + kwargs["with_username"]=True + # + omniorb_config = generateFileName(home, prefix="omniORB", + extension="cfg", + hidden=True, + with_hostname=True, + with_port=NSPORT, + **kwargs) + orbdata = [] + initref = "NameService=corbaname::%s:%s"%(hostname, NSPORT) + from omniORB import CORBA + if CORBA.ORB_ID == "omniORB4": + orbdata.append("InitRef = %s"%(initref)) + orbdata.append("giopMaxMsgSize = 2097152000 # 2 GBytes") + orbdata.append("traceLevel = 0 # critical errors only") + else: + orbdata.append("ORBInitRef %s"%(initref)) + orbdata.append("ORBgiopMaxMsgSize = 2097152000 # 2 GBytes") + orbdata.append("ORBtraceLevel = 0 # critical errors only") + pass + orbdata.append("") + f = open(omniorb_config, "w") + f.write("\n".join(orbdata)) + f.close() + # + os.environ['OMNIORB_CONFIG'] = omniorb_config + os.environ['NSPORT'] = "%s"%(NSPORT) + os.environ['NSHOST'] = "%s"%(hostname) + args['port'] = os.environ['NSPORT'] + # + if save_config: + last_running_config = generateFileName(home, prefix="omniORB", + suffix="last", + extension="cfg", + hidden=True, + **kwargs) + try: + if sys.platform == "win32": + import shutil + shutil.copyfile(omniorb_config, last_running_config) + else: + try: + os.remove(last_running_config) + except OSError: + pass + os.symlink(omniorb_config, last_running_config) + pass + pass + except: + pass + break + print "%s"%(NSPORT), + if NSPORT == limit: + msg = "\n" + msg += "Can't find a free port to launch omniNames\n" + msg += "Try to kill the running servers and then launch SALOME again.\n" + raise RuntimeError, msg + NSPORT=NSPORT+1 + pass + return + +# ----------------------------------------------------------------------------- + def no_main(): """Salome Launch, when embedded in other application""" fileEnv = os.environ["SALOME_LAUNCH_CONFIG"] @@ -752,6 +833,7 @@ def no_main(): args, modules_list, modules_root_dir = pickle.load(fenv) fenv.close() kill_salome(args) + searchFreePort(args, 0) clt = useSalome(args, modules_list, modules_root_dir) return clt @@ -759,9 +841,16 @@ def no_main(): def main(): """Salome launch as a main application""" - args, modules_list, modules_root_dir = get_config() + from salome_utils import getHostName + print "runSalome running on %s" % getHostName() + args, modules_list, modules_root_dir = setenv.get_config() kill_salome(args) - set_env(args, modules_list, modules_root_dir) + save_config = True + if args.has_key('save_config'): + save_config = args['save_config'] + searchFreePort(args, save_config) + #setenv.main() + setenv.set_env(args, modules_list, modules_root_dir) clt = useSalome(args, modules_list, modules_root_dir) return clt,args