Skip to content

Commit 2f9d9e7

Browse files
jgosmanntcstewar
authored andcommitted
Fix port selection.
1 parent 684c534 commit 2f9d9e7

File tree

1 file changed

+28
-7
lines changed

1 file changed

+28
-7
lines changed

nengo_gui/main.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import argparse
2+
import errno
23
import logging
34
import os.path
45
import threading
@@ -29,7 +30,7 @@ def main():
2930
'--key', nargs=1, default=[None], type=str, help="SSL key file")
3031
parser.add_argument(
3132
'-P', '--port', dest='port', metavar='PORT',
32-
default=8080, type=int, help='port to run server on')
33+
type=int, help='port to run server on')
3334
parser.add_argument(
3435
'filename', nargs='?', type=str, help='initial file to load')
3536
parser.add_argument(
@@ -39,7 +40,8 @@ def main():
3940
default='nengo', type=str, help='default backend to use')
4041
parser.add_argument('--browser', dest='browser', action='store_true')
4142
parser.add_argument('--no-browser', dest='browser', action='store_false')
42-
parser.add_argument('--auto-shutdown', nargs=1, type=float,
43+
parser.add_argument(
44+
'--auto-shutdown', nargs=1, type=float,
4345
help="Time limit before automatic shutdown. Set to 0 to deactivate.",
4446
default=[2])
4547
parser.set_defaults(browser=True)
@@ -50,20 +52,26 @@ def main():
5052
else:
5153
logging.basicConfig()
5254

55+
if args.port is None:
56+
port = 8080
57+
else:
58+
port = args.port
59+
5360
if args.password:
5461
if args.password is True:
5562
password = hashpw(prompt_pw(), gensalt())
5663
else:
5764
password = hashpw(args.password, gensalt())
5865
server_settings = GuiServerSettings(
59-
('', 8080), args.auto_shutdown[0], password_hash=password,
66+
('', port), args.auto_shutdown[0], password_hash=password,
6067
ssl_cert=args.cert[0], ssl_key=args.key[0])
6168
if not server_settings.use_ssl:
6269
raise ValueError("Password protection only allowed with SSL.")
6370
else:
6471
server_settings = GuiServerSettings(
65-
('localhost', 8080), args.auto_shutdown[0], ssl_cert=args.cert[0],
72+
('localhost', port), args.auto_shutdown[0], ssl_cert=args.cert[0],
6673
ssl_key=args.key[0])
74+
host = server_settings.listen_addr[0]
6775

6876
try:
6977
if args.filename is None:
@@ -72,9 +80,21 @@ def main():
7280
else:
7381
filename = args.filename
7482
page_settings = nengo_gui.page.PageSettings(backend=args.backend)
75-
s = nengo_gui.gui.InteractiveGUI(
76-
ModelContext(filename=filename), server_settings,
77-
page_settings=page_settings)
83+
s = None
84+
while s is None:
85+
try:
86+
s = nengo_gui.gui.InteractiveGUI(
87+
ModelContext(filename=filename), server_settings,
88+
page_settings=page_settings)
89+
except EnvironmentError as err:
90+
if args.port is None and err.errno == errno.EADDRINUSE:
91+
port += 1
92+
if port > 0xFFFF:
93+
raise
94+
server_settings.listen_addr = (host, port)
95+
else:
96+
raise
97+
7898
s.server.auto_shutdown = args.auto_shutdown[0]
7999

80100
if args.browser:
@@ -90,5 +110,6 @@ def main():
90110
finally:
91111
logging.shutdown()
92112

113+
93114
if __name__ == '__main__':
94115
main()

0 commit comments

Comments
 (0)