aboutsummaryrefslogtreecommitdiff
path: root/scripts/rcynic-output-iterator.py
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2010-06-25 20:03:27 +0000
committerRob Austein <sra@hactrn.net>2010-06-25 20:03:27 +0000
commit8cba6eaf0c6057b3d88cc8ca33c8bbad0a177bc7 (patch)
tree017f5f1f954452d439ccfa2d802884d7edded1cf /scripts/rcynic-output-iterator.py
parentd8c5cdd304014cc202ecedad5507e0cb32cbeb78 (diff)
New classes representing result of iteration.
svn path=/scripts/rcynic-output-iterator.py; revision=3296
Diffstat (limited to 'scripts/rcynic-output-iterator.py')
-rw-r--r--scripts/rcynic-output-iterator.py136
1 files changed, 116 insertions, 20 deletions
diff --git a/scripts/rcynic-output-iterator.py b/scripts/rcynic-output-iterator.py
index 6f9cfb12..74000c19 100644
--- a/scripts/rcynic-output-iterator.py
+++ b/scripts/rcynic-output-iterator.py
@@ -33,12 +33,114 @@ class NotRsyncURI(rpki.exceptions.RPKI_Exception):
URI is not an rsync URI.
"""
+class rcynic_object(object):
+ """
+ An object read from rcynic cache.
+ """
+
+ def __init__(self, filename, **kwargs):
+ self.filename = filename
+ for k, v in kwargs.iteritems():
+ setattr(self, k, v)
+ self.obj = self.obj_class(DER_file = filename)
+
+ def __repr__(self):
+ return "<%s %s %s at 0x%x>" % (self.__class__.__name__, self.uri, self.resources, id(self))
+
+ def show_attrs(self, *attrs):
+ """
+ Print a bunch of object attributes, quietly ignoring any that
+ might be missing.
+ """
+ for a in attrs:
+ try:
+ print "%s: %s" % (a.capitalize(), getattr(self, a))
+ except AttributeError:
+ pass
+
+ def show(self):
+ """
+ Print common object attributes.
+ """
+ self.show_attrs("filename", "uri", "status", "timestamp")
+
+class rcynic_certificate(rcynic_object):
+ """
+ A certificate from rcynic cache.
+ """
+
+ obj_class = rpki.x509.X509
+
+ def __init__(self, filename, **kwargs):
+ rcynic_object.__init__(self, filename, **kwargs)
+ self.notBefore = self.obj.getNotBefore()
+ self.notAfter = self.obj.getNotAfter()
+ self.aia_uri = self.obj.get_aia_uri()
+ self.sia_directory_uri = self.obj.get_sia_directory_uri()
+ self.manifest_uri = self.obj.get_sia_manifest_uri()
+ self.resources = self.obj.get_3779resources()
+ self.is_ca = self.obj.is_CA()
+ self.serial = self.obj.getSerial()
+ self.issuer = self.obj.getIssuer()
+ self.subject = self.obj.getSubject()
+ self.ski = self.obj.hSKI()
+ self.aki = self.obj.hAKI()
+
+ def show(self):
+ """
+ Print certificate attributes.
+ """
+ rcynic_object.show(self)
+ self.show_attrs("notBefore", "notAfter", "aia_uri", "sia_directory_uri", "resources")
+
+class rcynic_roa(rcynic_object):
+ """
+ A ROA from rcynic cache.
+ """
+
+ obj_class = rpki.x509.ROA
+
+ _afi_map = dict((cls.resource_set_type.afi, cls)
+ for cls in (rpki.resource_set.roa_prefix_set_ipv4,
+ rpki.resource_set.roa_prefix_set_ipv6))
+
+ def __init__(self, filename, **kwargs):
+ rcynic_object.__init__(self, filename, **kwargs)
+ self.obj.extract()
+ self.asID = self.obj.get_content().asID.get()
+ self.prefix_sets = []
+ for fam in self.obj.get_content().ipAddrBlocks:
+ prefix_set = self._afi_map[fam.addressFamily.get()]()
+ addr_type = prefix_set.resource_set_type.range_type.datum_type
+ self.prefix_sets.append(prefix_set)
+ for addr in fam.addresses:
+ prefix = addr.address.get()
+ prefixlen = len(prefix)
+ prefix = addr_type(rpki.resource_set._bs2long(prefix, addr_type.bits, 0))
+ maxprefixlen = addr.maxLength.get()
+ prefix_set.append(prefix_set.prefix_type(prefix, prefixlen, maxprefixlen))
+ self.ee = rpki.x509.X509(POW = self.obj.get_POW().certs()[0])
+ self.notBefore = self.ee.getNotBefore()
+ self.notAfter = self.ee.getNotAfter()
+ self.aia_uri = self.ee.get_aia_uri()
+ self.resources = self.ee.get_3779resources()
+ self.issuer = self.ee.getIssuer()
+ self.subject = self.ee.getSubject()
+ self.aki = self.ee.hAKI()
+ self.ski = self.ee.hSKI()
+
+ def show(self):
+ """
+ Print ROA attributes.
+ """
+ rcynic_object.show(self)
+ self.show_attrs("notBefore", "notAfter", "aia_uri", "resources", "asID")
+ if self.prefix_sets:
+ print "Prefixes:", ",".join(str(i) for i in self.prefix_sets)
+
file_name_classes = {
- ".cer" : rpki.x509.X509,
- ".crl" : rpki.x509.CRL,
- ".roa" : rpki.x509.ROA,
- ".mnf" : rpki.x509.SignedManifest,
- ".mft" : rpki.x509.SignedManifest }
+ ".cer" : rcynic_certificate,
+ ".roa" : rcynic_roa }
class rcynic_file_iterator(object):
"""
@@ -54,12 +156,9 @@ class rcynic_file_iterator(object):
for root, dirs, files in os.walk(self.rcynic_dir):
for filename in files:
filename = os.path.join(root, filename)
- try:
- file_name_class = file_name_classes[os.path.splitext(filename)[1]]
- except KeyError:
- raise UnknownObject, "Unknown object type %r" % filename
- else:
- yield file_name_class(DER_file = filename)
+ ext = os.path.splitext(filename)[1]
+ if ext in file_name_classes:
+ yield file_name_classes[ext](filename)
class rcynic_xml_iterator(object):
"""
@@ -108,14 +207,9 @@ class rcynic_xml_iterator(object):
uri = validation_status.text.strip()
ok = status == "validation_ok"
filename = os.path.join(self.authenticated_subdir if ok else self.unauthenticated_subdir, self.uri_to_filename(uri))
- try:
- file_name_class = file_name_classes[os.path.splitext(filename)[1]]
- except KeyError:
- raise UnknownObject, 'Unknown object type "%s"' % filename
- obj = file_name_class(DER_file = filename)
- if isinstance(obj, rpki.x509.CMS_object):
- obj.extract()
- yield uri, ok, status, timestamp, obj
+ ext = os.path.splitext(filename)[1]
+ if ext in file_name_classes:
+ yield file_name_classes[ext](filename = filename, uri = uri, ok = ok, status = status, timestamp = timestamp)
if __name__ == "__main__":
if False:
@@ -123,4 +217,6 @@ if __name__ == "__main__":
print i
if True:
for i in rcynic_xml_iterator("/u/sra/rpki/subvert-rpki.hactrn.net/rcynic/rcynic-data", "/u/sra/rpki/subvert-rpki.hactrn.net/rcynic/rcynic.xml"):
- print i
+ #print i
+ i.show()
+ print