X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=bin%2FrunSalome.py;h=44a9693da4f9c8278428d69387ce091c82c486f3;hb=9ed27bb6b3a18d7554fa762bcbfc74d6018843a4;hp=f20b507944fefc072e52db5d699c029baa45c428;hpb=f14439749926cca959747bb79fda10529520bd0b;p=modules%2Fkernel.git diff --git a/bin/runSalome.py b/bin/runSalome.py index f20b50794..44a9693da 100755 --- a/bin/runSalome.py +++ b/bin/runSalome.py @@ -1,30 +1,36 @@ #!/usr/bin/env python - -# Copyright (C) 2005 OPEN CASCADE, CEA, EDF R&D, LEG -# PRINCIPIA R&D, EADS CCR, Lip6, BV, CEDRAT +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2007-2013 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 +# 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 +# +# 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 +# +# 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 import setenv -from server import * from launchConfigureParser import verbose -#process_id = {} move to server.py +from server import process_id, Server # ----------------------------------------------------------------------------- @@ -35,7 +41,7 @@ def killLocalPort(): kill servers from a previous SALOME exection, if needed, on the CORBA port given in args of runSalome """ - + from killSalomeWithPort import killMyPort my_port=str(args['port']) try: @@ -44,13 +50,13 @@ def killLocalPort(): print "problem in killLocalPort()" pass pass - + def givenPortKill(port): """ kill servers from a previous SALOME exection, if needed, on the same CORBA port """ - + from killSalomeWithPort import killMyPort my_port=port try: @@ -74,16 +80,18 @@ def kill_salome(args): # ----------------------------------------------------------------------------- # -# Definition des classes d'objets pour le lancement des Server CORBA +# Class definitions to launch CORBA Servers # 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'] - + if sys.platform != "win32": + env_ld_library_path=['env', 'LD_LIBRARY_PATH=' + os.getenv("LD_LIBRARY_PATH")] + self.CMD=['xterm', '-e']+ env_ld_library_path + ['python'] + else: + self.CMD=['cmd', '/c', 'start cmd.exe', '/K', 'python'] + def run(self): global process_id command = self.CMD @@ -98,51 +106,60 @@ class InterpServer(Server): # --- +def get_cata_path(list_modules,modules_root_dir): + """Build a list of catalog paths (cata_path) to initialize the ModuleCatalog server + """ + modules_cata={} + cata_path=[] + + for module in list_modules: + if modules_root_dir.has_key(module): + module_root_dir=modules_root_dir[module] + module_cata=module+"Catalog.xml" + cata_file=os.path.join(module_root_dir, "share",setenv.salome_subdir, "resources",module.lower(), module_cata) + + if os.path.exists(cata_file): + cata_path.append(cata_file) + modules_cata[module]=cata_file + else: + cata_file=os.path.join(module_root_dir, "share",setenv.salome_subdir, "resources", module_cata) + if os.path.exists(cata_file): + cata_path.append(cata_file) + modules_cata[module]=cata_file + + for path in os.getenv("SALOME_CATALOGS_PATH","").split(os.pathsep): + if os.path.exists(path): + for cata_file in glob.glob(os.path.join(path,"*Catalog.xml")): + module_name= os.path.basename(cata_file)[:-11] + if not modules_cata.has_key(module_name): + cata_path.append(cata_file) + modules_cata[module_name]=cata_file + + return cata_path + + + 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') if home_dir is not None: - self.SCMD2=['-personal',os.path.join(home_dir,'Salome/resources/CatalogModulePersonnel.xml')] + self.SCMD2=['-personal',os.path.join(home_dir,'Salome/resources/CatalogModulePersonnel.xml')] def setpath(self,modules_list,modules_root_dir): - cata_path=[] list_modules = modules_list[:] list_modules.reverse() 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 - 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 + + cata_path=get_cata_path(list_modules,modules_root_dir) + + self.CMD=self.SCMD1 + ['"' + string.join(cata_path,'"::"') + '"'] + self.SCMD2 # --- @@ -178,41 +195,31 @@ class ContainerCPPServer(Server): # --- -class ContainerPYServer(Server): - def __init__(self,args): - self.args=args - self.initArgs() - 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'] - -# --- - -class ContainerSUPERVServer(Server): - def __init__(self,args): - self.args=args - self.initArgs() - # if sys.platform == "win32": -# self.CMD=[os.environ["KERNEL_ROOT_DIR"] + "/win32/" + os.environ["BIN_ENV"] + "/" + 'SALOME_Container' + ".exe",'SuperVisionContainer'] -# else: - self.CMD=['SALOME_Container','SuperVisionContainer'] - -# --- - class LoggerServer(Server): def __init__(self,args): self.args=args self.initArgs() - if sys.platform == "win32": - self.CMD=['SALOME_Logger_Server', os.environ["HOME"] + "/logger.log"]; - else: - 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): + def __init__(self,args,modules_list,modules_root_dir): self.args = args.copy() # Bug 11512 (Problems with runSalome --xterm on Mandrake and Debian Sarge) #self.args['xterm']=0 @@ -227,7 +234,7 @@ class SessionServer(Server): self.SCMD1+=['--with','ModuleCatalog','(','-common'] home_dir=os.getenv('HOME') if home_dir is not None: - self.SCMD2+=['-personal',os.path.join(home_dir,'Salome/resources/CatalogModulePersonnel.xml')] + self.SCMD2+=['-personal',os.path.join(home_dir,'Salome/resources/CatalogModulePersonnel.xml')] self.SCMD2+=[')'] if 'study' in self.args['embedded']: self.SCMD2+=['--with','SALOMEDS','(',')'] @@ -235,13 +242,11 @@ class SessionServer(Server): self.SCMD2+=['--with','Container','(','FactoryServer',')'] if 'SalomeAppEngine' in self.args['embedded']: self.SCMD2+=['--with','SalomeAppEngine','(',')'] - + if 'cppContainer' in self.args['standalone'] or 'cppContainer' in self.args['embedded']: self.SCMD2+=['CPP'] if 'pyContainer' in self.args['standalone'] or 'pyContainer' in self.args['embedded']: - self.SCMD2+=['PY'] - if 'supervContainer' in self.args['standalone']: - self.SCMD2+=['SUPERV'] + raise Exception('Python containers no longer supported') if self.args['gui']: session_gui = True if self.args.has_key('session_gui'): @@ -255,49 +260,76 @@ class SessionServer(Server): self.SCMD2+=['--study-hdf=%s'%self.args['study_hdf']] pass pass + if self.args.has_key('pyscript') and len(self.args['pyscript']) > 0: + self.SCMD2+=['--pyscript=%s'%(",".join(self.args['pyscript']))] + 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 (%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']))] + list_modules = [] + #keep only modules with GUI + for m in modules_list: + if m not in modules_root_dir: + list_modules.insert(0,m) + else: + fr1 = os.path.join(modules_root_dir[m],"share","salome","resources",m.lower(),"SalomeApp.xml") + fr2 = os.path.join(modules_root_dir[m],"share","salome","resources","SalomeApp.xml") + if os.path.exists(fr1) or os.path.exists(fr2): + list_modules.insert(0,m) + list_modules.reverse() + self.SCMD2+=['--modules (%s)' % ":".join(list_modules)] + pass + pass def setpath(self,modules_list,modules_root_dir): - cata_path=[] list_modules = modules_list[:] list_modules.reverse() 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 - 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 + + cata_path=get_cata_path(list_modules,modules_root_dir) + 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 + 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 + + if self.args["valgrind_session"]: + l = ["valgrind"] + val = os.getenv("VALGRIND_OPTIONS") + if val: + l += val.split() + pass + self.CMD = l + self.CMD + pass + # --- class LauncherServer(Server): @@ -318,35 +350,20 @@ class LauncherServer(Server): 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() 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 - 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 + list_modules = ["KERNEL", "GUI"] + list_modules + else : + list_modules = ["KERNEL"] + list_modules + + cata_path=get_cata_path(list_modules,modules_root_dir) + if (self.args["gui"]) & ('moduleCatalog' in self.args['embedded']): - self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2 + #Use '::' instead ":" because drive path with "D:\" is invalid on windows platform + self.CMD=self.SCMD1 + ['"' + string.join(cata_path,'"::"') + '"'] + self.SCMD2 else: self.CMD=self.SCMD1 + self.SCMD2 @@ -367,19 +384,16 @@ class NotifyServer(Server): # # ----------------------------------------------------------------------------- -def startGUI(): +def startGUI(clt): """Salome Session Graphic User Interface activation""" import Engines import SALOME import SALOMEDS import SALOME_ModuleCatalog - reload(Engines) - reload(SALOME) - reload(SALOMEDS) import SALOME_Session_idl session=clt.waitNS("/Kernel/Session",SALOME.Session) session.GetInterface() - + # ----------------------------------------------------------------------------- def startSalome(args, modules_list, modules_root_dir): @@ -387,27 +401,80 @@ def startSalome(args, modules_list, modules_root_dir): init_time = os.times() if verbose(): print "startSalome ", args - + + # + # Set server launch command # - # Initialisation ORB et Naming Service + if args.has_key('server_launch_mode'): + Server.set_server_launch_mode(args['server_launch_mode']) + + # + # Wake up session option # - + if args['wake_up_session']: + if "OMNIORB_CONFIG" not in os.environ: + from salome_utils import generateFileName + omniorbUserPath = os.getenv("OMNIORB_USER_PATH") + kwargs={} + if omniorbUserPath is not None: + kwargs["with_username"]=True + + last_running_config = generateFileName(omniorbUserPath, prefix="omniORB", + suffix="last", + extension="cfg", + hidden=True, + **kwargs) + os.environ['OMNIORB_CONFIG'] = last_running_config + pass + pass + + # + # Initialisation ORB and Naming Service + # + clt=orbmodule.client(args) + + # + # Wake up session option + # + if args['wake_up_session']: + import Engines + import SALOME + import SALOMEDS + import SALOME_ModuleCatalog + import SALOME_Session_idl + session = clt.waitNS("/Kernel/Session",SALOME.Session) + status = session.GetStatSession() + if status.activeGUI: + from salome_utils import getPortNumber + port = getPortNumber() + msg = "Warning :" + msg += "\n" + msg += "Session GUI for port number %s is already active."%(port) + msg += "\n" + msg += "If you which to wake up another session," + msg += "\n" + msg += "please use variable OMNIORB_CONFIG" + msg += "\n" + msg += "to get the correct session object in naming service." + sys.stdout.write(msg+"\n") + sys.stdout.flush() + return clt + session.GetInterface() + args["session_object"] = session + return clt + # 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"]) + omniorbUserPath = os.getenv("OMNIORB_USER_PATH") + file_name = os.path.join(omniorbUserPath, 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']: @@ -418,25 +485,23 @@ def startSalome(args, modules_list, modules_root_dir): # Notify Server launch # - if verbose(): print "Notify Server to launch" - if sys.platform != "win32": - print "Notify Server to launch" - + if verbose(): print "Notify Server to launch" + myServer=NotifyServer(args,modules_root_dir) myServer.run() - # Lancement Session Server (to show splash ASAP) + # Launch Session Server (to show splash ASAP) # if args["gui"]: - mySessionServ = SessionServer(args) + mySessionServ = SessionServer(args,args['modules'],modules_root_dir) 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']) | (args["gui"] == 0) : @@ -448,10 +513,9 @@ def startSalome(args, modules_list, modules_root_dir): 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']) | (args["gui"] == 0): cataServer=CatalogServer(args) @@ -464,8 +528,8 @@ def startSalome(args, modules_list, modules_root_dir): 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 @@ -479,9 +543,9 @@ def startSalome(args, modules_list, modules_root_dir): clt.waitNSPID("/myStudyManager",myServer.PID) # - # Lancement LauncherServer + # Launch LauncherServer # - + myCmServer = LauncherServer(args) myCmServer.setpath(modules_list,modules_root_dir) myCmServer.run() @@ -495,7 +559,7 @@ def startSalome(args, modules_list, modules_root_dir): from Utils_Identity import getShortHostName - + if os.getenv("HOSTNAME") == None: if os.getenv("HOST") == None: os.environ["HOSTNAME"]=getShortHostName() @@ -503,13 +567,13 @@ def startSalome(args, modules_list, modules_root_dir): os.environ["HOSTNAME"]=os.getenv("HOST") 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']) | (args["gui"] == 0) : + if ('cppContainer' in args['standalone']) | (args["gui"] == 0) : myServer=ContainerCPPServer(args) myServer.run() if sys.platform == "win32": @@ -518,51 +582,29 @@ def startSalome(args, modules_list, modules_root_dir): 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() - if sys.platform == "win32": - clt.waitNS("/Containers/" + theComputer + "/FactoryServerPy") - else: - clt.waitNSPID("/Containers/" + theComputer + "/FactoryServerPy",myServer.PID) + raise Exception('Python containers no longer supported') # - # Lancement Container Supervision local, - # attente de la disponibilite du Container Supervision local - # dans le Naming Service + # Wait until Session Server is registered in naming service # - if 'supervContainer' in args['standalone']: - myServer=ContainerSUPERVServer(args) - myServer.run() - if sys.platform == "win32": - clt.waitNS("/Containers/" + theComputer + "/SuperVisionContainer") - else: - clt.waitNSPID("/Containers/" + theComputer + "/SuperVisionContainer",myServer.PID) - - # - # Attente de la disponibilite du Session Server dans le Naming Service - # - if args["gui"]: -##---------------- +##---------------- import Engines import SALOME import SALOMEDS import SALOME_ModuleCatalog - reload(Engines) - reload(SALOME) - reload(SALOMEDS) 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) + args["session_object"] = session end_time = os.times() if verbose(): print print "Start SALOME, elapsed time : %5.1f seconds"% (end_time[4] @@ -576,7 +618,7 @@ def startSalome(args, modules_list, modules_root_dir): # additionnal external python interpreters # nbaddi=0 - + try: if 'interp' in args: nbaddi = args['interp'] @@ -586,18 +628,22 @@ def startSalome(args, modules_list, modules_root_dir): print "-------------------------------------------------------------" print "-- to get an external python interpreter:runSalome --interp=1" print "-------------------------------------------------------------" - - print "additional external python interpreters: ", nbaddi + + if verbose(): print "additional external python interpreters: ", nbaddi if nbaddi: for i in range(nbaddi): print "i=",i anInterp=InterpServer(args) anInterp.run() - # set PYTHONINSPECT variable + # set PYTHONINSPECT variable (python interpreter in interactive mode) if args['pinter']: os.environ["PYTHONINSPECT"]="1" - + try: + import readline + except ImportError: + pass + return clt # ----------------------------------------------------------------------------- @@ -609,7 +655,7 @@ def useSalome(args, modules_list, modules_root_dir): show registered objects in Naming Service. """ global process_id - + clt=None try: clt = startSalome(args, modules_list, modules_root_dir) @@ -619,77 +665,106 @@ def useSalome(args, modules_list, modules_root_dir): print print 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() - + 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 + python killSalome.py To kill SALOME from the present interpreter, if it is not closed : killLocalPort() --> kill this session (use CORBA port from args of runSalome) - givenPortKill(port) --> kill a specific session with given CORBA port + givenPortKill(port) --> kill a specific session with given CORBA port killAllPorts() --> kill all sessions - + runSalome, with --killall option, starts with killing the processes resulting from the previous execution. """%filedict - + # - # Impression arborescence Naming Service + # Print Naming Service directory list # - + if clt != None: 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': + + for srcname in toimport : + if srcname == 'killall': clt.showNS() killAllPorts() - import sys sys.exit(0) else: - scrname = toimport[ i ] - if len(scrname) > 2 and (len(scrname) - string.rfind(scrname, ".py") == 3): - print 'executing',scrname - doexec = 'execfile(\"%s\")'%scrname - exec doexec + if os.path.isabs(srcname): + if os.path.exists(srcname): + execScript(srcname) + elif os.path.exists(srcname+".py"): + execScript(srcname+".py") + else: + print "Can't execute file %s" % srcname + pass else: - print 'importing',scrname - doimport = 'import ' + scrname - exec doimport - i = i + 1 - + found = False + for path in [os.getcwd()] + sys.path: + if os.path.exists(os.path.join(path,srcname)): + execScript(os.path.join(path,srcname)) + found = True + break + elif os.path.exists(os.path.join(path,srcname+".py")): + execScript(os.path.join(path,srcname+".py")) + found = True + break + pass + if not found: + print "Can't execute file %s" % srcname + pass + pass + pass + pass + pass return clt +def execScript(script_path): + print 'executing', script_path + sys.path.insert(0, os.path.dirname(script_path)) + execfile(script_path,globals()) + del sys.path[0] + # ----------------------------------------------------------------------------- def registerEnv(args, modules_list, modules_root_dir): @@ -711,104 +786,6 @@ def registerEnv(args, modules_list, modules_root_dir): # ----------------------------------------------------------------------------- -def searchFreePort(args, save_config=1): - print "Searching for a free port for naming service:", - NSPORT=2810 - limit=NSPORT - limit=limit+10 - while 1: - import os - import re - from os import getpid - from os import system - - if sys.platform == "win32": - tmp_file = os.getenv('TEMP'); - else: - tmp_file = '/tmp/' - tmp_file += 'hostname_%s'%(getpid()) - -# status = os.system("netstat -ltn | grep -E :%s > /dev/null 2>&1"%(NSPORT)) - - system( "netstat -a -n > %s" % tmp_file ); - - f = open( tmp_file, 'r' ); - lines = f.readlines(); - f.close(); - - pattern = "tcp.*:([0-9]+).*:.*listen"; - regObj = re.compile( pattern, re.IGNORECASE ); - - status = 1; - for item in lines: - m = regObj.search( item ) - if m: - try: - p = int( m.group(1) ) - if p == NSPORT: - status = 0; - break; - except: - pass - pass - - if status == 1: - print "%s - OK"%(NSPORT) - # - system('hostname > %s'%(tmp_file)) - f = open(tmp_file) - myhost = f.read() - myhost = myhost[:-1] - f.close() - - os.remove( tmp_file ); - - # - home = os.environ['HOME'] - appli=os.environ.get("APPLI") - if appli is not None: - home='%s/%s'%(home,appli) - pass - # - os.environ['OMNIORB_CONFIG'] = '%s/.omniORB_%s_%s.cfg'%(home, myhost, NSPORT) - initref = "NameService=corbaname::%s:%s"%(myhost, NSPORT) - os.environ['NSPORT'] = "%s"%(NSPORT) - os.environ['NSHOST'] = "%s"%(myhost) - f = open(os.environ['OMNIORB_CONFIG'], "w") - import CORBA - if CORBA.ORB_ID == "omniORB4": - initref += "\ngiopMaxMsgSize = 2097152000 # 2 GBytes"; - initref += "\ntraceLevel = 0 # critical errors only"; - f.write("InitRef = %s\n"%(initref)) - else: - initref += "\nORBgiopMaxMsgSize = 2097152000 # 2 GBytes"; - initref += "\nORBtraceLevel = 0 # critical errors only"; - f.write("ORBInitRef %s\n"%(initref)) - pass - f.close() - args['port'] = os.environ['NSPORT'] - # - if save_config: - from os import system - if sys.platform == "win32": - import shutil - shutil.copyfile( os.environ['OMNIORB_CONFIG'], "%s/.omniORB_last.cfg"%( home ) ) - else: - system('ln -s -f %s %s/.omniORB_last.cfg'%(os.environ['OMNIORB_CONFIG'], home)) - 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 msg - NSPORT=NSPORT+1 - pass - return - -# ----------------------------------------------------------------------------- - def no_main(): """Salome Launch, when embedded in other application""" fileEnv = os.environ["SALOME_LAUNCH_CONFIG"] @@ -816,6 +793,7 @@ def no_main(): args, modules_list, modules_root_dir = pickle.load(fenv) fenv.close() kill_salome(args) + from searchFreePort import searchFreePort searchFreePort(args, 0) clt = useSalome(args, modules_list, modules_root_dir) return clt @@ -824,20 +802,135 @@ def no_main(): def main(): """Salome launch as a main application""" - import sys - print "runSalome running on ",os.getenv('HOSTNAME') + from salome_utils import getHostName + print "runSalome running on %s" % getHostName() args, modules_list, modules_root_dir = setenv.get_config() + kill_salome(args) save_config = True if args.has_key('save_config'): save_config = args['save_config'] - searchFreePort(args, save_config) - setenv.main() + # -- + test = True + if args['wake_up_session']: + test = False + pass + if test: + from searchFreePort import searchFreePort + searchFreePort(args, save_config, args.get('useport')) + pass + # -- + #setenv.main() + setenv.set_env(args, modules_list, modules_root_dir) clt = useSalome(args, modules_list, modules_root_dir) return clt,args # ----------------------------------------------------------------------------- +def foreGround(clt, args): + # -- + if "session_object" not in args: + return + session = args["session_object"] + # -- + # Wait until gui is arrived + # tmax = nbtot * dt + # -- + gui_detected = False + dt = 0.1 + nbtot = 100 + nb = 0 + while 1: + try: + status = session.GetStatSession() + gui_detected = status.activeGUI + except: + pass + if gui_detected: + break + from time import sleep + sleep(dt) + nb += 1 + if nb == nbtot: + break + pass + # -- + if not gui_detected: + return + # -- + from salome_utils import getPortNumber + port = getPortNumber() + # -- + server = Server({}) + if sys.platform == "win32": + server.CMD = [os.getenv("PYTHONBIN"), "-m", "killSalomeWithPort", "--spy", "%s"%(os.getpid()), "%s"%(port)] + else: + server.CMD = ["killSalomeWithPort.py", "--spy", "%s"%(os.getpid()), "%s"%(port)] + server.run() + # os.system("killSalomeWithPort.py --spy %s %s &"%(os.getpid(), port)) + # -- + dt = 1.0 + try: + while 1: + try: + status = session.GetStatSession() + assert status.activeGUI + except: + break + from time import sleep + sleep(dt) + pass + pass + except KeyboardInterrupt: + from killSalomeWithPort import killMyPort + killMyPort(port) + pass + return +# + +def runSalome(): + import user + clt,args = main() + # -- + test = args['gui'] and args['session_gui'] + test = test or args['wake_up_session'] + # -- + # The next test covers the --pinter option or var PYTHONINSPECT setted + # -- + test = test and not os.environ.get('PYTHONINSPECT') + # -- + # The next test covers the python -i $KERNEL_ROOT_DIR/bin/salome/runSalome.py case + # -- + try: + from ctypes import POINTER, c_int, cast, pythonapi + iflag_ptr = cast(pythonapi.Py_InteractiveFlag, POINTER(c_int)) + test = test and not iflag_ptr.contents.value + except: + pass + # -- + test = test and os.getenv("SALOME_TEST_MODE", "0") != "1" + test = test and args['foreground'] + # -- + if test: + foreGround(clt, args) + pass + # -- + pass +# + +# ----------------------------------------------------------------------------- + if __name__ == "__main__": - import user - clt,args = main() + + ### TEMP ### + homePath = os.path.realpath(os.path.expanduser('~')) + #defaultOmniorbUserPath = os.path.join(homePath, ".salomeConfig/USERS") + appli = os.getenv("APPLI") + defaultOmniorbUserPath = homePath + if appli: + defaultOmniorbUserPath = os.path.join( homePath, appli, "USERS" ) + os.environ["OMNIORB_USER_PATH"] = defaultOmniorbUserPath + ############ + + runSalome() +#