2 # -*- coding: iso-8859-1 -*-
3 # Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
5 # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
6 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
8 # This library is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU Lesser General Public
10 # License as published by the Free Software Foundation; either
11 # version 2.1 of the License, or (at your option) any later version.
13 # This library is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 # Lesser General Public License for more details.
18 # You should have received a copy of the GNU Lesser General Public
19 # License along with this library; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
28 import cPickle as pickle #@UnusedImport
30 import pickle #@Reimport
34 logger = logging.getLogger(__name__)
35 # logger.setLevel(logging.DEBUG)
36 logger.setLevel(logging.INFO)
37 ch = logging.StreamHandler()
38 ch.setLevel(logging.DEBUG)
39 formatter = logging.Formatter("%(levelname)s:%(threadName)s:%(message)s")
40 ch.setFormatter(formatter)
44 logger = createLogger()
46 #------------------------------------
47 # A file locker (Linux only)
48 def __acquire_lock(lock):
49 if sys.platform == "win32":
51 # lock 1 byte: file is supposed to be zero-byte long
52 msvcrt.locking(lock.fileno(), msvcrt.LK_LOCK, 1)
55 fcntl.flock(lock, fcntl.LOCK_EX)
57 def __release_lock(lock):
58 if sys.platform == "win32":
60 msvcrt.locking(lock.fileno(), msvcrt.LK_UNLCK, 1)
63 fcntl.flock(lock, fcntl.LOCK_UN)
66 def _getConfigurationFilename():
67 omniorbUserPath = os.getenv("OMNIORB_USER_PATH")
69 from salome_utils import generateFileName
70 portmanager_config = generateFileName(omniorbUserPath,
76 temp = tempfile.NamedTemporaryFile()
77 lock_file = os.path.join(os.path.dirname(temp.name), ".omniORB_PortManager.lock")
80 return (portmanager_config, lock_file)
83 def __isPortUsed(port, busy_ports):
84 return (port in busy_ports) or __isNetworkConnectionActiveOnPort(port)
87 def __isNetworkConnectionActiveOnPort(port):
88 # :NOTE: Under windows:
89 # netstat options -l and -t are unavailable
90 # grep command is unavailable
91 from subprocess import Popen, PIPE
92 if sys.platform == "win32":
93 stdout, _ = Popen(['netstat','-a','-n','-p tcp'], stdout=PIPE).communicate()
95 stdout, _ = Popen(['netstat','-ant'], stdout=PIPE).communicate()
97 buf = StringIO.StringIO(stdout)
98 ports = buf.readlines()
99 # search for TCP - LISTEN connections
101 regObj = re.compile( ".*tcp.*:([0-9]+).*:.*listen", re.IGNORECASE );
104 p = int(regObj.match(item).group(1))
105 if p == port: return True
111 def getPort(preferedPort=None):
112 logger.debug("GET PORT")
114 config_file, lock_file = _getConfigurationFilename()
115 oldmask = os.umask(0)
116 with open(lock_file, 'w') as lock:
121 config = {'busy_ports':[]}
122 logger.debug("read configuration file")
124 with open(config_file, 'r') as f:
125 config = pickle.load(f)
127 logger.info("Problem loading PortManager file: %s"%config_file)
128 # In this case config dictionary is reset
130 logger.debug("load busy_ports: %s"%str(config["busy_ports"]))
133 busy_ports = config["busy_ports"]
135 if not port or __isPortUsed(port, busy_ports):
137 while __isPortUsed(port, busy_ports):
140 msg += "Can't find a free port to launch omniNames\n"
141 msg += "Try to kill the running servers and then launch SALOME again.\n"
142 raise RuntimeError, msg
143 logger.debug("Port %s seems to be busy"%str(port))
144 if not port in config["busy_ports"]:
145 config["busy_ports"].append(port)
147 logger.debug("found free port: %s"%str(port))
148 config["busy_ports"].append(port)
151 logger.debug("write busy_ports: %s"%str(config["busy_ports"]))
153 with open(config_file, 'w') as f:
154 pickle.dump(config, f)
163 logger.debug("get port: %s"%str(port))
167 def releasePort(port):
169 logger.debug("RELEASE PORT (%s)"%port)
171 config_file, lock_file = _getConfigurationFilename()
172 oldmask = os.umask(0)
173 with open(lock_file, 'w') as lock:
178 config = {'busy_ports':[]}
179 logger.debug("read configuration file")
181 with open(config_file, 'r') as f:
182 config = pickle.load(f)
183 except IOError: # empty file
186 logger.debug("load busy_ports: %s"%str(config["busy_ports"]))
188 # remove port from list
189 busy_ports = config["busy_ports"]
191 if port in busy_ports:
192 busy_ports.remove(port)
193 config["busy_ports"] = busy_ports
196 logger.debug("write busy_ports: %s"%str(config["busy_ports"]))
198 with open(config_file, 'w') as f:
199 pickle.dump(config, f)
206 logger.debug("released port port: %s"%str(port))
213 config_file, lock_file = _getConfigurationFilename()
214 oldmask = os.umask(0)
215 with open(lock_file, 'w') as lock:
220 config = {'busy_ports':[]}
221 logger.debug("read configuration file")
223 with open(config_file, 'r') as f:
224 config = pickle.load(f)
225 except IOError: # empty file
228 logger.debug("load busy_ports: %s"%str(config["busy_ports"]))
230 busy_ports = config["busy_ports"]