aboutsummaryrefslogtreecommitdiff
path: root/portal-gui/rpkigui/myrpki/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'portal-gui/rpkigui/myrpki/views.py')
-rw-r--r--portal-gui/rpkigui/myrpki/views.py69
1 files changed, 60 insertions, 9 deletions
diff --git a/portal-gui/rpkigui/myrpki/views.py b/portal-gui/rpkigui/myrpki/views.py
index d78eec33..33502631 100644
--- a/portal-gui/rpkigui/myrpki/views.py
+++ b/portal-gui/rpkigui/myrpki/views.py
@@ -17,6 +17,7 @@ import forms
import glue
from asnset import asnset
from rpkigui.myrpki.misc import str_to_range
+from rpkigui.myrpki.asnset import asnset
# For each type of object, we have a detail view, a create view and
# an update view. We heavily leverage the generic views, only
@@ -87,7 +88,7 @@ def unallocated_resources(handle, roa_asns, roa_prefixes, asns, prefixes):
child_prefixes = []
for p in prefixes:
- child_prefixes.extend(o for o in p.children.filter(allocated__isnull=True).exclude(from_roa__in=roa_prefixes))
+ child_prefixes.extend(o for o in p.children.filter(allocated__isnull=True, roa_requests__isnull=True))
if child_asns or child_prefixes:
x, y = unallocated_resources(handle, roa_asns, roa_prefixes,
@@ -111,14 +112,14 @@ def dashboard(request):
# get list of ASNs used in my ROAs
roa_asns = [r.asn for r in handle.roas.all()]
# get list of address ranges included in ROAs
- roa_addrs = [p for r in handle.roas.all() for p in r.prefix.all()]
+ roa_addrs = [p.prefix for r in handle.roas.all() for p in r.from_roa_request.all()]
asns=[]
prefixes=[]
for p in handle.parents.all():
for c in p.resources.all():
asns.extend(c.asn.filter(allocated__isnull=True).exclude(lo__in=roa_asns))
- prefixes.extend(c.address_range.filter(allocated__isnull=True).exclude(from_roa__in=roa_addrs))
+ prefixes.extend(c.address_range.filter(allocated__isnull=True, roa_requests__isnull=True))
asns, prefixes = unallocated_resources(handle, roa_asns, roa_addrs, asns,
prefixes)
@@ -491,9 +492,18 @@ def prefix_allocate_view(request, pk):
return render('myrpki/prefix_view.html', { 'form': form,
'addr': prefix, 'form': form, 'parent': parent_set }, request)
+def parent_prefix(prefix):
+ '''Returns the top-most parent prefix for the given prefix.'''
+ while prefix.parent:
+ prefix = prefix.parent
+ return prefix
+
def common_cert(prefix, prefix_set):
'''Return true if prefix is derived from the same resource cert
as all the addresses in prefix_set.'''
+ while prefix.parent:
+ prefix = prefix.parent
+
# list of certs for the target prefix
certs = prefix.from_cert.all()
# all prefixes will have the same cert, so just check the first one
@@ -530,10 +540,34 @@ def update_roas(handle, prefix):
else:
# no roa is present for this ASN, create a new one
print 'creating new roa for asn %d with %s' % (asid, prefix)
- roa = models.Roa.objects.create(asn=asid, conf=handle, active=False)
+ roa = models.Roa.objects.create(asn=asid, conf=handle,
+ active=False)
roa.save()
roa.prefix.add(prefix)
+def add_roa_requests(handle, prefix, asns, max_length):
+ for asid in asns:
+ req_set = prefix.roa_requests.filter(roa__asn=asid,
+ max_length=max_length)
+ if not req_set:
+ # no req is present for this (ASN, prefix, max_length).
+
+ # find all roas with prefixes from the same resource cert
+ roa_set = handle.roas.filter(asn=asid,
+ from_roa_request__prefix__from_cert__in=prefix.from_cert.all())
+ if roa_set:
+ roa = roa_set[0]
+ else:
+ # no roa is present for this ASN, create a new one
+ print 'creating new roa for asn %d' % (asid,)
+ roa = models.Roa.objects.create(asn=asid, conf=handle,
+ active=False)
+ roa.save()
+
+ req = models.RoaRequest.objects.create(prefix=prefix, roa=roa,
+ max_length=max_length)
+ req.save()
+
@handle_required
def prefix_roa_view(request, pk):
handle = request.session['handle']
@@ -542,15 +576,15 @@ def prefix_roa_view(request, pk):
parent_set = get_parents_or_404(handle, obj)
if request.method == 'POST':
- form = forms.PrefixRoaForm(request.POST)
+ form = forms.PrefixRoaForm(obj, request.POST)
if form.is_valid():
- obj.asns = form.cleaned_data['asns']
- obj.save()
- update_roas(handle, obj)
+ asns = asnset(form.cleaned_data['asns'])
+ add_roa_requests(handle, obj, asns,
+ form.cleaned_data['max_length'])
glue.configure_resources(handle)
return http.HttpResponseRedirect(obj.get_absolute_url())
else:
- form = forms.PrefixRoaForm(initial={ 'asns': obj.asns })
+ form = forms.PrefixRoaForm(obj)
return render('myrpki/prefix_view.html', { 'form': form,
'addr': obj, 'form': form, 'parent': parent_set }, request)
@@ -575,6 +609,23 @@ def prefix_delete_view(request, pk):
'addr': obj, 'form': form, 'parent': parent_set }, request)
@handle_required
+def roa_request_delete_view(request, pk):
+ '''Remove a roa request from a particular prefix.'''
+ handle = request.session['handle']
+ obj = get_object_or_404(models.RoaRequest.objects, pk=pk)
+ prefix = obj.prefix
+ # ensure this resource range belongs to a parent of the current conf
+ parent_set = get_parents_or_404(handle, prefix)
+
+ roa = obj.roa
+ obj.delete()
+ if not roa.from_roa_request.all():
+ print 'removing empty roa for asn %d' % (roa.asn,)
+ roa.delete()
+
+ return http.HttpResponseRedirect(prefix.get_absolute_url())
+
+@handle_required
def asn_allocate_view(request, pk):
handle = request.session['handle']
obj = get_object_or_404(models.Asn.objects, pk=pk)