Mercurial > repos > guerler > springsuite
diff planemo/lib/python3.7/site-packages/galaxy/util/sockets.py @ 1:56ad4e20f292 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author | guerler |
---|---|
date | Fri, 31 Jul 2020 00:32:28 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/planemo/lib/python3.7/site-packages/galaxy/util/sockets.py Fri Jul 31 00:32:28 2020 -0400 @@ -0,0 +1,56 @@ +import random +import socket + +from galaxy.util import commands + + +def get_ip(): + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + # doesn't even have to be reachable + s.connect(('10.255.255.255', 1)) + ip = s.getsockname()[0] + except Exception: + ip = None + finally: + s.close() + return ip + + +def unused_port(range=None): + if range: + return __unused_port_on_range(range) + else: + return __unused_port_rangeless() + + +def __unused_port_rangeless(): + # TODO: Allow ranges (though then need to guess and check)... + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(('localhost', 0)) + addr, port = s.getsockname() + s.close() + return port + + +def __unused_port_on_range(range): + assert range[0] and range[1] + + # Find all ports that are already occupied + cmd_netstat = ["netstat", "tuln"] + stdout = commands.execute(cmd_netstat) + + occupied_ports = set() + for line in stdout.split('\n'): + if line.startswith('tcp') or line.startswith('tcp6'): + col = line.split() + local_address = col[3] + local_port = local_address.split(':')[1] + occupied_ports.add(int(local_port)) + + # Generate random free port number. + while True: + port = random.randrange(range[0], range[1]) + if port not in occupied_ports: + break + return port