diff options
-rw-r--r-- | docs/left-right-xml | 39 | ||||
-rw-r--r-- | scripts/rpki/left_right.py | 61 | ||||
-rw-r--r-- | scripts/rpki/up_down.py | 65 | ||||
-rwxr-xr-x | scripts/xml-parse-test.py | 2 |
4 files changed, 53 insertions, 114 deletions
diff --git a/docs/left-right-xml b/docs/left-right-xml index ef60f288..02f04487 100644 --- a/docs/left-right-xml +++ b/docs/left-right-xml @@ -334,11 +334,7 @@ <msg version="1" xmlns="http://www.hactrn.net/uris/rpki/left-right-spec/" type="control_request"> <route_origin action="set" self_id="42" route_origin_id="88"> <suppress_publication/> - <as_number asn="12345"/> - <ipv4_prefix min="10.0.0.44" len="32"/> - <ipv4_range min="10.2.0.6" max="10.2.0.77"/> - <ipv6_prefix min="2002:a00::" len="48"/> - <ipv6_range min="2002:a02:6::" max="2002:a02:4d::"/> + <resources asn="12345" ipv4="10.0.0.44/32,10.2.0.6-10.2.0.77" ipv6="2002:a00::/48,2002:a02:6::-2002:a02:4d::"/> </route_origin> </msg> @@ -352,11 +348,7 @@ <msg version="1" xmlns="http://www.hactrn.net/uris/rpki/left-right-spec/" type="control_response"> <route_origin route_origin_id="88"> - <as_number asn="12345"/> - <ipv4_prefix min="10.0.0.44" len="32"/> - <ipv4_range min="10.2.0.6" max="10.2.0.77"/> - <ipv6_prefix min="2002:a00::" len="48"/> - <ipv6_range min="2002:a02:6::" max="2002:a02:4d::"/> + <resources asn="12345" ipv4="10.0.0.44/32,10.2.0.6-10.2.0.77" ipv6="2002:a00::/48,2002:a02:6::-2002:a02:4d::"/> </route_origin> </msg> @@ -366,11 +358,7 @@ <msg version="1" xmlns="http://www.hactrn.net/uris/rpki/left-right-spec/" type="control_response"> <route_origin route_origin_id="88"> - <as_number asn="12345"/> - <ipv4_prefix min="10.0.0.44" len="32"/> - <ipv4_range min="10.2.0.6" max="10.2.0.77"/> - <ipv6_prefix min="2002:a00::" len="48"/> - <ipv6_range min="2002:a02:6::" max="2002:a02:4d::"/> + <resources asn="12345" ipv4="10.0.0.44/32,10.2.0.6-10.2.0.77" ipv6="2002:a00::/48,2002:a02:6::-2002:a02:4d::"/> </route_origin> </msg> @@ -390,19 +378,14 @@ <msg version="1" xmlns="http://www.hactrn.net/uris/rpki/left-right-spec/" type="data_response"> <list_resources self_id="42" child_id="id" valid_until="2008_04_01T00:00:00Z"> - <resource_class> - <ipv4_prefix min="10.0.0.44" len="32"/> - <ipv4_prefix min="10.3.0.44" len="32"/> - <ipv6_prefix min="fe80:dead:beef::" len="48"/> - <as_number asn="666"/> - </resource_class> - <resource_class subject_name="wombats are us"> - <subset_ipv4_prefix min="10.0.0.0" len="8"/> - <ipv4_prefix min="10.2..0.6" len="32"/> - <ipv6_prefix min="fe80:dead:beef::" len="48"/> - <ipv6_range min="fe80:dead:beef::" max="fe80:dead:beef::49"/> - <as_number asn="666"/> - </resource_class> + <resource_class ipv4="10.0.0.44/32,10.3.0.44/32" + ipv6="fe80:dead:beef::/48" + as="666"/> + <resource_class subject_name="wombats are us" + req_ipv4="10.0.0.0/8" + ipv4="10.2..0.6/32" ipv6= + "fe80:dead:beef::/48,fe80:dead:beef::-fe80:dead:beef::49" + as="666"/> </list_resources> </msg> diff --git a/scripts/rpki/left_right.py b/scripts/rpki/left_right.py index a4d86a48..b3a72d7a 100644 --- a/scripts/rpki/left_right.py +++ b/scripts/rpki/left_right.py @@ -25,7 +25,7 @@ class base_elt(object): def store(self, key, val): if key not in self.multivalue: - assert not getattr(self, key) + assert not hasattr(self, key) setattr(self, key, val) elif hasattr(self, key): getattr(self, key).append(val) @@ -144,24 +144,14 @@ class msg(list): spec_uri = "http://www.hactrn.net/uris/rpki/left-right-spec/" version = 1 - dispatch = { - "self" : self_elt, - "child" : child_elt, - "parent" : parent_elt, - "repository" : repository_elt, - "route_origin" : route_origin_elt, - "bsc" : bsc_elt, - "list_resources" : list_resources_elt, - "report_error" : report_error_elt } - def startElement(self, stack, name, attrs): if name == "msg": sax_utils.snarf_attribute(self, attrs, "version", int) sax_utils.snarf_attribute(self, attrs, "type") assert self.version == 1 else: - assert name in self.dispatch - elt = self.dispatch[name](self) + assert name in type_map + elt = type_map[name](self) self.append(elt) stack.append(elt) elt.startElement(stack, name, attrs) @@ -205,48 +195,3 @@ type_map = { "extension_preference" : extension_preference_elt, "resource_class" : resource_class_elt } - -# bsc_link ; attribute-only element -# child_db_id ; attribute-only element -# repository_link ; attribute-only element -# sia_base ; attribute-only element -# -# as_number ; attribute-only element, single/multi depending on context (sigh) -# as_range ; attribute-only element, multi -# ipv4_prefix ; attribute-only element, multi -# ipv4_range ; attribute-only element, multi -# ipv6_prefix ; attribute-only element, multi -# ipv6_range ; attribute-only element, multi -# peer_contact ; attribute-only element, multi -# subset_as_number ; attribute-only element, multi -# subset_as_range ; attribute-only element, multi -# subset_ipv4_prefix ; attribute-only element, multi -# subset_ipv4_range ; attribute-only element, multi -# subset_ipv6_prefix ; attribute-only element, multi -# subset_ipv6_range ; attribute-only element, multi -# -# peer_ta ; base64 element -# pkcs10_cert_request ; base64 element -# public_key ; base64 element -# signing_cert ; base64 element, multi -# -# extension_preference ; container element, multi -# resource_class ; container element, multi -# -# generate_keypair ; attribute-only control element -# publish_world_now ; empty control element -# reissue ; empty control element -# rekey ; empty control element -# revoke ; empty control element -# run_now ; empty control element -# suppress_publication ; empty control element -# -# msg ; pdu -# bsc ; pdu element -# child ; pdu element -# list_resources ; pdu element -# parent ; pdu element -# report_error ; pdu element -# repository ; pdu element -# route_origin ; pdu element -# self ; pdu element diff --git a/scripts/rpki/up_down.py b/scripts/rpki/up_down.py index 1ace8c30..f9901e38 100644 --- a/scripts/rpki/up_down.py +++ b/scripts/rpki/up_down.py @@ -13,17 +13,23 @@ class generic_pdu(object): def endElement(self, stack, name, text): stack.pop() -class cert_elt(object): +class certificate_elt(generic_pdu): """ Up-Down protocol representation of an issued certificate. """ - def __init__(self, attrs): + def startElement(self, stack, name, attrs): + assert name == "certificate", "Unexpected name %s, stack %s" % (name, stack) self.cert_url = attrs["cert_url"] self.req_resource_set_as = resource_set.resource_set_as(attrs["req_resource_set_as"]) self.req_resource_set_ipv4 = resource_set.resource_set_ipv4(attrs["req_resource_set_ipv4"]) self.req_resource_set_ipv6 = resource_set.resource_set_ipv6(attrs["req_resource_set_ipv6"]) + def endElement(self, stack, name, text): + assert name == "certificate" + self.cert = base64.b64decode(text) + stack.pop() + def __str__(self): xml = (' <certificate cert_url="%s"' % (self.cert_url)) if self.req_resource_set_as: @@ -35,20 +41,36 @@ class cert_elt(object): xml += ">" + base64.b64encode(self.cert) + "</certificate>\n" return xml -class class_elt(object): +class class_elt(generic_pdu): """ Up-Down protocol representation of a resource class. """ - def __init__(self, attrs): - self.class_name = attrs["class_name"] - self.cert_url = attrs["cert_url"] - self.suggested_sia_head = attrs.get("suggested_sia_head") - self.resource_set_as = resource_set.resource_set_as(attrs["resource_set_as"]) - self.resource_set_ipv4 = resource_set.resource_set_ipv4(attrs["resource_set_ipv4"]) - self.resource_set_ipv6 = resource_set.resource_set_ipv6(attrs["resource_set_ipv6"]) + def __init__(self): self.certs = [] + def startElement(self, stack, name, attrs): + if name == "certificate": + cert = certificate_elt() + self.certs.append(cert) + stack.append(cert) + cert.startElement(stack, name, attrs) + elif name != "issuer": + assert name == "class", "Unexpected name %s, stack %s" % (name, stack) + self.class_name = attrs["class_name"] + self.cert_url = attrs["cert_url"] + self.suggested_sia_head = attrs.get("suggested_sia_head") + self.resource_set_as = resource_set.resource_set_as(attrs["resource_set_as"]) + self.resource_set_ipv4 = resource_set.resource_set_ipv4(attrs["resource_set_ipv4"]) + self.resource_set_ipv6 = resource_set.resource_set_ipv6(attrs["resource_set_ipv6"]) + + def endElement(self, stack, name, text): + if name == "issuer": + self.issuer = base64.b64decode(text) + else: + assert name == "class", "Unexpected name %s, stack %s" % (name, stack) + stack.pop() + def __str__(self): xml = ('\ <class class_name="%s"\n\ @@ -83,23 +105,12 @@ class list_response_pdu(generic_pdu): self.classes = [] def startElement(self, stack, name, attrs): - if name == "class": - self.classes.append(class_elt(attrs)) - elif name == "certificate": - self.classes[-1].certs.append(cert_elt(attrs)) - elif name != "issuer": - assert name == "list_response", "Unexpected name %s, stack %s" % (name, stack) - - def endElement(self, stack, name, text): - if name == "certificate": - self.classes[-1].certs[-1].cert = base64.b64decode(text) - elif name == "issuer": - self.classes[-1].issuer = base64.b64decode(text) - elif name != "class": - assert name == "message", "Unexpected name %s, stack %s" % (name, stack) - stack.pop() - stack[-1].endElement(stack, name, text) - + assert name == "class", "Unexpected name %s, stack %s" % (name, stack) + klass = class_elt() + self.classes.append(klass) + stack.append(klass) + klass.startElement(stack, name, attrs) + def __str__(self): return "".join(map(str, self.classes)) diff --git a/scripts/xml-parse-test.py b/scripts/xml-parse-test.py index 7c1ff3c3..27b57d1c 100755 --- a/scripts/xml-parse-test.py +++ b/scripts/xml-parse-test.py @@ -10,6 +10,6 @@ for f in files: x = fh.read() fh.close() xml.sax.parseString(x, handler) - x = str(handler.obj) + x = str(handler.result) print x rpki.relaxng.relaxng(x, "up-down-medium-schema.rng") |