aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2009-05-11 05:23:41 +0000
committerRob Austein <sra@hactrn.net>2009-05-11 05:23:41 +0000
commit125c61b4f7040e1206fa3eb5b627147bbbd5645b (patch)
treeab7657038e44498e226f79614e4abcdae5710057
parent42edf90e3796d347cdf907f59b7b0977520632fd (diff)
Pass ExitNow exceptions through, as signal handlers can raise them at any time.
svn path=/rpkid/irdbd.py; revision=2423
-rwxr-xr-xrpkid/irdbd.py3
-rwxr-xr-xrpkid/pubd.py4
-rwxr-xr-xrpkid/rootd.py6
-rw-r--r--rpkid/rpki/async.py12
-rw-r--r--rpkid/rpki/https.py12
-rw-r--r--rpkid/rpki/left_right.py6
-rw-r--r--rpkid/rpki/publication.py2
-rw-r--r--rpkid/rpki/rpki_engine.py4
-rw-r--r--rpkid/rpki/up_down.py2
-rw-r--r--rpkid/rpki/x509.py8
-rw-r--r--rpkid/testbed.py2
-rw-r--r--rpkid/testpoke.py2
12 files changed, 54 insertions, 9 deletions
diff --git a/rpkid/irdbd.py b/rpkid/irdbd.py
index 5274926f..cda8c02d 100755
--- a/rpkid/irdbd.py
+++ b/rpkid/irdbd.py
@@ -73,6 +73,9 @@ def handler(query, path, cb):
cb(200, rpki.left_right.cms_msg.wrap(r_msg, irdbd_key, irdbd_cert))
+ except rpki.async.ExitNow:
+ raise
+
except Exception, data:
rpki.log.error(traceback.format_exc())
diff --git a/rpkid/pubd.py b/rpkid/pubd.py
index 1fb2bace..05b17ced 100755
--- a/rpkid/pubd.py
+++ b/rpkid/pubd.py
@@ -63,6 +63,8 @@ class pubd_context(object):
try:
self.sql.ping()
self.handler_common(query, None, lambda x: cb(200, x), (self.bpki_ta, self.irbe_cert))
+ except rpki.async.ExitNow:
+ raise
except Exception, data:
rpki.log.error(traceback.format_exc())
cb(500, "Unhandled exception %s" % data)
@@ -82,6 +84,8 @@ class pubd_context(object):
if config is None or config.bpki_crl is None:
raise rpki.exceptions.CMSCRLNotSet
self.handler_common(query, client, lambda x: cb(200, x), (self.bpki_ta, client.bpki_cert, client.bpki_glue), config.bpki_crl)
+ except rpki.async.ExitNow:
+ raise
except Exception, data:
rpki.log.error(traceback.format_exc())
cb(500, "Could not process PDU: %s" % data)
diff --git a/rpkid/rootd.py b/rpkid/rootd.py
index ce5f9f75..1f061cd9 100755
--- a/rpkid/rootd.py
+++ b/rpkid/rootd.py
@@ -188,6 +188,8 @@ class cms_msg(rpki.up_down.cms_msg):
def up_down_handler(query, path, cb):
try:
q_msg = cms_msg.unwrap(query, (bpki_ta, child_bpki_cert))
+ except rpki.async.ExitNow:
+ raise
except Exception, data:
rpki.log.error(traceback.format_exc())
return cb(400, "Could not process PDU: %s" % data)
@@ -198,10 +200,14 @@ def up_down_handler(query, path, cb):
try:
q_msg.serve_top_level(None, done)
+ except rpki.async.ExitNow:
+ raise
except Exception, data:
rpki.log.error(traceback.format_exc())
try:
done(q_msg.serve_error(data))
+ except rpki.async.ExitNow:
+ raise
except Exception, data:
rpki.log.error(traceback.format_exc())
cb(500, "Could not process PDU: %s" % data)
diff --git a/rpkid/rpki/async.py b/rpkid/rpki/async.py
index c81bb474..cb2541b0 100644
--- a/rpkid/rpki/async.py
+++ b/rpkid/rpki/async.py
@@ -21,6 +21,8 @@ PERFORMANCE OF THIS SOFTWARE.
import asyncore, signal, traceback
import rpki.log, rpki.sundial
+ExitNow = asyncore.ExitNow
+
class iterator(object):
"""Iteration construct for event-driven code. Takes three
arguments:
@@ -44,6 +46,8 @@ class iterator(object):
self.done_callback = done_callback
try:
self.iterator = iter(iterable)
+ except ExitNow:
+ raise
except:
rpki.log.debug("Problem constructing iterator for %s" % repr(iterable))
raise
@@ -146,7 +150,7 @@ class timer(object):
t = cls.queue.pop(0)
try:
t.handler()
- except asyncore.ExitNow:
+ except ExitNow:
raise
except Exception, e:
t.errback(e)
@@ -186,7 +190,7 @@ class timer(object):
def _raiseExitNow(signum, frame):
"""Signal handler for event_loop()."""
- raise asyncore.ExitNow
+ raise ExitNow
def event_loop(catch_signals = (signal.SIGINT, signal.SIGTERM)):
"""Replacement for asyncore.loop(), adding timer and signal support."""
@@ -197,7 +201,7 @@ def event_loop(catch_signals = (signal.SIGINT, signal.SIGTERM)):
while asyncore.socket_map or timer.queue:
asyncore.poll(timer.seconds_until_wakeup(), asyncore.socket_map)
timer.runq()
- except asyncore.ExitNow:
+ except ExitNow:
pass
finally:
for sig in old_signal_handlers:
@@ -205,4 +209,4 @@ def event_loop(catch_signals = (signal.SIGINT, signal.SIGTERM)):
def exit_event_loop():
"""Force exit from event_loop()."""
- raise asyncore.ExitNow
+ raise ExitNow
diff --git a/rpkid/rpki/https.py b/rpkid/rpki/https.py
index b3636118..47c5b81f 100644
--- a/rpkid/rpki/https.py
+++ b/rpkid/rpki/https.py
@@ -315,7 +315,7 @@ class http_server(http_stream):
if error is None:
try:
handler(self.msg.body, self.msg.path, self.send_reply)
- except asyncore.ExitNow:
+ except rpki.async.ExitNow:
raise
except Exception, edata:
print traceback.format_exc()
@@ -356,7 +356,7 @@ class http_listener(asyncore.dispatcher):
self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
self.bind((host, port))
self.listen(5)
- except asyncore.ExitNow:
+ except rpki.async.ExitNow:
raise
except:
self.handle_error()
@@ -366,7 +366,7 @@ class http_listener(asyncore.dispatcher):
self.log("Accepting connection")
try:
http_server(conn = self.accept()[0], handlers = self.handlers)
- except asyncore.ExitNow:
+ except rpki.async.ExitNow:
raise
except:
self.handle_error()
@@ -391,6 +391,8 @@ class http_client(http_stream):
try:
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect(self.hostport)
+ except rpki.async.ExitNow:
+ raise
except:
self.handle_error()
@@ -461,6 +463,8 @@ class http_client(http_stream):
self.queue.detach(self)
try:
raise
+ except rpki.async.ExitNow:
+ raise
except Exception, edata:
self.queue.return_result(edata)
@@ -513,7 +517,7 @@ class http_queue(object):
assert isinstance(result, Exception)
self.log("Returning exception %r to caller: %s" % (result, result))
req.errback(result)
- except asyncore.ExitNow:
+ except rpki.async.ExitNow:
raise
except:
self.log("Unhandled exception from callback")
diff --git a/rpkid/rpki/left_right.py b/rpkid/rpki/left_right.py
index d355d2c1..fd590b11 100644
--- a/rpkid/rpki/left_right.py
+++ b/rpkid/rpki/left_right.py
@@ -542,6 +542,8 @@ class child_elt(data_elt):
try:
q_msg.serve_top_level(self, done)
+ except rpki.async.ExitNow:
+ raise
except rpki.exceptions.NoActiveCA, data:
done(q_msg.serve_error(data))
except Exception, data:
@@ -583,6 +585,8 @@ class repository_elt(data_elt):
if len(r_msg) != 1 or isinstance(r_msg[0], rpki.publication.report_error_elt):
raise rpki.exceptions.BadPublicationReply, "Unexpected response from pubd: %s" % msg
callback()
+ except rpki.async.ExitNow:
+ raise
except Exception, edata:
errback(edata)
@@ -929,6 +933,8 @@ class msg(rpki.xml_utils.msg, left_right_namespace):
try:
q_pdu.gctx = gctx
q_pdu.serve_dispatch(r_msg, iterator, fail)
+ except rpki.async.ExitNow:
+ raise
except Exception, edata:
fail(edata)
diff --git a/rpkid/rpki/publication.py b/rpkid/rpki/publication.py
index e9b525fd..b43fa60c 100644
--- a/rpkid/rpki/publication.py
+++ b/rpkid/rpki/publication.py
@@ -276,6 +276,8 @@ class msg(rpki.xml_utils.msg, publication_namespace):
q_pdu.gctx = gctx
q_pdu.client = client
q_pdu.serve_dispatch(r_msg, iterator, fail)
+ except rpki.async.ExitNow:
+ raise
except Exception, edata:
fail(edata)
diff --git a/rpkid/rpki/rpki_engine.py b/rpkid/rpki/rpki_engine.py
index e983fa90..ed03ad29 100644
--- a/rpkid/rpki/rpki_engine.py
+++ b/rpkid/rpki/rpki_engine.py
@@ -89,6 +89,8 @@ class rpkid_context(object):
if q_msg.type != "query":
raise rpki.exceptions.BadQuery, "Message type is not query"
q_msg.serve_top_level(self, done)
+ except rpki.async.ExitNow:
+ raise
except Exception, data:
rpki.log.error(traceback.format_exc())
cb(500, "Unhandled exception %s" % data)
@@ -110,6 +112,8 @@ class rpkid_context(object):
if child is None:
raise rpki.exceptions.ChildNotFound, "Could not find child %s" % child_id
child.serve_up_down(query, done)
+ except rpki.async.ExitNow:
+ raise
except Exception, data:
rpki.log.error(traceback.format_exc())
cb(400, "Could not process PDU: %s" % data)
diff --git a/rpkid/rpki/up_down.py b/rpkid/rpki/up_down.py
index 5b257a53..825a5d14 100644
--- a/rpkid/rpki/up_down.py
+++ b/rpkid/rpki/up_down.py
@@ -522,6 +522,8 @@ class message_pdu(base_elt):
try:
self.payload.serve_pdu(self, r_msg, child, done, lose)
+ except rpki.async.ExitNow:
+ raise
except Exception, edata:
lose(edata)
diff --git a/rpkid/rpki/x509.py b/rpkid/rpki/x509.py
index b167560c..9825e609 100644
--- a/rpkid/rpki/x509.py
+++ b/rpkid/rpki/x509.py
@@ -44,7 +44,7 @@ PERFORMANCE OF THIS SOFTWARE.
import POW, tlslite.api, POW.pkix, base64, lxml.etree, os
import rpki.exceptions, rpki.resource_set, rpki.oids, rpki.sundial
-import rpki.manifest, rpki.roa, rpki.log
+import rpki.manifest, rpki.roa, rpki.log, rpki.async
def calculate_SKI(public_key_der):
"""Calculate the SKI value given the DER representation of a public
@@ -672,6 +672,8 @@ class CMS_object(DER_object):
try:
cms = self.get_POW()
+ except rpki.async.ExitNow:
+ raise
except:
if self.print_on_der_error:
rpki.log.debug("Problem parsing DER CMS message, might not really be DER: %s"
@@ -724,6 +726,8 @@ class CMS_object(DER_object):
try:
content = cms.verify(store)
+ except rpki.async.ExitNow:
+ raise
except:
if self.dump_on_verify_failure:
if True:
@@ -750,6 +754,8 @@ class CMS_object(DER_object):
try:
cms = self.get_POW()
+ except rpki.async.ExitNow:
+ raise
except:
raise rpki.exceptions.UnparsableCMSDER
diff --git a/rpkid/testbed.py b/rpkid/testbed.py
index 7ad20534..3be69ec3 100644
--- a/rpkid/testbed.py
+++ b/rpkid/testbed.py
@@ -248,6 +248,8 @@ class main(object):
if p is not None:
rpki.log.info("Killing %s" % n)
os.kill(p.pid, signal.SIGTERM)
+ except rpki.async.ExitNow:
+ raise
except Exception, data:
rpki.log.warn("Couldn't clean up daemons (%s), continuing" % data)
diff --git a/rpkid/testpoke.py b/rpkid/testpoke.py
index f07135a6..e770101e 100644
--- a/rpkid/testpoke.py
+++ b/rpkid/testpoke.py
@@ -102,6 +102,8 @@ def query_up_down(q_pdu):
print r_xml
try:
r_msg.payload.check_response()
+ except rpki.async.ExitNow:
+ raise
except Exception, edata:
fail(edata)
rpki.async.exit_event_loop()