aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpkid/myrpki.rnc1
-rw-r--r--rpkid/myrpki.rng3
-rw-r--r--rpkid/rpki/myrpki.py64
3 files changed, 36 insertions, 32 deletions
diff --git a/rpkid/myrpki.rnc b/rpkid/myrpki.rnc
index 15ec2b76..5b8aa450 100644
--- a/rpkid/myrpki.rnc
+++ b/rpkid/myrpki.rnc
@@ -97,6 +97,7 @@ contact_info = element contact_info {
# Variant payload portion of a <repository/> element.
repository_payload = (
+ (attribute type { "none" }) |
(attribute type { "offer" }) |
(attribute type { "referral" }, authorization, contact_info)
)
diff --git a/rpkid/myrpki.rng b/rpkid/myrpki.rng
index 09a3472c..7f78824d 100644
--- a/rpkid/myrpki.rng
+++ b/rpkid/myrpki.rng
@@ -240,6 +240,9 @@
<define name="repository_payload">
<choice>
<attribute name="type">
+ <value>none</value>
+ </attribute>
+ <attribute name="type">
<value>offer</value>
</attribute>
<group>
diff --git a/rpkid/rpki/myrpki.py b/rpkid/rpki/myrpki.py
index 0f0fadce..ce64f46f 100644
--- a/rpkid/rpki/myrpki.py
+++ b/rpkid/rpki/myrpki.py
@@ -1057,6 +1057,7 @@ class main(rpki.cli.Cmd):
if self.run_rpkid or self.run_pubd or self.run_rootd:
self.bpki_servers = CA(self.cfg.filename, self.cfg.get("bpki_servers_directory"))
+ self.default_repository = self.cfg.get("default_repository", "")
self.pubd_contact_info = self.cfg.get("pubd_contact_info", "")
self.rsync_module = self.cfg.get("publication_rsync_module")
@@ -1239,32 +1240,31 @@ class main(rpki.cli.Cmd):
PEMElement(e, "bpki_resource_ta", self.bpki_resources.cer)
SubElement(e, "bpki_child_ta").text = c.findtext("bpki_ta")
- try:
- repo = None
- for f in self.entitydb.iterate("repositories", "*.xml"):
- r = etree_read(f)
- if r.get("type") == "confirmed":
- if repo is not None:
- raise RuntimeError, "Too many repositories, I don't know what to do, not giving referral"
- repo_handle = os.path.splitext(os.path.split(f)[-1])[0]
+ repo = None
+ for f in self.entitydb.iterate("repositories", "*.xml"):
+ r = etree_read(f)
+ if r.get("type") == "confirmed":
+ h = os.path.splitext(os.path.split(f)[-1])[0]
+ if repo is None or h == self.default_repository:
+ repo_handle = h
repo = r
- if repo is None:
- raise RuntimeError, "Couldn't find any usable repositories, not giving referral"
- if repo_handle == self.handle:
- SubElement(e, "repository", type = "offer")
- else:
- proposed_sia_base = repo.get("sia_base") + child_handle + "/"
- r = Element("referral", authorized_sia_base = proposed_sia_base)
- r.text = c.findtext("bpki_ta")
- auth = self.bpki_resources.cms_xml_sign(
- "/CN=%s Publication Referral" % self.handle, "referral", r)
- r = SubElement(e, "repository", type = "referral")
- SubElement(r, "authorization", referrer = repo.get("client_handle")).text = auth
- SubElement(r, "contact_info").text = repo.findtext("contact_info")
-
- except RuntimeError, err:
- print err
+ if repo is None:
+ print "Couldn't find any usable repositories, not giving referral"
+
+ elif repo_handle == self.handle:
+ SubElement(e, "repository", type = "offer")
+
+ else:
+ proposed_sia_base = repo.get("sia_base") + child_handle + "/"
+ r = Element("referral", authorized_sia_base = proposed_sia_base)
+ r.text = c.findtext("bpki_ta")
+ auth = self.bpki_resources.cms_xml_sign(
+ "/CN=%s Publication Referral" % self.handle, "referral", r)
+
+ r = SubElement(e, "repository", type = "referral")
+ SubElement(r, "authorization", referrer = repo.get("client_handle")).text = auth
+ SubElement(r, "contact_info").text = repo.findtext("contact_info")
etree_write(e, self.entitydb("children", "%s.xml" % child_handle),
msg = "Send this file back to the child you just configured")
@@ -1323,14 +1323,14 @@ class main(rpki.cli.Cmd):
r = p.find("repository")
- if r is not None and r.get("type") in ("offer", "referral"):
- r.set("handle", self.handle)
- r.set("parent_handle", parent_handle)
- PEMElement(r, "bpki_client_ta", self.bpki_resources.cer)
- etree_write(r, self.entitydb("repositories", "%s.xml" % parent_handle),
- msg = 'This is the "repository %s" file to send to the repository operator' % r.get("type"))
- else:
- print "Couldn't find repository offer or referral"
+ if r is None or r.get("type") not in ("offer", "referral"):
+ r = Element("repository", type = "none")
+
+ r.set("handle", self.handle)
+ r.set("parent_handle", parent_handle)
+ PEMElement(r, "bpki_client_ta", self.bpki_resources.cer)
+ etree_write(r, self.entitydb("repositories", "%s.xml" % parent_handle),
+ msg = "This is the file to send to the repository operator")
def do_delete_parent(self, arg):