X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=bin%2FsearchFreePort.py;h=85eee9bbb74918f6e87f387c107ab4b80ad18629;hb=2dd308e0979e7af5e505bb076772161eae76b9a4;hp=07540095d5289eda6b396edc0a7e87ae36ff661c;hpb=309d4eee23b39959d125501a57691a0d8d235dec;p=modules%2Fkernel.git diff --git a/bin/searchFreePort.py b/bin/searchFreePort.py old mode 100644 new mode 100755 index 07540095d..85eee9bbb --- a/bin/searchFreePort.py +++ b/bin/searchFreePort.py @@ -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 @@ -22,106 +22,110 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -def searchFreePort(args={}, save_config=1, use_port=None): - """ - Search free port for SALOME session. - Returns first found free port number. - """ - import sys, os, re, shutil - - # :NOTE: Under windows: - # netstat options -l and -t are unavailable - # grep command is unavailable - - from subprocess import Popen, PIPE - (stdout, stderr) = Popen(['netstat','-an'], stdout=PIPE).communicate() - import StringIO - buf = StringIO.StringIO(stdout) - ports = buf.readlines() +import os +import sys +def __setup_config(nsport, args, save_config): # - def portIsUsed(port, data): - regObj = re.compile( ".*tcp.*:([0-9]+).*:.*listen", re.IGNORECASE ); - for item in data: - try: - p = int(regObj.match(item).group(1)) - if p == port: return True - pass - except: + from salome_utils import generateFileName, getHostName + hostname = getHostName() + # + omniorbUserPath = os.getenv("OMNIORB_USER_PATH") + kwargs={} + if omniorbUserPath is not None: + kwargs["with_username"]=True + # + from ORBConfigFile import writeORBConfigFile + omniorb_config, giopsize = writeORBConfigFile(omniorbUserPath, hostname, nsport, kwargs) + args['port'] = os.environ['NSPORT'] + # + if save_config: + last_running_config = generateFileName(omniorbUserPath, prefix="omniORB", + suffix="last", + extension="cfg", + hidden=True, + **kwargs) + os.environ['LAST_RUNNING_CONFIG'] = last_running_config + try: + if sys.platform == "win32": + import shutil + shutil.copyfile(omniorb_config, last_running_config) + else: + try: + if os.access(last_running_config, os.F_OK): + os.remove(last_running_config) + except OSError: + pass + os.symlink(omniorb_config, last_running_config) pass pass - return False + except: + pass # +# - def setup_config(nsport): - # - from salome_utils import generateFileName, getHostName - hostname = getHostName() - # - omniorbUserPath = os.getenv("OMNIORB_USER_PATH") - kwargs={} - if omniorbUserPath is not None: - kwargs["with_username"]=True - # - from ORBConfigFile import writeORBConfigFile - omniorb_config, giopsize = writeORBConfigFile(omniorbUserPath, hostname, nsport, kwargs) - args['port'] = os.environ['NSPORT'] - # - if save_config: - last_running_config = generateFileName(omniorbUserPath, prefix="omniORB", - suffix="last", - extension="cfg", - hidden=True, - **kwargs) - os.environ['LAST_RUNNING_CONFIG'] = last_running_config - try: - if sys.platform == "win32": - import shutil - shutil.copyfile(omniorb_config, last_running_config) - else: - try: - if os.access(last_running_config, os.F_OK): - os.remove(last_running_config) - except OSError: - pass - os.symlink(omniorb_config, last_running_config) - pass - pass - except: - pass - # +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, - if not portIsUsed(use_port, ports): - print "- OK" - setup_config(use_port) + print("Check if port can be used: %d" % use_port, end=' ') + if port == use_port and port != -1: + 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" - pass + print("- KO: port is busy") + pass # + print("Searching for a free port for naming service:", end=' ') + if port == -1: # try again + port = getPort(use_port) - print "Searching for a free port for naming service:", - # + if port != -1: + print("%s - OK"%(port)) + __setup_config(port, args, save_config) + else: + print("Unable to obtain port") - NSPORT=2810 - limit=NSPORT+100 - # + queue.put([os.environ['OMNIORB_CONFIG'], + os.environ['NSPORT'], + os.environ['NSHOST']]) +# - while 1: - if not portIsUsed(NSPORT, ports): - print "%s - OK"%(NSPORT) - setup_config(NSPORT) - break - print "%s"%(NSPORT), - if NSPORT == limit: - msg = "\n" - 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 - NSPORT=NSPORT+1 - pass - # +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']) +# - return +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') +#