aboutsummaryrefslogtreecommitdiff
path: root/scripts/rpki
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/rpki')
-rw-r--r--scripts/rpki/left_right.py120
-rw-r--r--scripts/rpki/sax_utils.py22
-rw-r--r--scripts/rpki/up_down.py33
3 files changed, 114 insertions, 61 deletions
diff --git a/scripts/rpki/left_right.py b/scripts/rpki/left_right.py
index edc74fd0..53998d0e 100644
--- a/scripts/rpki/left_right.py
+++ b/scripts/rpki/left_right.py
@@ -2,6 +2,71 @@
import base64, sax_utils, resource_set
+class base_elt(object):
+ """
+ Base type for left-right message elements.
+ """
+
+ content_attr = False
+ base64_content = False
+ multivalue = ()
+
+ def __init__(self, up=None):
+ self.up = up
+ for key in self.multivalue:
+ setattr(self, key, [])
+
+ def store(self, key, val):
+ if key in self.multivalue:
+ getattr(self, key).append(val)
+ else:
+ setattr(self, key, val)
+
+ def startElement(self, name, attrs):
+ if name = self.name:
+ sax_utils.snarf_attribute(self, attrs, self.attributes)
+
+ def endElement(self, name, text):
+ if name = self.name and self.content_attr:
+ if self.base64_content:
+ self.store(self.content_attr, base64.b64decode(text))
+ else:
+ self.store(self.content_attr, text)
+
+class self_elt(base_elt):
+ name = "self"
+ attributes = ("action", "self_id")
+
+class child_elt(base_elt):
+ name = "child"
+ attributes = ("action", "self_id", "child_id")
+
+class parent_elt(base_elt):
+ name = "parent"
+ attributes = ("action", "self_id", "parent_id")
+
+class route_origin_elt(base_elt):
+ name = "route_origin"
+ attributes = ("action", "self_id", "route_origin_id")
+
+class repository_elt(base_elt):
+ name = "repository"
+ attributes = ("action", "self_id", "repository_id")
+
+class bsc_elt(base_elt):
+ name = "biz_signing_context"
+ attributes = ("action", "self_id", "biz_signing_context_id")
+
+
+
+class list_resources_elt(base_elt):
+ def startElement(self, name, attrs):
+ sax_utils.snarf_attribute(self, attrs, ("self_id", "child_id"))
+
+class report_error_elt(base_elt):
+ def startElement(self, name, attrs):
+ sax_utils.snarf_attribute(self, attrs, ("self_id", "error_code"))
+
class msg(list):
"""
Left-right PDU.
@@ -11,44 +76,33 @@ class msg(list):
version = 1
dispatch = {
- ("control-request", "biz-signing-context") : bsc_q,
- ("control-request", "child") : child_q,
- ("control-request", "parent") : parent_q,
- ("control-request", "repository") : repository_q,
- ("control-request", "route-origin") : route_origin_q,
- ("control-request", "self") : self_q,
- ("control-response", "biz-signing-context") : bsc_r,
- ("control-response", "child") : child_r,
- ("control-response", "parent") : parent_r,
- ("control-response", "repository") : repository_r,
- ("control-response", "route-origin") : route_origin_r,
- ("control-response", "self") : self_r,
- ("data-request", "list-resources") : list_resources_q,
- ("data-response", "list-resources") : list_resources_r,
- ("error", "report-error") : report_error_q
- }
-
- def __str__(self):
- return ('\
-<?xml version="1.0" encoding="US-ASCII" ?>\n\
-<msg xmlns="%s"\n\
- version="%d"\n\
- type="%s">\n' \
- % (self.spec_uri, self.version, self.type)
- ) + "".join(map(str,self)) + "</msg>\n"
-
- def endElement(self, name, text):
- pass
+ "self" : self_elt,
+ "child" : child_elt,
+ "parent" : parent_elt,
+ "repository" : repository_elt,
+ "route_origin" : route_origin_elt,
+ "biz_signing_context" : bsc_elt,
+ "list_resources" : list_resources_elt,
+ "report_error" : report_error_elt }
def startElement(self, name, attrs):
if name == "msg":
- sax_utils.snarf(self, attrs, "version", int)
- sax_utils.snarf(self, attrs, "type")
+ sax_utils.snarf_attribute(self, attrs, "version", int)
+ sax_utils.snarf_attribute(self, attrs, "type")
assert self.version == 1
else:
- func = self.dispatch(self.type, name)
- # hmm, proabbly want to look at action attribute but that's a
- # layering violation, so maybe do it in the next handler down?
+ if name in self.dispatch:
+ self.append(self.dispatch[name](self))
+ self[-1].startElement(name, attrs)
+
+ def endElement(self, name, text):
+ self[-1].endElement(name, text)
+
+ def __str__(self):
+ return ('<?xml version="1.0" encoding="US-ASCII" ?>\n'
+ '<msg xmlns="%s" version="%d" type="%s">\n' \
+ % (self.spec_uri, self.version, self.type)
+ ) + "".join(map(str,self)) + "</msg>\n"
class sax_handler(sax_utils.handler):
"""
diff --git a/scripts/rpki/sax_utils.py b/scripts/rpki/sax_utils.py
index 6497699a..4d47f24a 100644
--- a/scripts/rpki/sax_utils.py
+++ b/scripts/rpki/sax_utils.py
@@ -2,20 +2,24 @@
import xml.sax
-def snarf(obj, attrs, key, func=None):
+def snarf_attribute(obj, attrs, key, func=None):
"""
Utility function to consolidate the steps needed to extract a field
from the SAX XML parse and insert it as an object attribute of the
same name.
"""
- try:
- val = attrs.getValue(key).encode("ascii")
- if func:
- val = func(val)
- except KeyError:
- val = None
- setattr(obj, key, val)
+ if isinstance(key, list) or isinstance(key, tuple):
+ for k in key:
+ snarf_attribute(obj, attrs, k, func)
+ else:
+ try:
+ val = attrs.getValue(key).encode("ascii")
+ if func:
+ val = func(val)
+ except KeyError:
+ val = None
+ setattr(obj, key, val)
class handler(xml.sax.handler.ContentHandler):
"""
@@ -38,7 +42,7 @@ class handler(xml.sax.handler.ContentHandler):
self.text += content
def get_text(self):
- val = self.text
+ val = self.text.encode("ascii")
self.text = ""
return val
diff --git a/scripts/rpki/up_down.py b/scripts/rpki/up_down.py
index 8d900c42..37635418 100644
--- a/scripts/rpki/up_down.py
+++ b/scripts/rpki/up_down.py
@@ -33,10 +33,10 @@ class cert_elt(object):
"""
def __init__(self, attrs):
- sax_utils.snarf(self, attrs, "cert_url")
- sax_utils.snarf(self, attrs, "req_resource_set_as", resource_set.resource_set_as)
- sax_utils.snarf(self, attrs, "req_resource_set_ipv4", resource_set.resource_set_ipv4)
- sax_utils.snarf(self, attrs, "req_resource_set_ipv6", resource_set.resource_set_ipv6)
+ sax_utils.snarf_attribute(self, attrs, "cert_url")
+ sax_utils.snarf_attribute(self, attrs, "req_resource_set_as", resource_set.resource_set_as)
+ sax_utils.snarf_attribute(self, attrs, "req_resource_set_ipv4", resource_set.resource_set_ipv4)
+ sax_utils.snarf_attribute(self, attrs, "req_resource_set_ipv6", resource_set.resource_set_ipv6)
def __str__(self):
xml = (' <certificate cert_url="%s"' % (self.cert_url))
@@ -55,12 +55,10 @@ class class_elt(object):
"""
def __init__(self, attrs):
- sax_utils.snarf(self, attrs, "class_name")
- sax_utils.snarf(self, attrs, "cert_url")
- sax_utils.snarf(self, attrs, "resource_set_as", resource_set.resource_set_as)
- sax_utils.snarf(self, attrs, "resource_set_ipv4", resource_set.resource_set_ipv4)
- sax_utils.snarf(self, attrs, "resource_set_ipv6", resource_set.resource_set_ipv6)
- sax_utils.snarf(self, attrs, "suggested_sia_head")
+ sax_utils.snarf_attribute(self, attrs, ("class_name", "cert_url", "suggested_sia_head"))
+ sax_utils.snarf_attribute(self, attrs, "resource_set_as", resource_set.resource_set_as)
+ sax_utils.snarf_attribute(self, attrs, "resource_set_ipv4", resource_set.resource_set_ipv4)
+ sax_utils.snarf_attribute(self, attrs, "resource_set_ipv6", resource_set.resource_set_ipv6)
self.certs = []
def __str__(self):
@@ -116,10 +114,10 @@ class issue_pdu(msg_pdu):
def startElement(self, name, attrs):
assert name == "request"
- sax_utils.snarf(self, attrs, "class_name")
- sax_utils.snarf(self, attrs, "req_resource_set_as", resource_set.resource_set_as)
- sax_utils.snarf(self, attrs, "req_resource_set_ipv4", resource_set.resource_set_ipv4)
- sax_utils.snarf(self, attrs, "req_resource_set_ipv6", resource_set.resource_set_ipv6)
+ sax_utils.snarf_attribute(self, attrs, "class_name")
+ sax_utils.snarf_attribute(self, attrs, "req_resource_set_as", resource_set.resource_set_as)
+ sax_utils.snarf_attribute(self, attrs, "req_resource_set_ipv4", resource_set.resource_set_ipv4)
+ sax_utils.snarf_attribute(self, attrs, "req_resource_set_ipv6", resource_set.resource_set_ipv6)
def endElement(self, name, text):
assert name == "request"
@@ -150,8 +148,7 @@ class revoke_pdu(msg_pdu):
"""
def startElement(self, name, attrs):
- sax_utils.snarf(self, attrs, "class_name")
- sax_utils.snarf(self, attrs, "ski")
+ sax_utils.snarf_attribute(self, attrs, ("class_name", "ski"))
def toXML(self):
return (' <key class_name="%s" ski="%s" />\n' % (self.class_name, self.ski))
@@ -195,9 +192,7 @@ class sax_handler(sax_utils.handler):
"revoke_response" : revoke_response_pdu(),
"error_response" : error_response_pdu()
}[attrs.getValue("type").encode("ascii")])
- sax_utils.snarf(self.obj, attrs, "sender")
- sax_utils.snarf(self.obj, attrs, "recipient")
- sax_utils.snarf(self.obj, attrs, "type")
+ sax_utils.snarf_attribute(self.obj, attrs, ("sender", "recipient", "type"))
else:
self.obj.startElement(name, attrs)