aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2007-07-13 04:00:28 +0000
committerRob Austein <sra@hactrn.net>2007-07-13 04:00:28 +0000
commit83a6b86eb0e93c1d03fe2932e4751ee29fa4cdb0 (patch)
tree4944947d99cfef8812b061bb9389f12c4601615e
parent36e783548c4d62baadacaa49a25b4a51b6cc4998 (diff)
Checkpoint
svn path=/scripts/rpki/left_right.py; revision=757
-rw-r--r--scripts/rpki/left_right.py175
1 files changed, 88 insertions, 87 deletions
diff --git a/scripts/rpki/left_right.py b/scripts/rpki/left_right.py
index ce97401d..3c503bd4 100644
--- a/scripts/rpki/left_right.py
+++ b/scripts/rpki/left_right.py
@@ -2,125 +2,80 @@
import base64, sax_utils, resource_set
+Broken = True
+
+assert ! Broken
+
+# This still isn't right, although it's not as broken as it was. I
+# don't see any sane way to avoid keeping a stack of objects under
+# construction, probably in our sax_handler object. Passing SAX
+# events along to the current object is ok, but passing every SAX
+# event down through the chain of objects under construction is just
+# nuts. So probably want push and pop methods in the sax_handler so
+# that the current object can create a child and push it onto the
+# stack, and so that a current object can pop itself off the stack.
+
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, [])
+ multivalue = ("peer_contact", "signing_cert", "extension_preference", "resource_class",
+ "as_number", "as_range", "subset_as_number", "subset_as_range",
+ "ipv4_prefix", "ipv4_range", "subset_ipv4_prefix", "subset_ipv4_range",
+ "ipv6_prefix", "ipv6_range", "subset_ipv6_prefix", "subset_ipv6_range")
+
def store(self, key, val):
if key in self.multivalue:
getattr(self, key).append(val)
else:
setattr(self, key, val)
+ b64content = ("peer_ta", "pkcs10_cert_request", "public_key", "signing_cert")
+
+ def endElement(self, name, text):
+ if name in self.b64content:
+ self.store(name, base64.b64decode(text))
+
+ pdu_objects = ("self", "child", "parent", "bsc", "repository", "route_origin",
+ "list_resources", "report_error")
+
def startElement(self, name, attrs):
- if name == self.name:
+ if name in pdu_objects:
sax_utils.snarf_attribute(self, attrs, self.attributes)
+ else:
+ getattr(self, "handle_" + name)(name, attrs)
- 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 as_number_elt(base_elt): pass
-class bsc_link_elt(base_elt): pass
-class child_db_id_elt(base_elt): pass
-class extension_preference_elt(base_elt): pass
-class generate_keypair_elt(base_elt): pass
-class ipv4_prefix_elt(base_elt): pass
-class ipv4_range_elt(base_elt): pass
-class ipv6_prefix_elt(base_elt): pass
-class ipv6_range_elt(base_elt): pass
-class pkcs10_cert_request_elt(base_elt): pass
-class public_key_elt(base_elt): pass
-class publish_world_now_elt(base_elt): pass
-class reissue_elt(base_elt): pass
-class rekey_elt(base_elt): pass
-class repository_link_elt(base_elt): pass
-class revoke_elt(base_elt): pass
-class run_now_elt(base_elt): pass
-class sia_base_elt(base_elt): pass
-class signing_cert_elt(base_elt): pass
-class suppress_publication_elt(base_elt): pass
-class ta_elt(base_elt): pass
-class uri_elt(base_elt): pass
+ # handle_xxx methods not yet written
class self_elt(base_elt):
- name = "self"
attributes = ("action", "self_id")
- elements = { "extension_preference" : extension_preference_elt,
- "rekey" : rekey_elt,
- "revoke" : revoke_elt,
- "run_now" : run_now_elt,
- "publish_world_now" : publish_world_now_elt }
- multivalue = ("extension_preference",)
class bsc_elt(base_elt):
- name = "biz_signing_context"
attributes = ("action", "self_id", "biz_signing_context_id")
- elements = { "signing_cert" : signing_cert_elt,
- "generate_keypair" : generate_keypair_elt,
- "pkcs10_cert_request" : pkcs10_cert_request_elt,
- "public_key" : public_key_elt }
- multivalue = ("signing_cert",)
-
+
class parent_elt(base_elt):
- name = "parent"
attributes = ("action", "self_id", "parent_id")
- elements = { "ta" : ta_elt,
- "uri" : uri_elt,
- "sia_base" : sia_base_elt,
- "biz_signing_context" : bsc_link_elt,
- "repository" : repository_link_elt,
- "rekey" : rekey_elt,
- "reissue" : reissue_elt,
- "revoke" : revoke_elt }
class child_elt(base_elt):
- name = "child"
attributes = ("action", "self_id", "child_id")
- elements = { "ta" : ta_elt,
- "biz_signing_context" : bsc_link_elt,
- "child_db_id" : child_db_id_elt,
- "reissue" : reissue_elt }
class repository_elt(base_elt):
- name = "repository"
attributes = ("action", "self_id", "repository_id")
- elements = { "ta" : ta_elt,
- "uri" : uri_elt,
- "biz_signing_context" : bsc_link_elt }
class route_origin_elt(base_elt):
- name = "route_origin"
attributes = ("action", "self_id", "route_origin_id")
- elements = { "suppress_publication" : suppress_publication_elt,
- "as_number" : as_number_elt,
- "ipv4_prefix" : ipv4_prefix_elt,
- "ipv4_range" : ipv4_range_elt,
- "ipv6_prefix" : ipv6_prefix_elt,
- "ipv6_range" : ipv6_range_elt }
- multivalue = ("ipv4_prefix", "ipv4_range", "ipv6_prefix", "ipv6_range")
-
class list_resources_elt(base_elt):
- def startElement(self, name, attrs):
- sax_utils.snarf_attribute(self, attrs, ("self_id", "child_id"))
+ attributes = ("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"))
+ attributes = ("self_id", "error_code")
class msg(list):
"""
@@ -131,14 +86,14 @@ class msg(list):
version = 1
dispatch = {
- "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 }
+ "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, name, attrs):
if name == "msg":
@@ -171,3 +126,49 @@ class sax_handler(sax_utils.handler):
def endElement(self, name):
self.obj.endElement(name, self.get_text())
+
+
+# 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