Salome HOME
Fix problem with waiting SALOMEDS_Server:
[modules/kernel.git] / bin / PortManager.py
index 8e7a31d63056a41b705050451153fff008522239..3d7e63c401d07c7b4c996a84a34a07ab6d9520f4 100644 (file)
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 #  -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2014  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
@@ -25,14 +25,15 @@ import os
 import sys
 
 try:
-  import cPickle as pickle
+  import cPickle as pickle #@UnusedImport
 except:
-  import pickle
+  import pickle #@Reimport
 
 import logging
 def createLogger():
   logger = logging.getLogger(__name__)
 #  logger.setLevel(logging.DEBUG)
+  logger.setLevel(logging.INFO)
   ch = logging.StreamHandler()
   ch.setLevel(logging.DEBUG)
   formatter = logging.Formatter("%(levelname)s:%(threadName)s:%(message)s")
@@ -43,7 +44,7 @@ def createLogger():
 logger = createLogger()
 
 #------------------------------------
-# A file locker (Linux only)
+# A file locker
 def __acquire_lock(lock):
   if sys.platform == "win32":
     import msvcrt
@@ -61,6 +62,7 @@ def __release_lock(lock):
     import fcntl
     fcntl.flock(lock, fcntl.LOCK_UN)
 #
+#------------------------------------
 
 def _getConfigurationFilename():
   omniorbUserPath = os.getenv("OMNIORB_USER_PATH")
@@ -71,7 +73,11 @@ def _getConfigurationFilename():
                                         suffix="PortManager",
                                         extension="cfg",
                                         hidden=True)
-  lock_file = portmanager_config + "-lock"
+  import tempfile
+  temp = tempfile.NamedTemporaryFile()
+  lock_file = os.path.join(os.path.dirname(temp.name), ".omniORB_PortManager.lock")
+  temp.close()
+
   return (portmanager_config, lock_file)
 #
 
@@ -84,9 +90,12 @@ def __isNetworkConnectionActiveOnPort(port):
   #        netstat options -l and -t are unavailable
   #        grep command is unavailable
   from subprocess import Popen, PIPE
-  (stdout, stderr) = Popen(['netstat','-an'], stdout=PIPE).communicate()
+  if sys.platform == "win32":
+    out, _ = Popen(['netstat','-a','-n','-p tcp'], stdout=PIPE).communicate()
+  else:
+    out, _ = Popen(['netstat','-ant'], stdout=PIPE).communicate()
   import StringIO
-  buf = StringIO.StringIO(stdout)
+  buf = StringIO.StringIO(out)
   ports = buf.readlines()
   # search for TCP - LISTEN connections
   import re
@@ -97,12 +106,14 @@ def __isNetworkConnectionActiveOnPort(port):
       if p == port: return True
     except:
       pass
+  return False
 #
 
 def getPort(preferedPort=None):
   logger.debug("GET PORT")
 
   config_file, lock_file = _getConfigurationFilename()
+  oldmask = os.umask(0)
   with open(lock_file, 'w') as lock:
     # acquire lock
     __acquire_lock(lock)
@@ -113,8 +124,9 @@ def getPort(preferedPort=None):
     try:
       with open(config_file, 'r') as f:
         config = pickle.load(f)
-    except IOError: # empty file
-      pass
+    except:
+      logger.info("Problem loading PortManager file: %s"%config_file)
+      # In this case config dictionary is reset
 
     logger.debug("load busy_ports: %s"%str(config["busy_ports"]))
 
@@ -129,6 +141,9 @@ def getPort(preferedPort=None):
           msg += "Can't find a free port to launch omniNames\n"
           msg += "Try to kill the running servers and then launch SALOME again.\n"
           raise RuntimeError, msg
+        logger.debug("Port %s seems to be busy"%str(port))
+        if not port in config["busy_ports"]:
+          config["busy_ports"].append(port)
         port = port + 1
     logger.debug("found free port: %s"%str(port))
     config["busy_ports"].append(port)
@@ -143,9 +158,11 @@ def getPort(preferedPort=None):
 
     # release lock
     __release_lock(lock)
+  #
 
-    logger.debug("get port: %s"%str(port))
-    return port
+  os.umask(oldmask)
+  logger.debug("get port: %s"%str(port))
+  return port
 #
 
 def releasePort(port):
@@ -153,6 +170,7 @@ def releasePort(port):
   logger.debug("RELEASE PORT (%s)"%port)
 
   config_file, lock_file = _getConfigurationFilename()
+  oldmask = os.umask(0)
   with open(lock_file, 'w') as lock:
     # acquire lock
     __acquire_lock(lock)
@@ -187,10 +205,14 @@ def releasePort(port):
     __release_lock(lock)
 
     logger.debug("released port port: %s"%str(port))
+
+  os.umask(oldmask)
 #
 
 def getBusyPorts():
+  busy_ports = []
   config_file, lock_file = _getConfigurationFilename()
+  oldmask = os.umask(0)
   with open(lock_file, 'w') as lock:
     # acquire lock
     __acquire_lock(lock)
@@ -210,5 +232,6 @@ def getBusyPorts():
     # release lock
     __release_lock(lock)
 
-    return busy_ports
+  os.umask(oldmask)
+  return busy_ports
 #