diff options
Diffstat (limited to 'rpki')
-rw-r--r-- | rpki/pubd.py | 6 | ||||
-rw-r--r-- | rpki/publication.py | 2 | ||||
-rw-r--r-- | rpki/publication_control.py | 4 | ||||
-rw-r--r-- | rpki/rootd.py | 36 |
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: |