Salome HOME
Fix subdir duplicates in CTestTestfile
[modules/kernel.git] / bin / runSalome.py
index cc3a72b16cf2ef65ba86d4a0296ed9d9f207e1bf..29b915751dfa32e5d115a7d85257bd4fce55de32 100755 (executable)
 #!/usr/bin/env python
-
-usage="""USAGE: runSalome.py [options]
-
-[command line options] :
---help                        : affichage de l'aide
---gui                         : lancement du GUI
---logger                     : redirection des messages dans un fichier
---xterm                              : les serveurs ouvrent une fenêtre xterm et les messages sont affichés dans cette fenêtre
---modules=module1,module2,... : où modulen est le nom d'un module Salome à charger dans le catalogue
---containers=cpp,python,superv: lancement des containers cpp, python et de supervision
---killall                    : arrêt des serveurs de salome
-
- La variable d'environnement <modulen>_ROOT_DIR doit etre préalablement
- positionnée (modulen doit etre en majuscule).
- KERNEL_ROOT_DIR est obligatoire.
-"""
-
-# -----------------------------------------------------------------------------
+#  -*- coding: iso-8859-1 -*-
+# Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
 #
-# Fonction d'arrêt de salome
+# Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 #
-
-def killSalome():
-   print "arret des serveurs SALOME"
-   for pid, cmd in process_id.items():
-      print "arret du process %s : %s"% (pid, cmd[0])
-      try:
-       os.kill(pid,signal.SIGKILL)
-      except:
-         print "  ------------------ process %s : %s inexistant"% (pid, cmd[0])
-   print "arret du naming service"
-   os.system("killall -9 omniNames")
-   
-# -----------------------------------------------------------------------------
+# 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, or (at your option) any later version.
 #
-# Fonction message
+# 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.
 #
-
-def message(code, msg=''):
-    if msg: print msg
-    sys.exit(code)
-
-import sys,os,string,glob,time,signal,pickle,getopt
-
-init_time=os.times()
-opts, args=getopt.getopt(sys.argv[1:], 'hmglxck:', ['help','modules=','gui','logger','xterm','containers=','killall'])
-modules_root_dir={}
-process_id={}
-liste_modules={}
-liste_containers={}
-with_gui=0
-with_logger=0
-with_xterm=0
-
-with_container_cpp=0
-with_container_python=0
-with_container_superv=0
-
-try:
-  for o, a in opts:
-    if o in ('-h', '--help'):
-      print usage
-      sys.exit(1)
-    elif o in ('-g', '--gui'):
-      with_gui=1
-    elif o in ('-l', '--logger'):
-      with_logger=1
-    elif o in ('-x', '--xterm'):
-      with_xterm=1
-    elif o in ('-m', '--modules'):
-      liste_modules = [x.upper() for x in a.split(',')]
-    elif o in ('-c', '--containers'):
-      liste_containers = [x.lower() for x in a.split(',')]
-      for r in liste_containers:
-        if r not in ('cpp', 'python', 'superv'):
-          message(1, 'Invalid -c/--containers option: %s' % a)
-      if 'cpp' in liste_containers:
-          with_container_cpp=1
-      else:
-          with_container_cpp=0
-      if 'python' in liste_containers:
-          with_container_python=1
-      else:
-          with_container_python=0
-      if 'superv' in liste_containers:
-          with_container_superv=1
-      else:
-          with_container_superv=0
-    elif o in ('-k', '--killall'):
-      filedict='/tmp/'+os.getenv('USER')+'_SALOME_pidict'
-      #filedict='/tmp/'+os.getlogin()+'_SALOME_pidict'
-      found = 0
-      try:
-         fpid=open(filedict, 'r')
-        found = 1
-      except:
-         print "le fichier %s des process SALOME n'est pas accessible"% filedict
-
-      if found:
-         process_id=pickle.load(fpid)
-         fpid.close()
-         killSalome()
-        process_id={}
-         os.remove(filedict)
-       
-except getopt.error, msg:
-  print usage
-  sys.exit(1)
-
-# -----------------------------------------------------------------------------
+# 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
 #
-# Vérification des variables d'environnement
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
-try:
-  kernel_root_dir=os.environ["KERNEL_ROOT_DIR"]
-  modules_root_dir["KERNEL"]=kernel_root_dir
-except:
-  print usage
-  sys.exit(1)
-
-for module in liste_modules :
-   try:
-      module=module.upper()
-      module_root_dir=os.environ[module +"_ROOT_DIR"]
-      modules_root_dir[module]=module_root_dir
-   except:
-      print usage
-      sys.exit(1)
-
-# il faut KERNEL en premier dans la liste des modules
-# - l'ordre des modules dans le catalogue sera identique
-# - la liste des modules presents dans le catalogue est exploitée pour charger les modules CORBA python,
-#   il faut charger les modules python du KERNEL en premier
-
-if "KERNEL" in liste_modules:liste_modules.remove("KERNEL")
-liste_modules[:0]=["KERNEL"]
-#print liste_modules
-#print modules_root_dir
-
-os.environ["SALOMEPATH"]=":".join(modules_root_dir.values())
-if "SUPERV" in liste_modules:with_container_superv=1
-
 
-# -----------------------------------------------------------------------------
+## @package runSalome
+# \brief Module that provides services to launch SALOME
 #
-# Définition des classes d'objets pour le lancement des Server CORBA
-#
-
-class Server:
-   CMD=[]
-   if with_xterm:
-       ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-e']
-   else:
-       ARGS=[] 
-
-   def run(self):
-      args = self.ARGS+self.CMD
-      #print "args = ", args
-      pid = os.spawnvp(os.P_NOWAIT, args[0], args)
-      process_id[pid]=self.CMD
-
-class CatalogServer(Server):
-   SCMD1=['SALOME_ModuleCatalog_Server','-common']
-   SCMD2=['-personal','${HOME}/Salome/resources/CatalogModulePersonnel.xml'] 
-
-   def setpath(self,liste_modules):
-      cata_path=[]
-      for module in liste_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","resources",module_cata)))
-      self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
-
-class SalomeDSServer(Server):
-   CMD=['SALOMEDS_Server']
-
-class RegistryServer(Server):
-   CMD=['SALOME_Registry_Server', '--salome_session','theSession']
-
-class ContainerCPPServer(Server):
-   CMD=['SALOME_Container','FactoryServer','-ORBInitRef','NameService=corbaname::localhost']
 
-class ContainerPYServer(Server):
-   CMD=['SALOME_ContainerPy.py','FactoryServerPy','-ORBInitRef','NameService=corbaname::localhost']
-
-class ContainerSUPERVServer(Server):
-   CMD=['SALOME_Container','SuperVisionContainer','-ORBInitRef','NameService=corbaname::localhost']
-
-class LoggerServer(Server):
-   CMD=['SALOME_Logger_Server', 'logger.log']
-
-class SessionLoader(Server):
-   CMD=['SALOME_Session_Loader']
-   if with_container_cpp:
-       CMD=CMD+['CPP']
-   if with_container_python:
-       CMD=CMD+['PY']
-   if with_container_superv:
-       CMD=CMD+['SUPERV']
-   if with_gui:
-       CMD=CMD+['GUI']
-
-class SessionServer(Server):
-   CMD=['SALOME_Session_Server']
-
-class NotifyServer(Server):
-   CMD=['notifd','-c','${KERNEL_ROOT_DIR}/share/salome/resources/channel.cfg -DFactoryIORFileName=/tmp/${LOGNAME}_rdifact.ior -DChannelIORFileName=/tmp/${LOGNAME}_rdichan.ior']
+import sys, os, string, glob, time, pickle, re
+import orbmodule
+import setenv
+from launchConfigureParser import verbose
+from server import process_id, Server
+import json
+import subprocess
+from salomeContextUtils import ScriptAndArgsObjectEncoder
 
 # -----------------------------------------------------------------------------
-#
-# Fonction de test
-#
 
-def test(clt):
-   # create an LifeCycleCORBA instance
-   import LifeCycleCORBA 
-   lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb)
-   med = lcc.FindOrLoadComponent("FactoryServer", "MED")
-   #pycalc = lcc.FindOrLoadComponent("FactoryServerPy", "CalculatorPy")
+from killSalome import killAllPorts
+
+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:
+        killMyPort(my_port)
+    except:
+        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:
+        killMyPort(my_port)
+    except:
+        print "problem in LocalPortKill(), killMyPort(%s)"%port
+        pass
+    pass
+
+def kill_salome(args):
+    """
+    Kill servers from previous SALOME executions, if needed;
+    depending on args 'killall' or 'portkill', kill all executions,
+    or only execution on the same CORBA port
+    """
+
+    if args['killall']:
+        killAllPorts()
+    elif args['portkill']:
+        givenPortKill(str(args['port']))
 
 # -----------------------------------------------------------------------------
 #
-# Fonctions helper pour ajouter des variables d'environnement
+# Class definitions to launch CORBA Servers
 #
 
-def add_path(directory):
-   os.environ["PATH"]=directory + ":" + os.environ["PATH"]
+class InterpServer(Server):
+    def __init__(self,args):
+        self.args=args
+        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
+        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
+
+# ---
+
+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
 
-def add_ld_library_path(directory):
-   os.environ["LD_LIBRARY_PATH"]=directory + ":" + os.environ["LD_LIBRARY_PATH"]
+class CatalogServer(Server):
+    def __init__(self,args):
+        self.args=args
+        self.initArgs()
+        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')]
 
-def add_python_path(directory):
-   os.environ["PYTHONPATH"]=directory + ":" + os.environ["PYTHONPATH"]
-   sys.path[:0]=[directory]
+    def setpath(self,modules_list,modules_root_dir):
+        list_modules = modules_list[:]
+        list_modules.reverse()
+        if self.args["gui"] :
+            list_modules = ["KERNEL", "GUI"] + list_modules
+        else :
+            list_modules = ["KERNEL"] + list_modules
 
-# -----------------------------------------------------------------------------
-#
-# initialisation des variables d'environnement
-#
+        cata_path=get_cata_path(list_modules,modules_root_dir)
 
-python_version="python%d.%d" % sys.version_info[0:2]
+        self.CMD=self.SCMD1 + ['"' + string.join(cata_path,'"::"') + '"'] + self.SCMD2
 
-#
-# Ajout du chemin d'acces aux executables de KERNEL dans le PATH
-#
+# ---
 
-add_path(os.path.join(kernel_root_dir,"bin","salome"))
-#print "PATH=",os.environ["PATH"]
+class SalomeDSServer(Server):
+    def __init__(self,args):
+        self.args=args
+        self.initArgs()
+        self.CMD=['SALOMEDS_Server']
 
-#
-# Ajout des modules dans le LD_LIBRARY_PATH
-#
-for module in liste_modules:
-    module_root_dir=modules_root_dir[module]
-    add_ld_library_path(os.path.join(module_root_dir,"lib","salome"))
-#print "LD_LIBRARY_PATH=",os.environ["LD_LIBRARY_PATH"]
+# ---
 
-#
-# Ajout des modules dans le PYTHONPATH (KERNEL prioritaire, donc en dernier)
-#
+class ConnectionManagerServer(Server):
+    def __init__(self,args):
+        self.args=args
+        self.initArgs()
+        self.CMD=['SALOME_ConnectionManagerServer']
 
-liste_modules_reverse=liste_modules[:]
-liste_modules_reverse.reverse()
-#print liste_modules
-#print liste_modules_reverse
-for module in liste_modules_reverse:
-    module_root_dir=modules_root_dir[module]
-    add_python_path(os.path.join(module_root_dir,"bin","salome"))
-    add_python_path(os.path.join(module_root_dir,"lib",python_version,"site-packages","salome"))
-    add_python_path(os.path.join(module_root_dir,"lib","salome"))
-    add_python_path(os.path.join(module_root_dir,"lib",python_version,"site-packages","salome","shared_modules"))
+# ---
 
-#print "PYTHONPATH=",sys.path
+class RegistryServer(Server):
+    def __init__(self,args):
+        self.args=args
+        self.initArgs()
+        self.CMD=['SALOME_Registry_Server', '--salome_session','theSession']
 
-import orbmodule
+# ---
 
-#
-# -----------------------------------------------------------------------------
-#
+class ContainerCPPServer(Server):
+    def __init__(self,args):
+        self.args=args
+        self.initArgs()
+        self.CMD=['SALOME_Container','FactoryServer']
 
-def startGUI():
-  import SALOME
-  session=clt.waitNS("/Kernel/Session",SALOME.Session)
+# ---
 
-  #
-  # Activation du GUI de Session Server
-  #
-       
-  session.GetInterface()
-  
+class LoggerServer(Server):
+    def __init__(self,args):
+        self.args=args
+        self.initArgs()
+        from salome_utils import generateFileName, getLogDir
+        logfile = generateFileName( getLogDir(),
+                                    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,modules_list,modules_root_dir):
+        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=[]
+        if 'registry' in self.args['embedded']:
+            self.SCMD1+=['--with','Registry',
+                         '(','--salome_session','theSession',')']
+        if 'moduleCatalog' in self.args['embedded']:
+            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+=[')']
+        if 'study' in self.args['embedded']:
+            self.SCMD2+=['--with','SALOMEDS','(',')']
+        if 'cppContainer' in self.args['embedded']:
+            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']:
+            raise Exception('Python containers no longer supported')
+        if self.args['gui']:
+            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
+                if self.args.has_key('pyscript') and len(self.args['pyscript']) > 0:
+                    msg = json.dumps(self.args['pyscript'], cls=ScriptAndArgsObjectEncoder)
+                    self.SCMD2+=['--pyscript=%s'%(msg)]
+                    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'):
+            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):
+        list_modules = modules_list[:]
+        list_modules.reverse()
+        if self.args["gui"] :
+            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']):
+            #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
+        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):
+    def __init__(self,args):
+        self.args=args
+        self.initArgs()
+        self.SCMD1=['SALOME_LauncherServer']
+        self.SCMD2=[]
+        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):
+        list_modules = modules_list[:]
+        list_modules.reverse()
+        if self.args["gui"] :
+            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']):
+            #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
 #
 # -----------------------------------------------------------------------------
-#
-
-def startSalome():
-
-  #
-  # Lancement Session Loader
-  #
-
-  SessionLoader().run()
-
-  #
-  # Initialisation ORB et Naming Service
-  #
-   
-  clt=orbmodule.client()
-
-  # (non obligatoire) Lancement Logger Server et attente de sa disponibilite dans le naming service
-  #
-
-  if with_logger:
-       LoggerServer().run()
-       clt.waitLogger("Logger")
-
-
-  #
-  # Lancement Registry Server
-  #
-
-  RegistryServer().run()
-
-  #
-  # Attente de la disponibilité du Registry dans le Naming Service
-  #
-
-  clt.waitNS("/Registry")
-
-  #
-  # Lancement Catalog Server
-  #
-
-  cataServer=CatalogServer()
-  cataServer.setpath(liste_modules)
-  cataServer.run()
-
-  #
-  # Attente de la disponibilité du Catalog Server dans le Naming Service
-  #
-
-  import SALOME_ModuleCatalog
-  clt.waitNS("/Kernel/ModulCatalog",SALOME_ModuleCatalog.ModuleCatalog)
-
-  #
-  # Lancement SalomeDS Server
-  #
 
-  os.environ["CSF_PluginDefaults"]=os.path.join(kernel_root_dir,"share","salome","resources")
-  os.environ["CSF_SALOMEDS_ResourcesDefaults"]=os.path.join(kernel_root_dir,"share","salome","resources")
-  SalomeDSServer().run()
+def startGUI(clt):
+    """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()
 
-  if "GEOM" in liste_modules:
-       print "GEOM OCAF Resources"
-       os.environ["CSF_GEOMDS_ResourcesDefaults"]=os.path.join(modules_root_dir["GEOM"],"share","salome","resources")
-
-
-  #
-  # Attente de la disponibilité du SalomeDS dans le Naming Service
-  #
-
-  clt.waitNS("/myStudyManager")
-
-  #
-  # Lancement Session Server
-  #
-
-  SessionServer().run()
-
-  #
-  # Attente de la disponibilité du Session Server dans le Naming Service
-  #
-
-  import SALOME
-  session=clt.waitNS("/Kernel/Session",SALOME.Session)
-
-  #
-  # Lancement Container C++ local
-  #
-  if with_container_cpp:
-         ContainerCPPServer().run()
-
-         #
-         # Attente de la disponibilité du Container C++ local dans le Naming Service
-         #
-
-         theComputer = os.getenv("HOSTNAME")
-         computerSplitName = theComputer.split('.')
-         theComputer = computerSplitName[0]
-
-         clt.waitNS("/Containers/" + theComputer + "/FactoryServer")
-
-  #
-  # Lancement Container Python local
-  #
+# -----------------------------------------------------------------------------
 
-  if with_container_python:
-         ContainerPYServer().run()
+def startSalome(args, modules_list, modules_root_dir):
+    """Launch all SALOME servers requested by args"""
+    init_time = os.times()
+
+    if verbose(): print "startSalome ", args
+
+    #
+    # Set server launch command
+    #
+    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
+
+    # Launch Logger Server (optional)
+    # and wait until it is registered in naming service
+    #
+
+    if args['logger']:
+        myServer=LoggerServer(args)
+        myServer.run()
+        clt.waitLogger("Logger")
+
+    # Launch  Session Server (to show splash ASAP)
+    #
+
+    if args["gui"]:
+        mySessionServ = SessionServer(args,args['modules'],modules_root_dir)
+        mySessionServ.setpath(modules_list,modules_root_dir)
+        mySessionServ.run()
+
+    #
+    # Launch Registry Server,
+    # and wait until it is registered in naming service
+    #
+
+    if ('registry' not in args['embedded']) | (args["gui"] == 0) :
+        myServer=RegistryServer(args)
+        myServer.run()
+        if sys.platform == "win32":
+          clt.waitNS("/Registry")
+        else:
+          clt.waitNSPID("/Registry",myServer.PID)
+
+    #
+    # Launch Catalog Server,
+    # and wait until it is registered in naming service
+    #
+
+    if ('moduleCatalog' not in args['embedded']) | (args["gui"] == 0):
+        cataServer=CatalogServer(args)
+        cataServer.setpath(modules_list,modules_root_dir)
+        cataServer.run()
+        import SALOME_ModuleCatalog
+        if sys.platform == "win32":
+          clt.waitNS("/Kernel/ModulCatalog",SALOME_ModuleCatalog.ModuleCatalog)
+        else:
+          clt.waitNSPID("/Kernel/ModulCatalog",cataServer.PID,SALOME_ModuleCatalog.ModuleCatalog)
+
+    #
+    # Launch SalomeDS Server,
+    # and wait until it is registered in naming service
+    #
+
+    #print "ARGS = ",args
+    if ('study' not in args['embedded']) | (args["gui"] == 0):
+        print "RunStudy"
+        myServer=SalomeDSServer(args)
+        myServer.run()
+        if sys.platform == "win32":
+          clt.waitNS("/myStudyManager")
+        else:
+          clt.waitNSPID("/myStudyManager",myServer.PID)
+
+    #
+    # Launch LauncherServer
+    #
+
+    myCmServer = LauncherServer(args)
+    myCmServer.setpath(modules_list,modules_root_dir)
+    myCmServer.run()
+
+    #
+    # Launch ConnectionManagerServer
+    #
+
+    myConnectionServer = ConnectionManagerServer(args)
+    myConnectionServer.run()
+
+
+    from Utils_Identity import getShortHostName
+
+    if os.getenv("HOSTNAME") == None:
+        if os.getenv("HOST") == None:
+            os.environ["HOSTNAME"]=getShortHostName()
+        else:
+            os.environ["HOSTNAME"]=os.getenv("HOST")
+
+    theComputer = getShortHostName()
+
+    #
+    # Launch local C++ Container (FactoryServer),
+    # and wait until it is registered in naming service
+    #
+
+    if ('cppContainer' in args['standalone']) | (args["gui"] == 0) :
+        myServer=ContainerCPPServer(args)
+        myServer.run()
+        if sys.platform == "win32":
+          clt.waitNS("/Containers/" + theComputer + "/FactoryServer")
+        else:
+          clt.waitNSPID("/Containers/" + theComputer + "/FactoryServer",myServer.PID)
+
+    if 'pyContainer' in args['standalone']:
+        raise Exception('Python containers no longer supported')
+
+    #
+    # Wait until Session Server is registered in naming service
+    #
+
+    if args["gui"]:
+##----------------
+        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)
+        args["session_object"] = session
+    end_time = os.times()
+    if verbose(): print
+    print "Start SALOME, elapsed time : %5.1f seconds"% (end_time[4]
+                                                         - init_time[4])
+
+    # ASV start GUI without Loader
+    #if args['gui']:
+    #    session.GetInterface()
+
+    #
+    # additionnal external python interpreters
+    #
+    nbaddi=0
+
+    try:
+        if 'interp' in args:
+            nbaddi = args['interp']
+    except:
+        import traceback
+        traceback.print_exc()
+        print "-------------------------------------------------------------"
+        print "-- to get an external python interpreter:runSalome --interp=1"
+        print "-------------------------------------------------------------"
+
+    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 (python interpreter in interactive mode)
+    if args['pinter']:
+        os.environ["PYTHONINSPECT"]="1"
+        try:
+            import readline
+        except ImportError:
+            pass
+
+    return clt
 
-         #
-         # Attente de la disponibilité du Container Python local dans le Naming Service
-         #
-       
-         clt.waitNS("/Containers/" + theComputer + "/FactoryServerPy")
+# -----------------------------------------------------------------------------
 
-  if with_container_superv:
+def useSalome(args, modules_list, modules_root_dir):
+    """
+    Launch all SALOME servers requested by args,
+    save list of process, give info to user,
+    show registered objects in Naming Service.
+    """
+    global process_id
+
+    clt=None
+    try:
+        clt = startSalome(args, modules_list, modules_root_dir)
+    except:
+        import traceback
+        traceback.print_exc()
+        print
+        print
+        print "--- Error during Salome launch ---"
+
+    #print process_id
+
+    from addToKillList import addToKillList
+    from killSalomeWithPort import getPiDict
+
+    filedict = getPiDict(args['port'])
+    for pid, cmd in process_id.items():
+        addToKillList(pid, cmd, args['port'])
+        pass
+
+    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
+    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
+      killAllPorts()       --> kill all sessions
+
+    runSalome, with --killall option, starts with killing
+    the processes resulting from the previous execution.
+    """%filedict
+
+    #
+    #  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
+                def func(s):
+                    del s
+                import atexit
+                atexit.register(func, __utils__(args['port']))
+                pass
+            pass
+
+        # run python scripts, passed as command line arguments
+        toimport = []
+        if args.has_key('gui') and args.has_key('session_gui'):
+            if not args['gui'] or not args['session_gui']:
+                if args.has_key('study_hdf'):
+                    toopen = args['study_hdf']
+                    if toopen:
+                        import salome
+                        salome.salome_init(toopen)
+                if args.has_key('pyscript'):
+                    toimport = args['pyscript']
+        from salomeContextUtils import formatScriptsAndArgs
+        command = formatScriptsAndArgs(toimport)
+        if command:
+            proc = subprocess.Popen(command, shell=True)
+            addToKillList(proc.pid, command, args['port'])
+            res = proc.wait()
+            if res: sys.exit(1) # if there's an error when executing script, we should explicitly exit
+
+    return clt
+
+def execScript(script_path):
+    print 'executing', script_path
+    sys.path.insert(0, os.path.realpath(os.path.dirname(script_path)))
+    execfile(script_path,globals())
+    del sys.path[0]
 
-       #
-       # Lancement Container Supervision local
-       #
+# -----------------------------------------------------------------------------
 
-       ContainerSUPERVServer().run()
+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.
+    """
+    from salome_utils import getTmpDir
+    fileEnv = getTmpDir()
+    from salome_utils import getUserName
+    fileEnv += getUserName() + "_" + str(args['port']) \
+            + '_' + args['appname'].upper() + '_env'
+    fenv=open(fileEnv,'w')
+    pickle.dump((args, modules_list, modules_root_dir),fenv)
+    fenv.close()
+    os.environ["SALOME_LAUNCH_CONFIG"] = fileEnv
 
-       #
-       # Attente de la disponibilité du Container Supervision local dans le Naming Service
-       #
+# -----------------------------------------------------------------------------
 
-       clt.waitNS("/Containers/" + theComputer + "/SuperVisionContainer")
+def no_main():
+    """Salome Launch, when embedded in other application"""
+    fileEnv = os.environ["SALOME_LAUNCH_CONFIG"]
+    fenv=open(fileEnv,'r')
+    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
 
+# -----------------------------------------------------------------------------
 
-  #
-  # Activation du GUI de Session Server
-  #
-       
-  #session.GetInterface()
+def main():
+    """Salome launch as a main application"""
+
+    # define folder to store omniorb config (initially in virtual application folder)
+    try:
+        from salomeContextUtils import setOmniOrbUserPath
+        setOmniOrbUserPath()
+    except Exception, e:
+        print e
+        sys.exit(1)
+
+    from salome_utils import getHostName
+    args, modules_list, modules_root_dir = setenv.get_config()
+    print "runSalome running on %s" % getHostName()
+
+    kill_salome(args)
+    save_config = True
+    if args.has_key('save_config'):
+        save_config = args['save_config']
+    # --
+    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
 
-  end_time = os.times()
-  print
-  print "Start SALOME, elpased time : %5.1f seconds"% (end_time[4] - init_time[4])
+# -----------------------------------------------------------------------------
 
-  return clt
+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__":
-   clt=None
-   try:
-      clt = startSalome()
-   except:
-      print
-      print
-      print "--- erreur au lancement Salome ---"
-   
-   #print process_id
-   
-   
-   filedict='/tmp/'+os.getenv('USER')+'_SALOME_pidict'
-   #filedict='/tmp/'+os.getlogin()+'_SALOME_pidict'
-   
-   fpid=open(filedict, 'w')
-   pickle.dump(process_id,fpid)
-   fpid.close()
-   
-   print
-   print "Sauvegarde du dictionnaire des process dans ", filedict
-   print "Pour tuer les process SALOME, executer : python killSalome.py depuis"
-   print "une console, ou bien killSalome() depuis le present interpreteur,"
-   print "s'il n'est pas fermé."
-   print
-   print "runSalome, avec l'option --killall, commence par tuer les process restants d'une execution précédente."
-   print
-   print "Pour lancer uniquement le GUI, executer startGUI() depuis le present interpreteur,"
-   print "s'il n'est pas fermé."
-   
-   #
-   #  Impression arborescence Naming Service
-   #
-   
-   if clt != None:
-     print
-     print " --- registered objects tree in Naming Service ---"
-     clt.showNS()
-   
+    runSalome()
+#