aboutsummaryrefslogtreecommitdiff
path: root/rpkid/rpki
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2012-01-17 05:04:08 +0000
committerMichael Elkins <melkins@tislabs.com>2012-01-17 05:04:08 +0000
commite7e15ecf096b185b9c1b98579aed8706ec957380 (patch)
tree3a0c0caf9a782a14f89e753cadc267ce31661841 /rpkid/rpki
parent81616634d76f6c424dea82d785fe768f4dbd106e (diff)
display routes matching ROA request to be deleted
remove breadcrumb from template svn path=/branches/tk161/; revision=4179
Diffstat (limited to 'rpkid/rpki')
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html38
-rw-r--r--rpkid/rpki/gui/app/views.py69
2 files changed, 90 insertions, 17 deletions
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html b/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html
index 27854f6b..9b53e4a9 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html
@@ -1,26 +1,36 @@
-{% extends "base.html" %}
+{% extends "rpkigui/app_base.html" %}
{% block content %}
-<ul class='breadcrumb'>
- <li><a href="{% url rpki.gui.app.views.dashboard %}">{{request.session.handle}}</a> <span class='divider'>/</span></li>
- <li><a href="{{ object.prefix.get_absolute_url }}">{{ object.prefix }}</a> <span class='divider'>/</span></li>
- <li class='active'>Delete ROA Request</li>
-</ul>
-
<div class='page-header'>
<h1>Delete ROA Request</h1>
</div>
-<p>Please confirm that you would like to delete the following ROA request:</p>
+<p>Please confirm that you would like to delete the following ROA request:
-<table>
- <tr><td>AS</td> <td>{{ object.roa.asn }}</td></tr>
- <tr><td>Prefix</td> <td><a href="{{ object.prefix.get_absolute_url }}">{{ object.prefix }}</a></td></tr>
- <tr><td>Max Length</td><td>{{ object.max_length }}</td></tr>
+<table style='condensed-table'>
+ <tr><th>AS</th> <td>{{ object.roa.asn }}</td></tr>
+ <tr><th>Prefix</th> <td><a href="{{ object.prefix.get_absolute_url }}">{{ object.prefix }}</a></td></tr>
+ <tr><th>Max Length</th><td>{{ object.max_length }}</td></tr>
</table>
-<p></p><!--add some space-->
+<p>The following table shows what the validation status for the routing entries
+that are covered by this ROA will be if this ROA request is deleted:
+
+<table style='zebra-striped condensed-table'>
+ <tr>
+ <th>Prefix</th>
+ <th>Origin AS</th>
+ <th>Validation Status</th>
+ </tr>
+ {% for r in routes %}
+ <tr>
+ <td>{{ r.get_prefix_display }}</td>
+ <td>{{ r.asn }}</td>
+ <td><span class='label {{ r.status_label }}'>{{ r.status }}</span>
+ </tr>
+ {% endfor %}
+</table>
<form method='POST' action='{{ request.get_full_path }}'>
{% csrf_token %}
@@ -31,3 +41,5 @@
</form>
{% endblock %}
+
+<!-- vim:set sw=2: -->
diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py
index f255f2fb..ea3285fe 100644
--- a/rpkid/rpki/gui/app/views.py
+++ b/rpkid/rpki/gui/app/views.py
@@ -392,9 +392,7 @@ def prefix_delete_view(request, pk):
@handle_required
def roa_request_delete_view(request, pk):
- """
- Remove a ROA request from a particular prefix.
- """
+ "Remove a ROA request from a particular prefix."
log = request.META['wsgi.errors']
handle = request.session['handle']
@@ -411,7 +409,24 @@ def roa_request_delete_view(request, pk):
glue.configure_resources(log, handle)
return http.HttpResponseRedirect(prefix.get_absolute_url())
- return render('rpkigui/roa_request_confirm_delete.html', { 'object': obj }, request)
+ match = roa_match(prefix.as_resource_range())
+
+ roa_pfx = obj.as_roa_prefix()
+
+ pfx = 'prefixes' if isinstance(roa_pfx, rpki.resource_set.roa_prefix_ipv4) else 'prefixes_v6'
+ args = { '%s__prefix_min' % pfx : roa_pfx.min(),
+ '%s__prefix_max' % pfx : roa_pfx.max(),
+ '%s__max_length' % pfx : roa_pfx.max_prefixlen }
+
+ # exclude ROAs which seem to match this request and display the result
+ routes = []
+ for route, roas in match:
+ qs = roas.exclude(asid=obj.roa.asn, **args)
+ validate_route(route, qs)
+ routes.append(route)
+
+ return render('rpkigui/roa_request_confirm_delete.html', { 'object': obj,
+ 'routes': routes }, request)
@handle_required
def asn_allocate_view(request, pk):
@@ -904,6 +919,52 @@ def destroy_handle(request, handle):
return render('rpkigui/destroy_handle_form.html', { 'form': form ,
'handle': handle }, request)
+def roa_match(rng):
+ object_accepted = rpki.gui.cacheview.models.ValidationLabel.objects.get(label='object_accepted')
+
+ if isinstance(rng, rpki.resource_set.resource_range_ipv6):
+ route_manager = rpki.gui.routeview.models.RouteOriginV6.objects
+ pfx = 'prefixes_v6'
+ else:
+ route_manager = rpki.gui.routeview.models.RouteOrigin.objects
+ pfx = 'prefixes'
+
+ rv = []
+ for obj in route_manager.filter(prefix_min__gte=rng.min, prefix_max__lte=rng.max):
+ # This is a bit of a gross hack, since the foreign keys for v4 and v6
+ # prefixes have different names.
+ args = { '%s__prefix_min__lte' % pfx: obj.prefix_min,
+ '%s__prefix_max__gte' % pfx: obj.prefix_max }
+ roas = rpki.gui.cacheview.models.ROA.objects.filter(
+ statuses__status=object_accepted,
+ **args)
+ rv.append((obj, roas))
+
+ return rv
+
+def validate_route(route, roas):
+
+ pfx = 'prefixes' if isinstance(route, rpki.gui.routeview.models.RouteOrigin) else 'prefixes_v6'
+ args = { 'asid': route.asn,
+ '%s__prefix_min__lte' % pfx: route.prefix_min,
+ '%s__prefix_max__gte' % pfx: route.prefix_max,
+ '%s__max_length__gte' % pfx: route.prefixlen() }
+
+ # 2. if the candidate ROA set is empty, end with unknown
+ if not roas.exists():
+ route.status = 'unknown'
+ route.status_label = 'warning'
+ # 3. if any candidate roa matches the origin AS and max_length, end with valid
+ #
+ # AS0 is always invalid.
+ elif route.asn != 0 and roas.filter(**args).exists():
+ route.status_label = 'success'
+ route.status = 'valid'
+ # 4. otherwise the route is invalid
+ else:
+ route.status_label = 'important'
+ route.status = 'invalid'
+
@handle_required
def route_view(request):
"""