1
1
import argparse
2
+ import errno
2
3
import logging
3
4
import os .path
4
5
import threading
@@ -29,7 +30,7 @@ def main():
29
30
'--key' , nargs = 1 , default = [None ], type = str , help = "SSL key file" )
30
31
parser .add_argument (
31
32
'-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' )
33
34
parser .add_argument (
34
35
'filename' , nargs = '?' , type = str , help = 'initial file to load' )
35
36
parser .add_argument (
@@ -39,7 +40,8 @@ def main():
39
40
default = 'nengo' , type = str , help = 'default backend to use' )
40
41
parser .add_argument ('--browser' , dest = 'browser' , action = 'store_true' )
41
42
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 ,
43
45
help = "Time limit before automatic shutdown. Set to 0 to deactivate." ,
44
46
default = [2 ])
45
47
parser .set_defaults (browser = True )
@@ -50,20 +52,26 @@ def main():
50
52
else :
51
53
logging .basicConfig ()
52
54
55
+ if args .port is None :
56
+ port = 8080
57
+ else :
58
+ port = args .port
59
+
53
60
if args .password :
54
61
if args .password is True :
55
62
password = hashpw (prompt_pw (), gensalt ())
56
63
else :
57
64
password = hashpw (args .password , gensalt ())
58
65
server_settings = GuiServerSettings (
59
- ('' , 8080 ), args .auto_shutdown [0 ], password_hash = password ,
66
+ ('' , port ), args .auto_shutdown [0 ], password_hash = password ,
60
67
ssl_cert = args .cert [0 ], ssl_key = args .key [0 ])
61
68
if not server_settings .use_ssl :
62
69
raise ValueError ("Password protection only allowed with SSL." )
63
70
else :
64
71
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 ],
66
73
ssl_key = args .key [0 ])
74
+ host = server_settings .listen_addr [0 ]
67
75
68
76
try :
69
77
if args .filename is None :
@@ -72,9 +80,21 @@ def main():
72
80
else :
73
81
filename = args .filename
74
82
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
+
78
98
s .server .auto_shutdown = args .auto_shutdown [0 ]
79
99
80
100
if args .browser :
@@ -90,5 +110,6 @@ def main():
90
110
finally :
91
111
logging .shutdown ()
92
112
113
+
93
114
if __name__ == '__main__' :
94
115
main ()
0 commit comments