aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2011-06-14 19:02:25 +0000
committerMichael Elkins <melkins@tislabs.com>2011-06-14 19:02:25 +0000
commit9bfb5b58e179dc995606c7c9fcc534dd06b48a78 (patch)
tree65eae00f0de4e741013f1b64b5bf71c5d158530e
parentf9c0ff28cd7b84ec6bc17ed358a252adefd79695 (diff)
extrude validation status lables from the rcynic XML file and shove into django db
color code validation status in signed object detail views to make problems stand out svn path=/rpkid/portal-gui/scripts/rpkigui-rcynic.py; revision=3873
-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"):