diff options
author | Michael Elkins <melkins@tislabs.com> | 2011-06-09 20:07:11 +0000 |
---|---|---|
committer | Michael Elkins <melkins@tislabs.com> | 2011-06-09 20:07:11 +0000 |
commit | 949ff01f80f57cac773ec543d13fbf412ce27780 (patch) | |
tree | e0261799e20dc4106057777437cb29219b1b2e0e /rpkid/rpki/gui/cacheview/views.py | |
parent | 48ee451dad61a7e3b4222f85037db7a8b63d6fa9 (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.py | 132 |
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 |