aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2016-02-21 06:40:55 +0000
committerRob Austein <sra@hactrn.net>2016-02-21 06:40:55 +0000
commitbfba2f73d1ad912c82f59c5541888d6a22c04f96 (patch)
tree9bd9ef1a545550fb8916f2913256062c715b3074
parentf0ca030449bd5878bf3a272b129e0d644480e9c5 (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
-rw-r--r--rpki/pubd.py1
-rw-r--r--rpki/pubdb/migrations/0002_auto_20160221_0617.py22
-rw-r--r--rpki/pubdb/models.py80
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):