aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpkid/portal-gui/scripts/rpkigui-rcynic.py28
-rw-r--r--rpkid/rpki/gui/cacheview/admin.py4
-rw-r--r--rpkid/rpki/gui/cacheview/models.py34
-rw-r--r--rpkid/rpki/gui/cacheview/templates/cacheview/cacheview_base.html6
-rw-r--r--rpkid/rpki/gui/cacheview/templates/cacheview/cert_detail.html9
-rw-r--r--rpkid/rpki/gui/cacheview/templates/cacheview/query_result.html2
-rw-r--r--rpkid/rpki/gui/cacheview/templates/cacheview/signedobject_detail.html4
-rw-r--r--rpkid/rpki/rcynic.py10
8 files changed, 83 insertions, 14 deletions
diff --git a/rpkid/portal-gui/scripts/rpkigui-rcynic.py b/rpkid/portal-gui/scripts/rpkigui-rcynic.py
index 16fc64c4..dc74b2ec 100644
--- a/rpkid/portal-gui/scripts/rpkigui-rcynic.py
+++ b/rpkid/portal-gui/scripts/rpkigui-rcynic.py
@@ -21,7 +21,7 @@ import os, sys, time, vobject
os.environ['DJANGO_SETTINGS_MODULE'] = 'rpki.gui.settings'
from rpki.gui.cacheview import models
-from rpki.rcynic import rcynic_xml_iterator
+from rpki.rcynic import rcynic_xml_iterator, label_iterator
from rpki.sundial import datetime
from django.db import transaction
@@ -49,7 +49,7 @@ def process_object(obj, model_class):
# metadata that is updated on every run, regardless of whether the object
# has changed
inst.ok = obj.ok
- inst.status = obj.status
+ inst.status = models.ValidationStatus.objects.get(label=obj.status)
inst.timestamp = datetime.fromXMLtime(obj.timestamp).to_sql()
# determine if the object is changed/new
@@ -227,6 +227,29 @@ def process_cache(root, xml_file):
stop = time.time()
sys.stdout.write('elapsed time %d seconds.\n' % (stop - start))
+def process_labels(xml_file):
+ if debug:
+ sys.stderr.write('updating labels...\n')
+
+ transaction.enter_transaction_management()
+ transaction.managed()
+ kinds = { 'good': 0, 'warn': 1, 'bad': 2 }
+ for label, kind, desc in label_iterator(xml_file):
+ if debug:
+ sys.stderr.write('label=%s kind=%s desc=%s\n' % (label, kind, desc))
+ if kind:
+ q = models.ValidationStatus.objects.filter(label=label)
+ if not q:
+ obj = models.ValidationStatus(label=label)
+ else:
+ obj = q[0]
+
+ obj.kind = kinds[kind]
+ obj.status = desc
+ obj.save()
+ transaction.commit()
+ transaction.leave_transaction_management()
+
if __name__ == '__main__':
import optparse
@@ -243,6 +266,7 @@ if __name__ == '__main__':
if options.debug:
debug = True
+ process_labels(options.logfile)
process_cache(options.root, options.logfile)
# vim:sw=4 ts=8
diff --git a/rpkid/rpki/gui/cacheview/admin.py b/rpkid/rpki/gui/cacheview/admin.py
index af8b31da..2b88c1f3 100644
--- a/rpkid/rpki/gui/cacheview/admin.py
+++ b/rpkid/rpki/gui/cacheview/admin.py
@@ -37,11 +37,15 @@ class ROAAdmin(admin.ModelAdmin):
class GhostbusterAdmin(admin.ModelAdmin):
pass
+class ValidationStatusAdmin(admin.ModelAdmin):
+ pass
+
admin.site.register(models.AddressRange, AddressRangeAdmin)
admin.site.register(models.ASRange, AddressRangeAdmin)
admin.site.register(models.Cert, CertAdmin)
admin.site.register(models.Ghostbuster, GhostbusterAdmin)
admin.site.register(models.ROA, ROAAdmin)
admin.site.register(models.ROAPrefix, ROAPrefixAdmin)
+admin.site.register(models.ValidationStatus, ValidationStatusAdmin)
# vim:sw=4 ts=8
diff --git a/rpkid/rpki/gui/cacheview/models.py b/rpkid/rpki/gui/cacheview/models.py
index b00a1933..afdd2c74 100644
--- a/rpkid/rpki/gui/cacheview/models.py
+++ b/rpkid/rpki/gui/cacheview/models.py
@@ -73,6 +73,26 @@ class ASRange(models.Model):
def get_absolute_url(self):
return ('rpki.gui.cacheview.views.asrange_detail', [str(self.pk)])
+kinds = ( (0, 'good'), (1, 'warn'), (2, 'bad') )
+
+class ValidationStatus(models.Model):
+ """
+ Represents a specific error condition defined in the rcynic XML
+ output file.
+ """
+ label = models.CharField(max_length=30, db_index=True, unique=True)
+ status = models.CharField(max_length=255)
+ kind = models.PositiveSmallIntegerField(choices=kinds)
+
+ def __unicode__(self):
+ return self.label
+
+ def kind_as_str(self):
+ return kinds[self.kind][1]
+
+ class Meta:
+ verbose_name_plural = 'ValidationStatuses'
+
class SignedObject(models.Model):
"""
Abstract class to hold common metadata for all signed objects.
@@ -80,16 +100,16 @@ class SignedObject(models.Model):
value for the 'related_name' attribute.
"""
# attributes from rcynic's output XML file
- uri = models.URLField(unique=True, db_index=True)
- timestamp = models.DateTimeField()
- ok = models.BooleanField()
- status = models.CharField(max_length=255)
+ uri = models.URLField(unique=True, db_index=True)
+ timestamp = models.DateTimeField()
+ ok = models.BooleanField()
+ status = models.ForeignKey('ValidationStatus')
- mtime = models.PositiveIntegerField(default=0)
+ mtime = models.PositiveIntegerField(default=0)
# validity period from EE cert which signed object
- not_before = models.DateTimeField()
- not_after = models.DateTimeField()
+ not_before = models.DateTimeField()
+ not_after = models.DateTimeField()
class Meta:
abstract = True
diff --git a/rpkid/rpki/gui/cacheview/templates/cacheview/cacheview_base.html b/rpkid/rpki/gui/cacheview/templates/cacheview/cacheview_base.html
index 1947401c..65f8da07 100644
--- a/rpkid/rpki/gui/cacheview/templates/cacheview/cacheview_base.html
+++ b/rpkid/rpki/gui/cacheview/templates/cacheview/cacheview_base.html
@@ -1,5 +1,11 @@
{% extends "base.html" %}
+{% block css %}
+.good { background-color: #77ff77 }
+.warn { background-color: yellow }
+.bad { background-color: #ff5500 }
+{% endblock %}
+
{% block sidebar %}
<ul class='compact'>
<li><a href="/cacheview/search">resource search</a>
diff --git a/rpkid/rpki/gui/cacheview/templates/cacheview/cert_detail.html b/rpkid/rpki/gui/cacheview/templates/cacheview/cert_detail.html
index 276aa8b2..46d84d61 100644
--- a/rpkid/rpki/gui/cacheview/templates/cacheview/cert_detail.html
+++ b/rpkid/rpki/gui/cacheview/templates/cacheview/cert_detail.html
@@ -60,10 +60,15 @@ Resource Certificate Detail
<h3>ROAs</h3>
{% if object.roas.all %}
<table>
- <tr><th>Prefix</th><th>AS</th></tr>
+ <tr><th>Prefix</th><th>AS</th><th>Valid</th><th>Until</th></tr>
{% for roa in object.roas.all %}
{% for pfx in roa.prefixes.all %}
- <tr><td>{{ pfx }}</td><td>{{ roa.asid }}</td></tr>
+ <tr>
+ <td>{{ pfx }}</td>
+ <td>{{ roa.asid }}</td>
+ <td class='{{ roa.status.kind_as_str }}'><a href="{{ roa.get_absolute_url }}">{{ roa.ok }}</a></td>
+ <td>{{ roa.not_after }}</td>
+ </tr>
{% endfor %}
{% endfor %}
</table>
diff --git a/rpkid/rpki/gui/cacheview/templates/cacheview/query_result.html b/rpkid/rpki/gui/cacheview/templates/cacheview/query_result.html
index 3bc7e259..3c354f27 100644
--- a/rpkid/rpki/gui/cacheview/templates/cacheview/query_result.html
+++ b/rpkid/rpki/gui/cacheview/templates/cacheview/query_result.html
@@ -10,7 +10,7 @@
<tr>
<td>{{ object.0 }}</td>
<td>{{ object.1.asid }}</td>
- <td><a href="{{ object.1.get_absolute_url }}">{{ object.1.ok }}</a></td>
+ <td class='{{ object.1.status.kind_as_str }}'><a href="{{ object.1.get_absolute_url }}">{{ object.1.ok }}</a></td>
<td>{{ object.1.not_after }}</td>
</tr>
{% endfor %}
diff --git a/rpkid/rpki/gui/cacheview/templates/cacheview/signedobject_detail.html b/rpkid/rpki/gui/cacheview/templates/cacheview/signedobject_detail.html
index aa2ec444..e18b3cf4 100644
--- a/rpkid/rpki/gui/cacheview/templates/cacheview/signedobject_detail.html
+++ b/rpkid/rpki/gui/cacheview/templates/cacheview/signedobject_detail.html
@@ -9,11 +9,11 @@
<tr><td>URI</td><td>{{ object.uri }}</td></tr>
<tr><td>Last Modified</td><td>{{ object.mtime_as_datetime|date:"DATETIME_FORMAT" }}</td></tr>
<tr><td>Timestamp</td><td>{{ object.timestamp }}</td></tr>
- <tr><td>Status</td><td>{{ object.status }}</td></tr>
+ <tr><td>Status</td><td class='{{ object.status.kind_as_str }}'>{{ object.status.status }}</td></tr>
<tr><td>Valid</td><td>{{ object.ok }}</td></tr>
</table>
-<h2>Auth Info</h2>
+<h2>X.509 Certificate Info</h2>
<table>
<tr><td>Validity</td><td>{{ object.not_before }} - {{ object.not_after }}</td></tr>
diff --git a/rpkid/rpki/rcynic.py b/rpkid/rpki/rcynic.py
index 2f6ffe12..0d258542 100644
--- a/rpkid/rpki/rcynic.py
+++ b/rpkid/rpki/rcynic.py
@@ -238,6 +238,16 @@ class rcynic_xml_iterator(object):
if ext in file_name_classes:
yield file_name_classes[ext](filename = filename, uri = uri, ok = ok, status = status, timestamp = timestamp)
+def label_iterator(xml_file):
+ """
+ Returns an iterator which contains all defined labels from an rcynic XML
+ output file. Each item is a tuple of the form
+ (label, kind, description).
+ """
+
+ for label in ElementTree(file=xml_file).find("labels"):
+ yield label.tag, label.get("kind"), label.text.strip()
+
if __name__ == "__main__":
if False:
for i in rcynic_file_iterator("/u/sra/rpki/subvert-rpki.hactrn.net/rcynic/rcynic-data"):