diff options
author | Rob Austein <sra@hactrn.net> | 2010-06-25 20:03:27 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2010-06-25 20:03:27 +0000 |
commit | 8cba6eaf0c6057b3d88cc8ca33c8bbad0a177bc7 (patch) | |
tree | 017f5f1f954452d439ccfa2d802884d7edded1cf /scripts/rcynic-output-iterator.py | |
parent | d8c5cdd304014cc202ecedad5507e0cb32cbeb78 (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.py | 136 |
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 |