aboutsummaryrefslogtreecommitdiff
path: root/rpkid
diff options
context:
space:
mode:
Diffstat (limited to 'rpkid')
-rw-r--r--rpkid/rpki/async.py49
-rw-r--r--rpkid/rpki/https.py9
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()))