diff options
author | Rob Austein <sra@hactrn.net> | 2016-01-26 03:47:16 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2016-01-26 03:47:16 +0000 |
commit | 32fc12e0c1359311915358e4d3d8cee83902f384 (patch) | |
tree | 531889847b7d3e087741b81690326c0b81523ef0 /rpki/rcynicdb | |
parent | a2f628a14cb7b12b77829b9d0bbc8e948ea77337 (diff) |
Add (mostly) backwards-compatible iterator which handles finding
authenticated RP data via either os.walk() or Django ORM database
traversal.
svn path=/branches/tk705/; revision=6236
Diffstat (limited to 'rpki/rcynicdb')
-rw-r--r-- | rpki/rcynicdb/iterator.py | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/rpki/rcynicdb/iterator.py b/rpki/rcynicdb/iterator.py new file mode 100644 index 00000000..a754ed72 --- /dev/null +++ b/rpki/rcynicdb/iterator.py @@ -0,0 +1,49 @@ +""" +rcynic database iterator. + +At least for the moment, we attempt to provide an iterator that works +with both old-style (directory tree of file objects with names similar +to what wget would use) and new style (Django ORM) databases. +""" + +import os + +initialized_django = False + +def _uri_to_class(uri, class_map): + return class_map[uri[uri.rindex(".")+1:]] + +def authenticated_objects(directory_tree = None, uri_suffix = None, class_map = None): + + if class_map is None: + import rpki.POW + class_map = dict(cer = rpki.POW.X509, + crl = rpki.POW.CRL, + gbr = rpki.POW.CMS, + mft = rpki.POW.Manifest, + roa = rpki.POW.ROA) + + if directory_tree: + for head, dirs, files in os.walk(directory_tree): + for fn in files: + if uri_suffix is None or fn.endswith(uri_suffix): + fn = os.path.join(head, fn) + uri = "rsync://" + fn[len(directory_tree):].lstrip("/") + yield uri, _uri_to_class(uri, class_map).derReadFile(fn) + return + + global initialized_django + if not initialized_django: + os.environ.update(DJANGO_SETTINGS_MODULE = "rpki.django_settings.rcynic") + import django + django.setup() + initialized_django = True + + import rpki.rcynicdb + auth = rpki.rcynicdb.models.Authenticated.objects.order_by("-started").first() + if auth is None: + return + + q = auth.rpkiobject_set + for obj in q.filter(uri__endswith = uri_suffix) if uri_suffix else q.all(): + yield obj.uri, _uri_to_class(obj.uri, class_map).derRead(obj.der) |