1
0
Fork 0
mirror of https://github.com/Kozea/Radicale.git synced 2025-07-23 17:48:30 +00:00

Clean IPv6 support

This commit is contained in:
Guillaume Ayoub 2011-04-02 21:45:45 +02:00
parent d577661767
commit 9bab3cde5d
4 changed files with 48 additions and 61 deletions

View file

@ -38,7 +38,8 @@ arguments.
import os
import sys
import optparse
import threading, signal
import signal
import threading
import radicale
@ -56,13 +57,9 @@ parser.add_option(
"-f", "--foreground", action="store_false", dest="daemon",
help="launch in foreground (opposite of --daemon)")
parser.add_option(
"-H", "--host",
default=radicale.config.get("server", "host"),
help="set server hostname")
parser.add_option(
"-p", "--port", type="int",
default=radicale.config.getint("server", "port"),
help="set server port")
"-H", "--hosts",
default=radicale.config.get("server", "hosts"),
help="set server hostnames")
parser.add_option(
"-s", "--ssl", action="store_true",
default=radicale.config.getboolean("server", "ssl"),
@ -98,42 +95,36 @@ if options.daemon:
sys.exit()
sys.stdout = sys.stderr = open(os.devnull, "w")
def exit (servers):
"""Cleanly shutdown all servers.
Might be called multiple times."""
for s in servers:
s.shutdown()
# Launch calendar server
server_class = radicale.HTTPSServer if options.ssl else radicale.HTTPServer
# Launch calendar servers
servers = []
threads = []
server_class = radicale.HTTPSServer if options.ssl else radicale.HTTPServer
for host in (x.strip() for x in options.host.split(',')):
def exit():
"""Cleanly shutdown servers."""
while servers:
servers.pop().shutdown()
def serve_forever(server):
"""Serve a server forever with no traceback on keyboard interrupts."""
try:
server = server_class(
(host, options.port), radicale.CalendarHTTPHandler)
servers.append(server)
t = threading.Thread(target = server.serve_forever)
threads.append(t)
t.start()
except:
exit(servers)
raise
server.serve_forever()
except KeyboardInterrupt:
# No unwanted traceback
pass
finally:
exit()
# clean exit on SIGTERM
signal.signal(signal.SIGTERM, lambda *a: exit(servers))
# Clean exit on SIGTERM
signal.signal(signal.SIGTERM, lambda *_: exit())
try:
while threads:
threads[0].join(1) # try one second
if threading.active_count() <= len(threads):
# at least one thread died -- exit all
break
except KeyboardInterrupt:
# no unwanted traceback :)
pass
finally:
exit(servers)
for host in options.hosts.split(','):
address, port = host.strip().rsplit(':', 1)
address, port = address.strip('[] '), int(port)
servers.append(server_class((address, port), radicale.CalendarHTTPHandler))
for server in servers[:-1]:
# More servers to come, launch a new thread
threading.Thread(target=serve_forever, args=(server,)).start()
# Last server, no more thread
serve_forever(servers[-1])