aboutsummaryrefslogtreecommitdiff
path: root/rpki
diff options
context:
space:
mode:
Diffstat (limited to 'rpki')
-rw-r--r--rpki/pubd.py6
-rw-r--r--rpki/publication.py2
-rw-r--r--rpki/publication_control.py4
-rw-r--r--rpki/rootd.py36
4 files changed, 34 insertions, 14 deletions
diff --git a/rpki/pubd.py b/rpki/pubd.py
index 21fd9298..22335ce8 100644
--- a/rpki/pubd.py
+++ b/rpki/pubd.py
@@ -183,10 +183,11 @@ class main(object):
r_msg = q_msg.__class__.reply()
delta = self.session.new_delta()
failed = False
+ did_something = False
for q_pdu in q_msg:
try:
if isinstance(q_pdu, rpki.publication.list_elt):
- for obj in client.published_objects:
+ for obj in client.objects:
r_pdu = q_pdu.__class__()
r_pdu.tag = q_pdu.tag
r_pdu.uri = obj.uri
@@ -201,6 +202,7 @@ class main(object):
r_pdu.tag = q_pdu.tag
r_pdu.uri = q_pdu.uri
r_msg.append(r_pdu)
+ did_something = True
except (rpki.async.ExitNow, SystemExit):
raise
except Exception, e:
@@ -211,7 +213,7 @@ class main(object):
#
# This isn't really right as long as we're using SQL autocommit
#
- if failed:
+ if failed or not did_something:
# This should SQL rollback
#
# Under current scheme I don't think delta is in SQL yet so this may be wrong
diff --git a/rpki/publication.py b/rpki/publication.py
index 1d428bf9..763fda9d 100644
--- a/rpki/publication.py
+++ b/rpki/publication.py
@@ -224,7 +224,7 @@ class msg(rpki.xml_utils.msg, publication_namespace):
## @var pdus
# Dispatch table of PDUs for this protocol.
- pdus = dict((x.element_name, x) for x in (publish_elt, withdraw_elt, report_error_elt))
+ pdus = dict((x.element_name, x) for x in (publish_elt, withdraw_elt, list_elt, report_error_elt))
class sax_handler(rpki.xml_utils.sax_handler):
diff --git a/rpki/publication_control.py b/rpki/publication_control.py
index 42a74d36..95751336 100644
--- a/rpki/publication_control.py
+++ b/rpki/publication_control.py
@@ -90,10 +90,6 @@ class client_elt(rpki.xml_utils.data_elt, rpki.sql.sql_persistent, publication_c
def objects(self):
return rpki.pubd.object_obj.sql_fetch_where(self.gctx, "client_id = %s", (self.client_id,))
- @property
- def published_object(self):
- return rpki.pubd.object_obj.sql_fetch_where(self.gctx, "client_id = %s AND withdrawn_snapshot_id IS NULL", (self.client_id,))
-
def serve_post_save_hook(self, q_pdu, r_pdu, cb, eb):
"""
Extra server actions for client_elt.
diff --git a/rpki/rootd.py b/rpki/rootd.py
index 2261a83f..b1b29487 100644
--- a/rpki/rootd.py
+++ b/rpki/rootd.py
@@ -70,11 +70,11 @@ class revoke_pdu(rpki.up_down.revoke_pdu):
rootd.revoke_subject_cert(now)
rootd.del_subject_cert()
rootd.del_subject_pkcs10()
- rootd.generate_crl_and_manifest(now, pubd_msg)
r_msg.payload = rpki.up_down.revoke_response_pdu()
r_msg.payload.class_name = self.class_name
r_msg.payload.ski = self.ski
- rootd.call_pubd(callback, errback, pubd_msg)
+ rootd.generate_crl_and_manifest(now, pubd_msg)
+ rootd.publish(callback, errback, pubd_msg)
class error_response_pdu(rpki.up_down.error_response_pdu):
exceptions = rpki.up_down.error_response_pdu.exceptions.copy()
@@ -295,14 +295,38 @@ class main(object):
rc.certs.append(rpki.up_down.certificate_elt())
rc.certs[0].cert_url = rpki.up_down.multi_uri(self.rpki_subject_cert_uri)
rc.certs[0].cert = subject_cert
- self.call_pubd(callback, errback, pubd_msg)
+ self.publish(callback, errback, pubd_msg)
+
+
+ def publish(self, callback, errback, q_msg):
+
+ def done(r_msg):
+ if len(q_msg) != len(r_msg):
+ raise rpki.exceptions.BadPublicationReply("Wrong number of response PDUs from pubd: sent %r, got %r" % (q_msg, r_msg))
+ callback()
+
+ def fix_hashes(r_msg):
+ published_hash = dict((r_pdu.uri, r_pdu.hash) for r_pdu in r_msg)
+ for q_pdu in q_msg:
+ if q_pdu.hash is None and published_hash.get(q_pdu.uri) is not None:
+ logger.debug("Updating hash of %r to %s from previously published data", q_pdu, published_hash[q_pdu.uri])
+ q_pdu.hash = published_hash[q_pdu.uri]
+ self.call_pubd(done, errback, q_msg)
+
+ if not q_msg:
+ callback()
+ elif all(q_pdu.hash is not None for q_pdu in q_msg):
+ self.call_pubd(done, errback, q_msg)
+ else:
+ logger.debug("Some publication PDUs are missing hashes, checking...")
+ self.call_pubd(fix_hashes, errback, rpki.publication.msg.query(rpki.publication.list_elt()))
def call_pubd(self, callback, errback, q_msg):
try:
if not q_msg:
- return callback()
+ return callback(())
for q_pdu in q_msg:
logger.info("Sending %r to pubd", q_pdu)
@@ -317,9 +341,7 @@ class main(object):
self.pubd_cms_timestamp = r_cms.check_replay(self.pubd_cms_timestamp, self.pubd_contact_uri)
for r_pdu in r_msg:
r_pdu.raise_if_error()
- if len(q_msg) > len(r_msg):
- raise rpki.exceptions.BadPublicationReply("Wrong number of response PDUs from pubd: sent %r, got %r" % (q_msg, r_msg))
- callback()
+ callback(r_msg)
except (rpki.async.ExitNow, SystemExit):
raise
except Exception, e: