diff options
-rw-r--r-- | rpkid/portal-gui/scripts/rpkigui-rcynic.py | 28 | ||||
-rw-r--r-- | rpkid/rpki/gui/cacheview/admin.py | 4 | ||||
-rw-r--r-- | rpkid/rpki/gui/cacheview/models.py | 34 | ||||
-rw-r--r-- | rpkid/rpki/gui/cacheview/templates/cacheview/cacheview_base.html | 6 | ||||
-rw-r--r-- | rpkid/rpki/gui/cacheview/templates/cacheview/cert_detail.html | 9 | ||||
-rw-r--r-- | rpkid/rpki/gui/cacheview/templates/cacheview/query_result.html | 2 | ||||
-rw-r--r-- | rpkid/rpki/gui/cacheview/templates/cacheview/signedobject_detail.html | 4 | ||||
-rw-r--r-- | rpkid/rpki/rcynic.py | 10 |
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"): |