diff options
author | Rob Austein <sra@hactrn.net> | 2016-02-21 06:40:55 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2016-02-21 06:40:55 +0000 |
commit | bfba2f73d1ad912c82f59c5541888d6a22c04f96 (patch) | |
tree | 9bd9ef1a545550fb8916f2913256062c715b3074 /rpki | |
parent | f0ca030449bd5878bf3a272b129e0d644480e9c5 (diff) |
We don't really need to store the full XML snapshot in SQL. We don't
really need to store the delta XML either, but that code's a bit more
complicated, so leave it alone for the moment.
svn path=/branches/tk705/; revision=6277
Diffstat (limited to 'rpki')
-rw-r--r-- | rpki/pubd.py | 1 | ||||
-rw-r--r-- | rpki/pubdb/migrations/0002_auto_20160221_0617.py | 22 | ||||
-rw-r--r-- | rpki/pubdb/models.py | 80 |
3 files changed, 55 insertions, 48 deletions
diff --git a/rpki/pubd.py b/rpki/pubd.py index 7ed13425..dbc9c12d 100644 --- a/rpki/pubd.py +++ b/rpki/pubd.py @@ -272,7 +272,6 @@ class main(object): if delta is not None: delta.activate() - self.session.generate_snapshot() self.session.expire_deltas() except Exception as e: diff --git a/rpki/pubdb/migrations/0002_auto_20160221_0617.py b/rpki/pubdb/migrations/0002_auto_20160221_0617.py new file mode 100644 index 00000000..a83ad3d3 --- /dev/null +++ b/rpki/pubdb/migrations/0002_auto_20160221_0617.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pubdb', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='session', + name='hash', + ), + migrations.RemoveField( + model_name='session', + name='snapshot', + ), + ] diff --git a/rpki/pubdb/models.py b/rpki/pubdb/models.py index 9d614ceb..580cb309 100644 --- a/rpki/pubdb/models.py +++ b/rpki/pubdb/models.py @@ -81,22 +81,13 @@ class Client(models.Model): class Session(models.Model): uuid = models.CharField(unique = True, max_length=36) serial = models.BigIntegerField() - snapshot = models.TextField(blank = True) - hash = models.CharField(max_length = 64, blank = True) - - ## @var keep_all_rrdp_files - # Debugging flag to prevent expiration of old RRDP files. - # This simplifies debugging delta code. Need for this - # may go away once RRDP is fully integrated into rcynic. - - keep_all_rrdp_files = False ## @var keep_these_files # Filenames which should not be deleted during cleanup. # Expected use is to allow us to store a root certificate # in in the RRDP base directory. - keep_these_files = set(["root.cer"]) + keep_these_files = set(["root.cer", "root.tal"]) def new_delta(self, expires): """ @@ -124,26 +115,6 @@ class Session(models.Model): self.delta_set.filter(expires__lt = rpki.sundial.now()).delete() - def generate_snapshot(self): - """ - Generate an XML snapshot of this session. - """ - - xml = Element(rrdp_tag_snapshot, nsmap = rrdp_nsmap, - version = rrdp_version, - session_id = self.uuid, - serial = str(self.serial)) - xml.text = "\n" - for obj in self.publishedobject_set.all(): - DERSubElement(xml, rrdp_tag_publish, - der = obj.der, - uri = obj.uri) - rpki.relaxng.rrdp.assertValid(xml) - self.snapshot = ElementToString(xml, pretty_print = True) - self.hash = rpki.x509.sha256(self.snapshot).encode("hex") - self.save() - - @property def snapshot_fn(self): return "%s/snapshot/%s.xml" % (self.uuid, self.serial) @@ -170,14 +141,29 @@ class Session(models.Model): return "%s/%s" % (rrdp_base_uri.rstrip("/"), fn) - def _generate_update_xml(self, rrdp_base_uri): + def _generate_snapshot(self): + xml = Element(rrdp_tag_snapshot, nsmap = rrdp_nsmap, + version = rrdp_version, + session_id = self.uuid, + serial = str(self.serial)) + xml.text = "\n" + for obj in self.publishedobject_set.all(): + DERSubElement(xml, rrdp_tag_publish, + der = obj.der, + uri = obj.uri) + rpki.relaxng.rrdp.assertValid(xml) + snapshot = ElementToString(xml, pretty_print = True) + return snapshot, rpki.x509.sha256(snapshot).encode("hex") + + + def _generate_update_xml(self, rrdp_base_uri, snapshot_hash): xml = Element(rrdp_tag_notification, nsmap = rrdp_nsmap, version = rrdp_version, session_id = self.uuid, serial = str(self.serial)) SubElement(xml, rrdp_tag_snapshot, uri = self._rrdp_filename_to_uri(self.snapshot_fn, rrdp_base_uri), - hash = self.hash) + hash = snapshot_hash) for delta in self.delta_set.all(): SubElement(xml, rrdp_tag_delta, uri = self._rrdp_filename_to_uri(delta.fn, rrdp_base_uri), @@ -192,31 +178,31 @@ class Session(models.Model): Write current RRDP files to disk, clean up old files and directories. """ - current_filenames = set() + current_filenames = self.keep_these_files.copy() for delta in self.delta_set.all(): self._write_rrdp_file(delta.fn, delta.xml, rrdp_publication_base) current_filenames.add(delta.fn) - self._write_rrdp_file(self.snapshot_fn, self.snapshot, rrdp_publication_base) + snapshot_xml, snapshot_hash = self._generate_snapshot() + self._write_rrdp_file(self.snapshot_fn, snapshot_xml, rrdp_publication_base) current_filenames.add(self.snapshot_fn) - self._write_rrdp_file(self.notification_fn, self._generate_update_xml(rrdp_base_uri), + self._write_rrdp_file(self.notification_fn, + self._generate_update_xml(rrdp_base_uri, snapshot_hash), rrdp_publication_base, overwrite = True) current_filenames.add(self.notification_fn) - if not self.keep_all_rrdp_files: - current_filenames |= self.keep_these_files - for root, dirs, files in os.walk(rrdp_publication_base, topdown = False): - for fn in files: - fn = os.path.join(root, fn) - if fn[len(rrdp_publication_base):].lstrip("/") not in current_filenames: - os.remove(fn) - for dn in dirs: - try: - os.rmdir(os.path.join(root, dn)) - except OSError: - pass + for root, dirs, files in os.walk(rrdp_publication_base, topdown = False): + for fn in files: + fn = os.path.join(root, fn) + if fn[len(rrdp_publication_base):].lstrip("/") not in current_filenames: + os.remove(fn) + for dn in dirs: + try: + os.rmdir(os.path.join(root, dn)) + except OSError: + pass class Delta(models.Model): |