def run(config_filename, passphrases): log.info("Running with pid %i", os.getpid()) # Start our worker pool now, before we create our sockets for the web app # otherwise the workers inherit the file descriptors for the http(s) # socket and we have problems shutting down cleanly global _sha1sum_worker_pool if not _sha1sum_worker_pool: _sha1sum_worker_pool = multiprocessing.Pool(None, init_worker) app = None listener = None server = None backdoor = None handler = None backdoor_state = {} while True: log.info("Loading configuration") config = load_config(config_filename) if not app: app = SigningServer(config, passphrases) else: app.load_config(config) listen_addr = (config.get('server', 'listen'), config.getint('server', 'port')) if not listener or listen_addr != listener.getsockname(): if listener and server: log.info( "Listening address has changed, stopping old wsgi server") log.debug("Old address: %s", listener.getsockname()) log.debug("New address: %s", listen_addr) server.stop() listener = gevent.socket.socket() listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) listener.bind(listen_addr) listener.listen(256) server = create_server(app, listener, config) backdoor_state['server'] = server backdoor_state['app'] = app if config.has_option('server', 'backdoor_port'): backdoor_port = config.getint('server', 'backdoor_port') if not backdoor or backdoor.server_port != backdoor_port: if backdoor: log.info("Stopping old backdoor on port %i", backdoor.server_port) backdoor.stop() log.info("Starting backdoor on port %i", backdoor_port) backdoor = gevent.backdoor.BackdoorServer( ('127.0.0.1', backdoor_port), locals=backdoor_state) gevent.spawn(backdoor.serve_forever) # Handle SIGHUP # Create an event to wait on # Our SIGHUP handler will set the event, allowing us to continue sighup_event = Event() h = gevent.signal(signal.SIGHUP, lambda e: e.set(), sighup_event) if handler: # Cancel our old handler handler.cancel() handler = h log.info("Serving on %s", repr(server)) try: gevent.spawn(server.serve_forever) # Wait for SIGHUP sighup_event.wait() except KeyboardInterrupt: break log.info("pid %i exiting normally", os.getpid())
def run(config_filename, passphrases): log.info("Running with pid %i", os.getpid()) # Start our worker pool now, before we create our sockets for the web app # otherwise the workers inherit the file descriptors for the http(s) # socket and we have problems shutting down cleanly global _sha1sum_worker_pool if not _sha1sum_worker_pool: _sha1sum_worker_pool = multiprocessing.Pool(None, init_worker) app = None listener = None server = None backdoor = None handler = None backdoor_state = {} while True: log.info("Loading configuration") config = load_config(config_filename) if not app: app = SigningServer(config, passphrases) else: app.load_config(config) listen_addr = ( config.get('server', 'listen'), config.getint('server', 'port')) if not listener or listen_addr != listener.getsockname(): if listener and server: log.info( "Listening address has changed, stopping old wsgi server") log.debug("Old address: %s", listener.getsockname()) log.debug("New address: %s", listen_addr) server.stop() listener = gevent.socket.socket() listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) listener.bind(listen_addr) listener.listen(256) server = create_server(app, listener, config) backdoor_state['server'] = server backdoor_state['app'] = app if config.has_option('server', 'backdoor_port'): backdoor_port = config.getint('server', 'backdoor_port') if not backdoor or backdoor.server_port != backdoor_port: if backdoor: log.info("Stopping old backdoor on port %i", backdoor.server_port) backdoor.stop() log.info("Starting backdoor on port %i", backdoor_port) backdoor = gevent.backdoor.BackdoorServer( ('127.0.0.1', backdoor_port), locals=backdoor_state) gevent.spawn(backdoor.serve_forever) # Handle SIGHUP # Create an event to wait on # Our SIGHUP handler will set the event, allowing us to continue sighup_event = Event() h = gevent.signal(signal.SIGHUP, lambda e: e.set(), sighup_event) if handler: # Cancel our old handler handler.cancel() handler = h log.info("Serving on %s", repr(server)) try: gevent.spawn(server.serve_forever) # Wait for SIGHUP sighup_event.wait() except KeyboardInterrupt: break log.info("pid %i exiting normally", os.getpid())