diff options
Diffstat (limited to 'rpkid')
-rw-r--r-- | rpkid/rpki/async.py | 49 | ||||
-rw-r--r-- | rpkid/rpki/https.py | 9 |
2 files changed, 35 insertions, 23 deletions
diff --git a/rpkid/rpki/async.py b/rpkid/rpki/async.py index 2f1db268..79bfbcf2 100644 --- a/rpkid/rpki/async.py +++ b/rpkid/rpki/async.py @@ -274,28 +274,35 @@ def event_loop(catch_signals = (signal.SIGINT, signal.SIGTERM)): """ Replacement for asyncore.loop(), adding timer and signal support. """ - old_signal_handlers = {} - try: - for sig in catch_signals: - old_signal_handlers[sig] = signal.signal(sig, _raiseExitNow) - if timer.gc_debug: - import gc - while asyncore.socket_map or deferred_queue or timer.queue: - run_deferred() - asyncore.poll(timer.seconds_until_wakeup(), asyncore.socket_map) - run_deferred() - timer.runq() + while True: + old_signal_handlers = {} + try: + for sig in catch_signals: + old_signal_handlers[sig] = signal.signal(sig, _raiseExitNow) if timer.gc_debug: - gc.collect() - if gc.garbage: - for i in gc.garbage: - rpki.log.debug("GC-cycle %r" % i) - del gc.garbage[:] - except ExitNow: - pass - finally: - for sig in old_signal_handlers: - signal.signal(sig, old_signal_handlers[sig]) + import gc + while asyncore.socket_map or deferred_queue or timer.queue: + run_deferred() + asyncore.poll(timer.seconds_until_wakeup(), asyncore.socket_map) + run_deferred() + timer.runq() + if timer.gc_debug: + gc.collect() + if gc.garbage: + for i in gc.garbage: + rpki.log.debug("GC-cycle %r" % i) + del gc.garbage[:] + except ExitNow: + break + except SystemExit: + raise + except Exception, e: + rpki.log.error("event_loop() exited with exception %r, this is not supposed to happen, restarting" % e) + else: + break + finally: + for sig in old_signal_handlers: + signal.signal(sig, old_signal_handlers[sig]) class sync_wrapper(object): """ diff --git a/rpkid/rpki/https.py b/rpkid/rpki/https.py index b34883b7..a7d7acef 100644 --- a/rpkid/rpki/https.py +++ b/rpkid/rpki/https.py @@ -271,7 +271,7 @@ class http_stream(asynchat.async_chat): rpki.log.traceback() if etype not in (rpki.exceptions.HTTPSClientAborted,): self.log("Closing due to error", rpki.log.warn) - self.close() + self.close(force = True) def handle_timeout(self): self.log("Timeout, closing") @@ -368,7 +368,12 @@ class http_stream(asynchat.async_chat): self.retry_read = self.close except POW.WantWriteError: self.retry_write = self.close - + except POW.SSLError, e: + self.log("socket shutdown threw %s, shutting down anyway" % e) + self.tls = None + asynchat.async_chat.close(self) + self.handle_close() + def log_cert(self, tag, x): if debug_tls_certs: rpki.log.debug("%r: HTTPS %s cert %r issuer %s [%s] subject %s [%s]" % (self, tag, x, x.getIssuer(), x.hAKI(), x.getSubject(), x.hSKI())) |