Salome HOME
Use isinstance() instead of type() and remove useless list(....keys())
[modules/kernel.git] / bin / searchFreePort.py
old mode 100644 (file)
new mode 100755 (executable)
index bda4863..85eee9b
@@ -1,6 +1,6 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 #  -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2007-2016  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
@@ -8,7 +8,7 @@
 # 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.
+# version 2.1 of the License, or (at your option) any later version.
 #
 # This library is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -45,7 +45,7 @@ def __setup_config(nsport, args, save_config):
                                            extension="cfg",
                                            hidden=True,
                                            **kwargs)
-    #os.environ['LAST_RUNNING_CONFIG'] = last_running_config
+    os.environ['LAST_RUNNING_CONFIG'] = last_running_config
     try:
       if sys.platform == "win32":
         import shutil
@@ -64,32 +64,68 @@ def __setup_config(nsport, args, save_config):
   #
 #
 
-def searchFreePort(args={}, save_config=1, use_port=None):
-  """
-  Search free port for SALOME session.
-  Returns first found free port number.
-  """
-
+def searchFreePort_withPortManager(queue, args={}, save_config=1, use_port=None):
   from PortManager import getPort
   port = getPort(use_port)
 
   if use_port:
-    print "Check if port can be used: %d" % use_port,
+    print("Check if port can be used: %d" % use_port, end=' ')
     if port == use_port and port != -1:
-      print "- OK"
+      print("- OK")
       __setup_config(use_port, args, save_config)
+      queue.put([os.environ['OMNIORB_CONFIG'],
+                 os.environ['NSPORT'],
+                 os.environ['NSHOST']])
       return
     else:
-      print "- KO: port is busy"
+      print("- KO: port is busy")
       pass
   #
-  print "Searching for a free port for naming service:",
+  print("Searching for a free port for naming service:", end=' ')
   if port == -1: # try again
     port = getPort(use_port)
 
   if port != -1:
-    print "%s - OK"%(port)
+    print("%s - OK"%(port))
     __setup_config(port, args, save_config)
   else:
-    print "Unable to obtain port"
+    print("Unable to obtain port")
+
+  queue.put([os.environ['OMNIORB_CONFIG'],
+             os.environ['NSPORT'],
+             os.environ['NSHOST']])
+#
+
+def __savePortToFile(args):
+  # Save Naming service port name into
+  # the file args["ns_port_log_file"]
+  if 'ns_port_log_file' in args:
+    omniorbUserPath = os.getenv("OMNIORB_USER_PATH")
+    file_name = os.path.join(omniorbUserPath, args["ns_port_log_file"])
+    with open(file_name, "w") as f:
+      f.write(os.environ['NSPORT'])
+#
+
+def searchFreePort(args={}, save_config=1, use_port=None):
+  """
+  Search free port for SALOME session.
+  Returns first found free port number.
+  """
+  try:
+    import PortManager # mandatory
+    from multiprocessing import Process, Queue
+    queue = Queue()
+    p = Process(target = searchFreePort_withPortManager, args=(queue, args, save_config, use_port,))
+    p.start()
+    info = queue.get()
+
+    os.environ['OMNIORB_CONFIG'] = info[0]
+    os.environ['NSPORT'] = info[1]
+    args['port'] = os.environ['NSPORT']
+    os.environ['NSHOST'] = info[2]
+    __savePortToFile(args)
+
+    p.join() # this blocks until the process terminates
+  except ImportError:
+    raise Exception('PortManager module not found')
 #