diff options
author | Rob Austein <sra@hactrn.net> | 2007-07-12 01:18:31 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2007-07-12 01:18:31 +0000 |
commit | 0c615497e477b40d1a7b68b5575ae5d0b1ed6b80 (patch) | |
tree | 683b0faec0ab193a6f9083b9c2ecd1c2e1704911 /scripts | |
parent | 2702e7702442df3f44d8f70d11add746d6b94fd1 (diff) |
Checkpoint
svn path=/docs/left-right-xml; revision=753
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/rpki/left_right.py | 120 | ||||
-rw-r--r-- | scripts/rpki/sax_utils.py | 22 | ||||
-rw-r--r-- | scripts/rpki/up_down.py | 33 |
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) |