diff options
author | Michael Elkins <melkins@tislabs.com> | 2013-09-19 16:25:32 +0000 |
---|---|---|
committer | Michael Elkins <melkins@tislabs.com> | 2013-09-19 16:25:32 +0000 |
commit | 624ffc04f65e45b3e6268189a498780e68b7734a (patch) | |
tree | 41ef1060e864dc8cbe332e4d71c1f37269fe5a64 /rpkid/rpki/gui/cacheview/views.py | |
parent | b9794bb9ad89edb742df8d1052c7981f0f8f825d (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.py | 157 |
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 |