Salome HOME
bos #16706 Improve procedure that kills booked TCP port
[modules/kernel.git] / bin / runSalome.py
index c7723867677f851dfe0890930229694ccd35c675..172298f984413af787eb7b8aa69b5abac9e276ef 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 #  -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2007-2020  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
@@ -34,6 +34,7 @@ from server import process_id, Server
 import json
 import subprocess
 from salomeContextUtils import ScriptAndArgsObjectEncoder
+import platform
 
 # -----------------------------------------------------------------------------
 
@@ -41,7 +42,7 @@ from killSalome import killAllPorts
 
 def killLocalPort():
     """
-    kill servers from a previous SALOME exection, if needed,
+    kill servers from a previous SALOME execution, if needed,
     on the CORBA port given in args of runSalome
     """
 
@@ -56,7 +57,7 @@ def killLocalPort():
 
 def givenPortKill(port):
     """
-    kill servers from a previous SALOME exection, if needed,
+    kill servers from a previous SALOME execution, if needed,
     on the same CORBA port
     """
 
@@ -144,11 +145,19 @@ class CatalogServer(Server):
     def __init__(self,args):
         self.args=args
         self.initArgs()
-        self.SCMD1=['SALOME_ModuleCatalog_Server','-common']
+        self.SCMD1=['SALOME_ModuleCatalog_Server']
+        if 'launcher' in self.args:
+            pos = args['launcher'].find(":")
+            if pos != -1:
+              self.SCMD1+=['-ORBInitRef']
+              machine = args['launcher'][0:pos]
+              port = args['launcher'][pos+1:]
+              self.SCMD1+=["NameService=corbaname::" + machine + ":" + port]
+        self.SCMD1+=['-common']
         self.SCMD2=[]
-        home_dir=os.getenv('HOME')
+        home_dir=os.path.expanduser("~")
         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):
         list_modules = modules_list[:]
@@ -169,6 +178,13 @@ class SalomeDSServer(Server):
         self.args=args
         self.initArgs()
         self.CMD=['SALOMEDS_Server']
+        if 'launcher' in self.args:
+            pos = args['launcher'].find(":")
+            if pos != -1:
+              self.CMD+=['-ORBInitRef']
+              machine = args['launcher'][0:pos]
+              port = args['launcher'][pos+1:]
+              self.CMD+=["NameService=corbaname::" + machine + ":" + port]
 
 # ---
 
@@ -177,6 +193,14 @@ class ConnectionManagerServer(Server):
         self.args=args
         self.initArgs()
         self.CMD=['SALOME_ConnectionManagerServer']
+        if 'launcher' in self.args:
+            pos = args['launcher'].find(":")
+            if pos != -1:
+              self.CMD+=['-ORBInitRef']
+              machine = args['launcher'][0:pos]
+              port = args['launcher'][pos+1:]
+              self.CMD+=["NameService=corbaname::" + machine + ":" + port]
+
 
 # ---
 
@@ -185,14 +209,37 @@ class RegistryServer(Server):
         self.args=args
         self.initArgs()
         self.CMD=['SALOME_Registry_Server', '--salome_session','theSession']
+        if 'launcher' in self.args:
+            pos = args['launcher'].find(":")
+            if pos != -1:
+              self.CMD+=['-ORBInitRef']
+              machine = args['launcher'][0:pos]
+              port = args['launcher'][pos+1:]
+              self.CMD+=["NameService=corbaname::" + machine + ":" + port]
 
 # ---
 
 class ContainerCPPServer(Server):
-    def __init__(self,args):
+    def __init__(self,args,with_gui=False):
         self.args=args
         self.initArgs()
-        self.CMD=['SALOME_Container','FactoryServer']
+        self.CMD=['SALOME_Container']
+        if 'launcher' in self.args:
+            pos = args['launcher'].find(":")
+            if pos != -1:
+              self.CMD+=['-ORBInitRef']
+              machine = args['launcher'][0:pos]
+              port = args['launcher'][pos+1:]
+              self.CMD+=["NameService=corbaname::" + machine + ":" + port]
+        self.CMD+=['FactoryServer']
+        if not with_gui and self.args["valgrind_session"]:
+            l = ["valgrind"]
+            val = os.getenv("VALGRIND_OPTIONS")
+            if val:
+                l += val.split()
+                pass
+            self.CMD = l + self.CMD
+            pass
 
 # ---
 
@@ -225,15 +272,27 @@ class SessionServer(Server):
         #
         self.initArgs()
         self.SCMD1=['SALOME_Session_Server']
+        if "SQUISH_PREFIX" in os.environ:
+            if platform.system() == "Windows" :
+                self.SCMD1 = [os.path.join(os.getenv("SQUISH_PREFIX"), "bin", "dllpreload.exe"),os.path.join(os.getenv("SQUISH_SALOME_PATH"), "W64", "GUI", "bin", "salome", self.SCMD1[0])]
+            else :
+                os.environ["LD_LIBRARY_PATH"] = os.environ["SQUISH_PREFIX"] + "/lib:" + os.environ["LD_LIBRARY_PATH"]
         self.SCMD2=[]
+        if 'launcher' in self.args:
+            pos = args['launcher'].find(":")
+            if pos != -1:
+              self.SCMD1+=['-ORBInitRef']
+              machine = args['launcher'][0:pos]
+              port = args['launcher'][pos+1:]
+              self.SCMD1+=["NameService=corbaname::" + machine + ":" + port]
         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')
+            home_dir=os.path.expanduser("~")
             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','(',')']
@@ -247,13 +306,12 @@ class SessionServer(Server):
         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 'session_gui' in self.args:
-                session_gui = self.args['session_gui']
-            if session_gui:
-                self.SCMD2+=['GUI']
-                if self.args['splash']:
-                    self.SCMD2+=['SPLASH']
+            session_gui = self.args.get('session_gui', True)
+            if not session_gui:
+                self.SCMD2+=['--hide-desktop']
+            else:
+                if not self.args['splash']:
+                    self.SCMD2+=['--hide-splash']
                     pass
                 if self.args['study_hdf'] is not None:
                     self.SCMD2+=['--study-hdf=%s'%self.args['study_hdf']]
@@ -266,7 +324,7 @@ class SessionServer(Server):
                 pass
             pass
         if self.args['noexcepthandler']:
-            self.SCMD2+=['noexcepthandler']
+            self.SCMD2+=['--no-exception-handler']
         if 'user_config' in self.args:
             self.SCMD2+=['--resources=%s'%self.args['user_config']]
         if 'modules' in self.args:
@@ -346,8 +404,10 @@ class LauncherServer(Server):
                              '(','--salome_session','theSession',')']
             if 'moduleCatalog' in self.args['embedded']:
                 self.SCMD1+=['--with','ModuleCatalog','(','-common']
-                self.SCMD2+=['-personal',
-                             '${HOME}/Salome/resources/CatalogModulePersonnel.xml',')']
+                home_dir=os.path.expanduser("~")
+                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']:
@@ -420,6 +480,7 @@ def startSalome(args, modules_list, modules_root_dir):
     #
 
     clt=orbmodule.client(args)
+    addToPidict(args)
 
     #
     # Wake up session option
@@ -459,14 +520,16 @@ def startSalome(args, modules_list, modules_root_dir):
         myServer=LoggerServer(args)
         myServer.run()
         clt.waitLogger("Logger")
+        addToPidict(args)
 
     # Launch  Session Server (to show splash ASAP)
     #
 
-    if args["gui"]:
+    if args["gui"] and not args['launcher_only']:
         mySessionServ = SessionServer(args,args['modules'],modules_root_dir)
         mySessionServ.setpath(modules_list,modules_root_dir)
         mySessionServ.run()
+        addToPidict(args)
 
     #
     # Launch Registry Server,
@@ -480,6 +543,7 @@ def startSalome(args, modules_list, modules_root_dir):
           clt.waitNS("/Registry")
         else:
           clt.waitNSPID("/Registry",myServer.PID)
+        addToPidict(args)
 
     #
     # Launch Catalog Server,
@@ -495,6 +559,7 @@ def startSalome(args, modules_list, modules_root_dir):
           clt.waitNS("/Kernel/ModulCatalog",SALOME_ModuleCatalog.ModuleCatalog)
         else:
           clt.waitNSPID("/Kernel/ModulCatalog",cataServer.PID,SALOME_ModuleCatalog.ModuleCatalog)
+        addToPidict(args)
 
     #
     # Launch SalomeDS Server,
@@ -510,22 +575,25 @@ def startSalome(args, modules_list, modules_root_dir):
           clt.waitNS("/Study")
         else:
           clt.waitNSPID("/Study",myServer.PID)
+        addToPidict(args)
 
     #
     # Launch LauncherServer
     #
 
-    myCmServer = LauncherServer(args)
-    myCmServer.setpath(modules_list,modules_root_dir)
-    myCmServer.run()
+    if not 'launcher' in args:
+      myCmServer = LauncherServer(args)
+      myCmServer.setpath(modules_list,modules_root_dir)
+      myCmServer.run()
+      addToPidict(args)
 
     #
     # Launch ConnectionManagerServer
     #
 
-    myConnectionServer = ConnectionManagerServer(args)
-    myConnectionServer.run()
-
+    if not args['launcher_only']:
+      myConnectionServer = ConnectionManagerServer(args)
+      myConnectionServer.run()
 
     from Utils_Identity import getShortHostName
 
@@ -543,12 +611,13 @@ def startSalome(args, modules_list, modules_root_dir):
     #
 
     if ('cppContainer' in args['standalone']) | (args["gui"] == 0) :
-        myServer=ContainerCPPServer(args)
+        myServer=ContainerCPPServer(args, with_gui=args["gui"]!=0)
         myServer.run()
         if sys.platform == "win32":
           clt.waitNS("/Containers/" + theComputer + "/FactoryServer")
         else:
           clt.waitNSPID("/Containers/" + theComputer + "/FactoryServer",myServer.PID)
+        addToPidict(args)
 
     if 'pyContainer' in args['standalone']:
         raise Exception('Python containers no longer supported')
@@ -557,7 +626,7 @@ def startSalome(args, modules_list, modules_root_dir):
     # Wait until Session Server is registered in naming service
     #
 
-    if args["gui"]:
+    if args["gui"] and not args['launcher_only']:
 ##----------------
         import Engines
         import SALOME
@@ -579,7 +648,7 @@ def startSalome(args, modules_list, modules_root_dir):
     #    session.GetInterface()
 
     #
-    # additionnal external python interpreters
+    # additional external python interpreters
     #
     nbaddi=0
 
@@ -692,11 +761,11 @@ def useSalome(args, modules_list, modules_root_dir):
                     toopen = args['study_hdf']
                     if toopen:
                         import salome
-                        salome.salome_init(toopen)
+                        salome.salome_init(path=toopen)
                 if 'pyscript' in args:
                     toimport = args['pyscript']
         from salomeContextUtils import formatScriptsAndArgs
-        command = formatScriptsAndArgs(toimport)
+        command = formatScriptsAndArgs(toimport, escapeSpaces=True)
         if command:
             proc = subprocess.Popen(command, shell=True)
             addToKillList(proc.pid, command, args['port'])
@@ -744,6 +813,14 @@ def no_main():
 
 # -----------------------------------------------------------------------------
 
+def addToPidict(args):
+    global process_id
+    from addToKillList import addToKillList
+    for pid, cmd in list(process_id.items()):
+        addToKillList(pid, cmd, args['port'])
+
+# -----------------------------------------------------------------------------
+
 def main(exeName=None):
     """Salome launch as a main application"""
 
@@ -756,7 +833,8 @@ def main(exeName=None):
         sys.exit(1)
 
     from salome_utils import getHostName
-    args, modules_list, modules_root_dir = setenv.get_config(exeName=exeName)
+    keep_env = not os.getenv('SALOME_PLEASE_SETUP_ENVIRONMENT_AS_BEFORE')
+    args, modules_list, modules_root_dir = setenv.get_config(exeName=exeName, keepEnvironment=keep_env)
     print("runSalome running on %s" % getHostName())
 
     kill_salome(args)
@@ -768,13 +846,13 @@ def main(exeName=None):
     if args['wake_up_session']:
         test = False
         pass
-    if test:
+    if test and not 'launcher' in args:
         from searchFreePort import searchFreePort
         searchFreePort(args, save_config, args.get('useport'))
         pass
     # --
     #setenv.main()
-    setenv.set_env(args, modules_list, modules_root_dir)
+    setenv.set_env(args, modules_list, modules_root_dir, keepEnvironment=keep_env)
     clt = useSalome(args, modules_list, modules_root_dir)
     return clt,args
 
@@ -793,10 +871,12 @@ def foreGround(clt, args):
     dt = 0.1
     nbtot = 100
     nb = 0
+    session_pid = None
     while 1:
         try:
             status = session.GetStatSession()
             gui_detected = status.activeGUI
+            session_pid = session.getPID()
         except:
             pass
         if gui_detected:
@@ -816,9 +896,9 @@ def foreGround(clt, args):
     # --
     server = Server({})
     if sys.platform == "win32":
-      server.CMD = [os.getenv("PYTHONBIN"), "-m", "killSalomeWithPort", "--spy", "%s"%(os.getpid()), "%s"%(port)]
+      server.CMD = [os.getenv("PYTHONBIN"), "-m", "killSalomeWithPort", "--spy", "%s"%(session_pid or os.getpid()), "%s"%(port)]
     else:
-      server.CMD = ["killSalomeWithPort.py", "--spy", "%s"%(os.getpid()), "%s"%(port)]
+      server.CMD = ["killSalomeWithPort.py", "--spy", "%s"%(session_pid or os.getpid()), "%s"%(port)]
     server.run()
     # os.system("killSalomeWithPort.py --spy %s %s &"%(os.getpid(), port))
     # --
@@ -847,7 +927,7 @@ def runSalome():
     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
+    # The next test covers the --pinter option or if var PYTHONINSPECT is set
     # --
     test = test and not os.environ.get('PYTHONINSPECT')
     # --
@@ -860,7 +940,7 @@ def runSalome():
     except:
         pass
     # --
-    test = test and os.getenv("SALOME_TEST_MODE", "0") != "1"
+#    test = test and os.getenv("SALOME_TEST_MODE", "0") != "1"
     test = test and args['foreground']
     # --
     if test: