aboutsummaryrefslogtreecommitdiff
path: root/rpkid/rpki/gui/cacheview/views.py
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2013-09-19 16:25:32 +0000
committerMichael Elkins <melkins@tislabs.com>2013-09-19 16:25:32 +0000
commit624ffc04f65e45b3e6268189a498780e68b7734a (patch)
tree41ef1060e864dc8cbe332e4d71c1f37269fe5a64 /rpkid/rpki/gui/cacheview/views.py
parentb9794bb9ad89edb742df8d1052c7981f0f8f825d (diff)
update cacheview interface to match the style of the main app
svn path=/trunk/; revision=5496
Diffstat (limited to 'rpkid/rpki/gui/cacheview/views.py')
-rw-r--r--rpkid/rpki/gui/cacheview/views.py157
1 files changed, 91 insertions, 66 deletions
diff --git a/rpkid/rpki/gui/cacheview/views.py b/rpkid/rpki/gui/cacheview/views.py
index ffb04136..94870eb2 100644
--- a/rpkid/rpki/gui/cacheview/views.py
+++ b/rpkid/rpki/gui/cacheview/views.py
@@ -1,92 +1,104 @@
-"""
-Copyright (C) 2011 SPARTA, Inc. dba Cobham Analytic Solutions
-
-Permission to use, copy, modify, and distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND SPARTA DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL SPARTA BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-"""
-
-from django.views.generic import list_detail
-from django.shortcuts import get_object_or_404, redirect
+# Copyright (C) 2011 SPARTA, Inc. dba Cobham Analytic Solutions
+# Copyright (C) 2013 SPARTA, Inc. a Parsons Company
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND SPARTA DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL SPARTA BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
+
+__version__ = '$Id$'
+
+from django.views.generic import DetailView
+from django.shortcuts import render
+from django.db.models import F
from rpki.gui.cacheview import models, forms, misc
-from rpki.gui.app.views import render
-from rpki.resource_set import resource_range_as
+from rpki.resource_set import resource_range_as, resource_range_ip
from rpki.POW import IPAddress
+from rpki.exceptions import BadIPResource
-# Create your views here.
def cert_chain(obj):
"""
returns an iterator covering all certs from the root cert down to the EE.
"""
- chain = [ obj ]
+ chain = [obj]
while obj != obj.issuer:
obj = obj.issuer
chain.append(obj)
return zip(range(len(chain)), reversed(chain))
-def signed_object_detail(request, model_class, pk):
- """
- wrapper around object_detail which fetches the x.509 cert chain for signed
- objects.
- """
- obj = get_object_or_404(model_class, pk=pk)
- return list_detail.object_detail(request, queryset=model_class.objects.all(),
- object_id=pk, extra_context={ 'chain': cert_chain(obj) })
-def addressrange_detail(request, pk):
- return list_detail.object_detail(request, models.AddressRange.objects.all(), pk)
+class SignedObjectDetailView(DetailView):
+ def get_context_data(self, **kwargs):
+ context = super(SignedObjectDetailView,
+ self).get_context_data(**kwargs)
+ context['chain'] = cert_chain(self.object)
+ return context
-def asrange_detail(request, pk):
- return list_detail.object_detail(request, models.ASRange.objects.all(), pk)
-def roa_detail(request, pk):
- return signed_object_detail(request, models.ROA, pk)
+class RoaDetailView(SignedObjectDetailView):
+ model = models.ROA
-def cert_detail(request, pk):
- return signed_object_detail(request, models.Cert, pk)
-def ghostbuster_detail(request, pk):
- return signed_object_detail(request, models.Ghostbuster, pk)
+class CertDetailView(SignedObjectDetailView):
+ model = models.Cert
-def search_view(request):
- if request.method == 'POST':
- form = forms.SearchForm(request.POST, request.FILES)
- if form.is_valid():
- certs = None
- roas = None
- addr = form.cleaned_data.get('addr')
- asn = form.cleaned_data.get('asn')
-
- if addr:
- family, r = misc.parse_ipaddr(addr)
- certs = models.Cert.objects.filter(addresses__family=family, addresses__min=str(r.min), addresses__max=str(r.max))
- roas = models.ROA.objects.filter(prefixes__family=family, prefixes__prefix=str(r.min))
- elif asn:
- r = resource_range_as.parse_str(asn)
- certs = models.Cert.objects.filter(asns__min__gte=r.min, asns__max__lte=r.max)
- roas = models.ROA.objects.filter(asid__gte=r.min, asid__lte=r.max)
+class GhostbusterDetailView(SignedObjectDetailView):
+ model = models.Ghostbuster
- return render('cacheview/search_result.html', { 'certs': certs, 'roas': roas }, request)
- else:
- form = forms.SearchForm()
- return render('cacheview/search_form.html', { 'form': form, 'search_type': 'Resource' }, request)
+def search_view(request):
+ certs = None
+ roas = None
-def cmp_prefix(x,y):
+ if request.method == 'POST':
+ form = forms.SearchForm2(request.POST, request.FILES)
+ if form.is_valid():
+ resource = form.cleaned_data.get('resource')
+ # try to determine the type of input given
+ try:
+ r = resource_range_as.parse_str(resource)
+ certs = models.Cert.objects.filter(asns__min__gte=r.min,
+ asns__max__lte=r.max)
+ roas = models.ROA.objects.filter(asid__gte=r.min,
+ asid__lte=r.max)
+ except:
+ try:
+ r = resource_range_ip.parse_str(resource)
+ if r.version == 4:
+ certs = models.Cert.objects.filter(
+ addresses__prefix_min__lte=r.min,
+ addresses__prefix_max__gte=r.max)
+ roas = models.ROA.objects.filter(
+ prefixes__prefix_min__lte=r.min,
+ prefixes__prefix_max__gte=r.max)
+ else:
+ certs = models.Cert.objects.filter(
+ addresses_v6__prefix_min__lte=r.min,
+ addresses_v6__prefix_max__gte=r.max)
+ roas = models.ROA.objects.filter(
+ prefixes_v6__prefix_min__lte=r.min,
+ prefixes_v6__prefix_max__gte=r.max)
+ except BadIPResource:
+ pass
+
+ return render(request, 'cacheview/search_result.html',
+ {'resource': resource, 'certs': certs, 'roas': roas})
+
+
+def cmp_prefix(x, y):
r = cmp(x[0].family, y[0].family)
if r == 0:
- r = cmp(x[2], y[2]) # integer address
+ r = cmp(x[2], y[2]) # integer address
if r == 0:
r = cmp(x[0].bits, y[0].bits)
if r == 0:
@@ -95,13 +107,15 @@ def cmp_prefix(x,y):
r = cmp(x[1].asid, y[1].asid)
return r
+
#def cmp_prefix(x,y):
# for attr in ('family', 'prefix', 'bits', 'max_length'):
# r = cmp(getattr(x[0], attr), getattr(y[0], attr))
# if r:
# return r
# return cmp(x[1].asid, y[1].asid)
-
+
+
def query_view(request):
"""
Allow the user to search for an AS or prefix, and show all published ROA
@@ -138,10 +152,21 @@ def query_view(request):
prefix_list.sort(cmp=cmp_prefix)
return render('cacheview/query_result.html',
- { 'object_list': prefix_list }, request)
+ {'object_list': prefix_list}, request)
else:
form = forms.SearchForm()
- return render('cacheview/search_form.html', { 'form':form, 'search_type': 'ROA ' }, request)
+ return render('cacheview/search_form.html', {
+ 'form': form, 'search_type': 'ROA '}, request)
+
+
+def global_summary(request):
+ """Display a table summarizing the state of the global RPKI."""
+
+ roots = models.Cert.objects.filter(issuer=F('pk')) # self-signed
+
+ return render(request, 'cacheview/global_summary.html', {
+ 'roots': roots
+ })
# vim:sw=4 ts=8 expandtab