@@ -325,37 +325,40 @@ def __init__(self, RequestHandlerClass, listen_fd=None,
325
325
file_only = False ,
326
326
run_once = False , timeout = 0 , idle_timeout = 0 , traffic = False ,
327
327
tcp_keepalive = True , tcp_keepcnt = None , tcp_keepidle = None ,
328
- tcp_keepintvl = None , ssl_ciphers = None , ssl_options = 0 ):
328
+ tcp_keepintvl = None , ssl_ciphers = None , ssl_options = 0 ,
329
+ unix_listen = None , unix_listen_mode = None ):
329
330
330
331
# settings
331
332
self .RequestHandlerClass = RequestHandlerClass
332
- self .verbose = verbose
333
- self .listen_fd = listen_fd
334
- self .listen_host = listen_host
335
- self .listen_port = listen_port
336
- self .prefer_ipv6 = source_is_ipv6
337
- self .ssl_only = ssl_only
338
- self .ssl_ciphers = ssl_ciphers
339
- self .ssl_options = ssl_options
340
- self .verify_client = verify_client
341
- self .daemon = daemon
342
- self .run_once = run_once
343
- self .timeout = timeout
344
- self .idle_timeout = idle_timeout
345
- self .traffic = traffic
346
- self .file_only = file_only
347
- self .web_auth = web_auth
348
-
349
- self .launch_time = time .time ()
350
- self .ws_connection = False
351
- self .handler_id = 1
352
- self .terminating = False
353
-
354
- self .logger = self .get_logger ()
355
- self .tcp_keepalive = tcp_keepalive
356
- self .tcp_keepcnt = tcp_keepcnt
357
- self .tcp_keepidle = tcp_keepidle
358
- self .tcp_keepintvl = tcp_keepintvl
333
+ self .verbose = verbose
334
+ self .listen_fd = listen_fd
335
+ self .unix_listen = unix_listen
336
+ self .unix_listen_mode = unix_listen_mode
337
+ self .listen_host = listen_host
338
+ self .listen_port = listen_port
339
+ self .prefer_ipv6 = source_is_ipv6
340
+ self .ssl_only = ssl_only
341
+ self .ssl_ciphers = ssl_ciphers
342
+ self .ssl_options = ssl_options
343
+ self .verify_client = verify_client
344
+ self .daemon = daemon
345
+ self .run_once = run_once
346
+ self .timeout = timeout
347
+ self .idle_timeout = idle_timeout
348
+ self .traffic = traffic
349
+ self .file_only = file_only
350
+ self .web_auth = web_auth
351
+
352
+ self .launch_time = time .time ()
353
+ self .ws_connection = False
354
+ self .handler_id = 1
355
+ self .terminating = False
356
+
357
+ self .logger = self .get_logger ()
358
+ self .tcp_keepalive = tcp_keepalive
359
+ self .tcp_keepcnt = tcp_keepcnt
360
+ self .tcp_keepidle = tcp_keepidle
361
+ self .tcp_keepintvl = tcp_keepintvl
359
362
360
363
# keyfile path must be None if not specified
361
364
self .key = None
@@ -387,6 +390,8 @@ def __init__(self, RequestHandlerClass, listen_fd=None,
387
390
self .msg ("WebSocket server settings:" )
388
391
if self .listen_fd != None :
389
392
self .msg (" - Listen for inetd connections" )
393
+ elif self .unix_listen != None :
394
+ self .msg (" - Listen on unix socket %s" , self .unix_listen )
390
395
else :
391
396
self .msg (" - Listen on %s:%s" ,
392
397
self .listen_host , self .listen_port )
@@ -421,8 +426,9 @@ def get_logger():
421
426
422
427
@staticmethod
423
428
def socket (host , port = None , connect = False , prefer_ipv6 = False ,
424
- unix_socket = None , use_ssl = False , tcp_keepalive = True ,
425
- tcp_keepcnt = None , tcp_keepidle = None , tcp_keepintvl = None ):
429
+ unix_socket = None , unix_socket_mode = None , unix_socket_listen = False ,
430
+ use_ssl = False , tcp_keepalive = True , tcp_keepcnt = None ,
431
+ tcp_keepidle = None , tcp_keepintvl = None ):
426
432
""" Resolve a host (and optional port) to an IPv4 or IPv6
427
433
address. Create a socket. Bind to it if listen is set,
428
434
otherwise connect to it. Return the socket.
@@ -470,8 +476,22 @@ def socket(host, port=None, connect=False, prefer_ipv6=False,
470
476
sock .bind (addrs [0 ][4 ])
471
477
sock .listen (100 )
472
478
else :
473
- sock = socket .socket (socket .AF_UNIX , socket .SOCK_STREAM )
474
- sock .connect (unix_socket )
479
+ if unix_socket_listen :
480
+ # Make sure the socket does not already exist
481
+ try :
482
+ os .unlink (unix_socket )
483
+ except FileNotFoundError :
484
+ pass
485
+ sock = socket .socket (socket .AF_UNIX , socket .SOCK_STREAM )
486
+ oldmask = os .umask (0o777 ^ unix_socket_mode )
487
+ try :
488
+ sock .bind (unix_socket )
489
+ finally :
490
+ os .umask (oldmask )
491
+ sock .listen (100 )
492
+ else :
493
+ sock = socket .socket (socket .AF_UNIX , socket .SOCK_STREAM )
494
+ sock .connect (unix_socket )
475
495
476
496
return sock
477
497
@@ -700,6 +720,11 @@ def start_server(self):
700
720
701
721
if self .listen_fd != None :
702
722
lsock = socket .fromfd (self .listen_fd , socket .AF_INET , socket .SOCK_STREAM )
723
+ elif self .unix_listen != None :
724
+ lsock = self .socket (host = None ,
725
+ unix_socket = self .unix_listen ,
726
+ unix_socket_mode = self .unix_listen_mode ,
727
+ unix_socket_listen = True )
703
728
else :
704
729
lsock = self .socket (self .listen_host , self .listen_port , False ,
705
730
self .prefer_ipv6 ,
@@ -766,6 +791,9 @@ def start_server(self):
766
791
ready = select .select ([lsock ], [], [], 1 )[0 ]
767
792
if lsock in ready :
768
793
startsock , address = lsock .accept ()
794
+ # Unix Socket will not report address (empty string), but address[0] is logged a bunch
795
+ if self .unix_listen != None :
796
+ address = [ self .unix_listen ]
769
797
else :
770
798
continue
771
799
except self .Terminate :
0 commit comments