diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/rpki/ipaddrs.py | 8 | ||||
-rw-r--r-- | scripts/rpki/relaxng.py | 4 | ||||
-rw-r--r-- | scripts/rpki/resource_set.py | 38 | ||||
-rw-r--r-- | scripts/rpki/up_down.py | 40 |
4 files changed, 90 insertions, 0 deletions
diff --git a/scripts/rpki/ipaddrs.py b/scripts/rpki/ipaddrs.py index e041e801..73e404ca 100644 --- a/scripts/rpki/ipaddrs.py +++ b/scripts/rpki/ipaddrs.py @@ -3,6 +3,10 @@ import socket, struct class v4addr(long): + """ + IPv4 address. Derived from long, but supports IPv4 print syntax. + """ + bits = 32 def __new__(cls, x): @@ -15,6 +19,10 @@ class v4addr(long): return socket.inet_ntop(socket.AF_INET, struct.pack("!I", long(self))) class v6addr(long): + """ + IPv6 address. Derived from long, but supports IPv6 print syntax. + """ + bits = 128 def __new__(cls, x): diff --git a/scripts/rpki/relaxng.py b/scripts/rpki/relaxng.py index 21f6d2b7..a4a6c00d 100644 --- a/scripts/rpki/relaxng.py +++ b/scripts/rpki/relaxng.py @@ -3,6 +3,10 @@ import os def relaxng(xml, rng): + """ + Validate a chunk of xml against a RelaxNG schema. + """ + i, o = os.popen4(("xmllint", "--noout", "--relaxng", rng, "-")) i.write(xml) i.close() diff --git a/scripts/rpki/resource_set.py b/scripts/rpki/resource_set.py index bc1e7c16..a0e71566 100644 --- a/scripts/rpki/resource_set.py +++ b/scripts/rpki/resource_set.py @@ -3,6 +3,10 @@ import re, ipaddrs class resource_range(object): + """ + Generic resource range type. Assumes underlying type is some kind of integer. + You probably don't want to use this type directly. + """ def __init__(self, min, max): assert min <= max, "Mis-ordered range: %s before %s" % (str(min), str(max)) @@ -16,6 +20,10 @@ class resource_range(object): return c class resource_range_as(resource_range): + """ + Range of Autonomous System Numbers. + Denote a single ASN by a range whose min and max values are identical. + """ def __str__(self): if self.min == self.max: @@ -24,6 +32,11 @@ class resource_range_as(resource_range): return str(self.min) + "-" + str(self.max) class resource_range_ip(resource_range): + """ + Range of (generic) IP addresses. Prefixes are converted to ranges + on input, and ranges that can be represented as prefixes are written + as prefixes on output. + """ def __str__(self): mask = self.min ^ self.max @@ -37,12 +50,22 @@ class resource_range_ip(resource_range): return str(self.min) + "/" + str(prefixlen) class resource_range_ipv4(resource_range_ip): + """ + Range of IPv4 addresses. + """ pass class resource_range_ipv6(resource_range_ip): + """ + Range of IPv6 addresses. + """ pass class resource_set(list): + """ + Generic resource set. List type containing resource ranges. + You probably don't want to use this type directly. + """ def __init__(self, s): if s: @@ -56,6 +79,9 @@ class resource_set(list): return ",".join(map(str, self)) class resource_set_as(resource_set): + """ + ASN resource set. + """ def parse(self, x): r = re.match("^([0-9]+)-([0-9]+)$", x) @@ -65,6 +91,10 @@ class resource_set_as(resource_set): return resource_range_as(long(x), long(x)) class resource_set_ip(resource_set): + """ + (Generic) IP address resource set. + You probably don't want to use this type directly. + """ def parse(self, x): r = re.match("^([0-9:.a-fA-F]+)-([0-9:.a-fA-F]+)$", x) @@ -81,9 +111,17 @@ class resource_set_ip(resource_set): raise RuntimeError, 'Bad IP resource "%s"' % (x) class resource_set_ipv4(resource_set_ip): + """ + IPv4 address resource set. + """ + addr_type = ipaddrs.v4addr range_type = resource_range_ipv4 class resource_set_ipv6(resource_set_ip): + """ + IPv6 address resource set. + """ + addr_type = ipaddrs.v6addr range_type = resource_range_ipv6 diff --git a/scripts/rpki/up_down.py b/scripts/rpki/up_down.py index f595eb24..7435a1d5 100644 --- a/scripts/rpki/up_down.py +++ b/scripts/rpki/up_down.py @@ -3,6 +3,12 @@ import base64, xml.sax, resource_set def snarf(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: @@ -12,6 +18,9 @@ def snarf(obj, attrs, key, func=None): setattr(obj, key, val) class msg(object): + """ + Base type for Up-Down protocol PDU. + """ def __str__(self): return ('\ @@ -34,6 +43,9 @@ class msg(object): pass class cert(object): + """ + Up-Down protocol representation of an issued certificate. + """ def __init__(self, attrs): snarf(self, attrs, "cert_url") @@ -53,6 +65,9 @@ class cert(object): return xml class klass(object): + """ + Up-Down protocol representation of a resource class. + """ def __init__(self, attrs): snarf(self, attrs, "class_name") @@ -81,9 +96,15 @@ class klass(object): return xml class list(msg): + """ + Up-Down protocol "list" PDU. + """ pass class list_response(msg): + """ + Up-Down protocol "list_response" PDU. + """ def __init__(self): self.klasses = [] @@ -104,6 +125,9 @@ class list_response(msg): return "".join(map(str, self.klasses)) class issue(msg): + """ + Up-Down protocol "issue" PDU. + """ def startElement(self, name, attrs): assert name == "request" @@ -127,12 +151,18 @@ class issue(msg): return xml + ">" + base64.b64encode(self.pkcs10) + "</request>\n" class issue_response(list_response): + """ + Up-Down protocol "issue_response" PDU. + """ def toXML(self): assert len(self.klasses) == 1 return list_response.toXML(self) class revoke(msg): + """ + Up-Down protocol "revoke" PDU. + """ def startElement(self, name, attrs): snarf(self, attrs, "class_name") @@ -142,9 +172,15 @@ class revoke(msg): return (' <key class_name="%s" ski="%s" />\n' % (self.class_name, self.ski)) class revoke_response(revoke): + """ + Up-Down protocol "revoke_response" PDU. + """ pass class error_response(msg): + """ + Up-Down protocol "error_response" PDU. + """ def toXML(self): return ' <status>%d</status>\n' % self.status @@ -158,6 +194,10 @@ class error_response(msg): self.description = text class sax_handler(xml.sax.handler.ContentHandler): + """ + SAX handler for Up-Down protocol. Builds message PDU then + dispatches to that class's handler for nested data. + """ def __init__(self): self.text = "" |