comparison env/lib/python3.7/site-packages/galaxy/util/sockets.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:26e78fe6e8c4
1 import random
2 import shlex
3 import socket
4 import subprocess
5
6
7 def unused_port(range=None):
8 if range:
9 return __unused_port_on_range(range)
10 else:
11 return __unused_port_rangeless()
12
13
14 def __unused_port_rangeless():
15 # TODO: Allow ranges (though then need to guess and check)...
16 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
17 s.bind(('localhost', 0))
18 addr, port = s.getsockname()
19 s.close()
20 return port
21
22
23 def __unused_port_on_range(range):
24 assert range[0] and range[1]
25
26 # Find all ports that are already occupied
27 cmd_netstat = shlex.split("netstat tuln")
28 p1 = subprocess.Popen(cmd_netstat, stdout=subprocess.PIPE)
29
30 occupied_ports = set()
31 for line in p1.stdout.read().split('\n'):
32 if line.startswith('tcp') or line.startswith('tcp6'):
33 col = line.split()
34 local_address = col[3]
35 local_port = local_address.split(':')[1]
36 occupied_ports.add(int(local_port))
37
38 # Generate random free port number.
39 while True:
40 port = random.randrange(range[0], range[1])
41 if port not in occupied_ports:
42 break
43 return port