diff options
author | Michael Elkins <melkins@tislabs.com> | 2012-01-17 05:04:08 +0000 |
---|---|---|
committer | Michael Elkins <melkins@tislabs.com> | 2012-01-17 05:04:08 +0000 |
commit | e7e15ecf096b185b9c1b98579aed8706ec957380 (patch) | |
tree | 3a0c0caf9a782a14f89e753cadc267ce31661841 /rpkid/rpki | |
parent | 81616634d76f6c424dea82d785fe768f4dbd106e (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.html | 38 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/views.py | 69 |
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): """ |