aboutsummaryrefslogtreecommitdiff
path: root/rpkid/rpki/gui/cacheview/views.py
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2011-06-09 20:07:11 +0000
committerMichael Elkins <melkins@tislabs.com>2011-06-09 20:07:11 +0000
commit949ff01f80f57cac773ec543d13fbf412ce27780 (patch)
treee0261799e20dc4106057777437cb29219b1b2e0e /rpkid/rpki/gui/cacheview/views.py
parent48ee451dad61a7e3b4222f85037db7a8b63d6fa9 (diff)
add support for browing the rcynic cache
svn path=/rpkid/portal-gui/scripts/rpkigui-rcynic.py; revision=3859
Diffstat (limited to 'rpkid/rpki/gui/cacheview/views.py')
-rw-r--r--rpkid/rpki/gui/cacheview/views.py132
1 files changed, 132 insertions, 0 deletions
diff --git a/rpkid/rpki/gui/cacheview/views.py b/rpkid/rpki/gui/cacheview/views.py
new file mode 100644
index 00000000..733dc5b1
--- /dev/null
+++ b/rpkid/rpki/gui/cacheview/views.py
@@ -0,0 +1,132 @@
+"""
+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
+
+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.ipaddrs import v4addr, v6addr
+
+# Create your views here.
+
+def address_detail(request, pk):
+ return list_detail.object_detail(request, models.AddressRange.objects.all(), pk)
+
+def as_detail(request, pk):
+ return list_detail.object_detail(request, models.ASRange.objects.all(), pk)
+
+def roa_detail(request, pk):
+ return list_detail.object_detail(request, models.ROA.objects.all(), pk)
+
+def cert_detail(request, pk):
+ return list_detail.object_detail(request, models.Cert.objects.all(), pk)
+
+def ghostbuster_detail(request, pk):
+ return list_detail.object_detail(request, models.Ghostbuster.objects.all(), pk)
+
+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__gte=r.min, addresses__max__lte=r.max).distinct()
+ roas = models.ROA.objects.filter(prefixes__family=family, prefixes__prefix=str(r.min)).distinct()
+ 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)
+
+ 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 cmp_prefix(x,y):
+ r = cmp(x[0].family, y[0].family)
+ if r == 0:
+ r = cmp(x[2], y[2]) # integer address
+ if r == 0:
+ r = cmp(x[0].bits, y[0].bits)
+ if r == 0:
+ r = cmp(x[0].max_length, y[0].max_length)
+ if r == 0:
+ 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
+ information.
+ """
+
+ 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)
+ prefixes = models.ROAPrefix.objects.filter(family=family, prefix=str(r.min))
+
+ prefix_list = []
+ for pfx in prefixes:
+ for roa in pfx.roas.all():
+ prefix_list.append((pfx, roa))
+ elif asn:
+ r = resource_range_as.parse_str(asn)
+ roas = models.ROA.objects.filter(asid__gte=r.min, asid__lte=r.max)
+
+ # display the results sorted by prefix
+ prefix_list = []
+ for roa in roas:
+ for pfx in roa.prefixes.all():
+ if pfx.family == 4:
+ addr = v4addr(pfx.prefix.encode())
+ elif pfx.family == 6:
+ addr = v6addr(pfx.prefix.encode())
+
+ prefix_list.append((pfx, roa, addr))
+ prefix_list.sort(cmp=cmp_prefix)
+
+ return render('cacheview/query_result.html',
+ { 'object_list': prefix_list }, request)
+ else:
+ form = forms.SearchForm()
+
+ return render('cacheview/search_form.html', { 'form':form, 'search_type': 'ROA ' }, request)
+
+# vim:sw=4 ts=8 expandtab