diff options
-rw-r--r-- | rpkid/portal-gui/Makefile.in | 6 | ||||
-rw-r--r-- | rpkid/portal-gui/apache.conf.in | 3 | ||||
-rw-r--r-- | rpkid/portal-gui/scripts/rpki-manage.in | 2 | ||||
-rw-r--r-- | rpkid/portal-gui/scripts/rpkigui-rcynic.py | 3 | ||||
-rw-r--r-- | rpkid/portal-gui/settings.py.in | 3 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/child_detail.html | 2 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/client_detail.html | 4 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html | 2 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/object_detail.html | 1 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/parent_detail.html | 4 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/repository_detail.html | 4 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/roa_detail.html | 4 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/route_detail.html | 43 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/route_roa_list.html | 19 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/routes_view.html | 2 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/urls.py | 8 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/views.py | 64 | ||||
-rw-r--r-- | rpkid/setup.py | 8 |
18 files changed, 114 insertions, 68 deletions
diff --git a/rpkid/portal-gui/Makefile.in b/rpkid/portal-gui/Makefile.in index a453552b..a7cd4519 100644 --- a/rpkid/portal-gui/Makefile.in +++ b/rpkid/portal-gui/Makefile.in @@ -41,16 +41,10 @@ apache.conf: $(srcdir)/apache.conf.in Makefile install: $(BUILD) if test -d $(SYSCONFDIR); then :; else ${INSTALL} -d $(SYSCONFDIR); fi - if test -d $(INSTDIR)/media/css; then :; else ${INSTALL} -d $(INSTDIR)/media/css; fi - if test -d $(INSTDIR)/media/img; then :; else ${INSTALL} -d $(INSTDIR)/media/img; fi - if test -d $(INSTDIR)/media/js; then :; else ${INSTALL} -d $(INSTDIR)/media/js; fi if test -d $(INSTDIR)/wsgi; then :; else ${INSTALL} -d $(INSTDIR)/wsgi; fi ${INSTALL} -m 644 apache.conf $(SYSCONFDIR)/apache.conf - ${INSTALL} -m 644 $(srcdir)/media/css/bootstrap.min.css $(INSTDIR)/media/css/bootstrap.min.css - ${INSTALL} -m 644 $(srcdir)/media/js/jquery-1.8.3.min.js $(INSTDIR)/media/js/jquery.min.js ${INSTALL} -m 644 rpki.wsgi $(INSTDIR)/wsgi/rpki.wsgi ${INSTALL} -m 644 settings.py ${SYSCONFDIR} - ${INSTALL} -m 644 -t $(INSTDIR)/media/img $(srcdir)/media/img/* deinstall uninstall: rm -rf $(INSTDIR) diff --git a/rpkid/portal-gui/apache.conf.in b/rpkid/portal-gui/apache.conf.in index 133d014a..61a4f0e4 100644 --- a/rpkid/portal-gui/apache.conf.in +++ b/rpkid/portal-gui/apache.conf.in @@ -25,8 +25,7 @@ Order deny,allow Allow from all </Directory> -Alias /media/ @INSTDIR@/media/ -Alias /site_media/ @INSTDIR@/media/ +Alias /static @INSTDIR@/static # redirect to the dashboard when someone hits the bare vhost RedirectMatch ^/$ /rpki/ diff --git a/rpkid/portal-gui/scripts/rpki-manage.in b/rpkid/portal-gui/scripts/rpki-manage.in index f9786898..fdd3ee3f 100644 --- a/rpkid/portal-gui/scripts/rpki-manage.in +++ b/rpkid/portal-gui/scripts/rpki-manage.in @@ -4,7 +4,7 @@ # $LANG is unset if [ -z "$LANG" ]; then echo '$LANG is unset, default to en_US.UTF-8' - exort LANG=en_US.UTF-8 + export LANG=en_US.UTF-8 fi export PYTHONPATH=@PYTHONPATH@${PYTHONPATH:+:}${PYTHONPATH} DJANGO_SETTINGS_MODULE=settings @DJANGO_ADMIN@ $* diff --git a/rpkid/portal-gui/scripts/rpkigui-rcynic.py b/rpkid/portal-gui/scripts/rpkigui-rcynic.py index 20973a0e..2e8e494f 100644 --- a/rpkid/portal-gui/scripts/rpkigui-rcynic.py +++ b/rpkid/portal-gui/scripts/rpkigui-rcynic.py @@ -1,5 +1,4 @@ # Copyright (C) 2011 SPARTA, Inc. dba Cobham -# Anaportal-gui/scripts/rpkigui-rcynic.py # Copyright (C) 2012 SPARTA, Inc. a Parsons Company # # Permission to use, copy, modify, and distribute this software for any @@ -175,7 +174,7 @@ def process_cache(root, xml_file): inst.mtime = mtime try: obj = vs.obj # causes object to be lazily loaded - except rpki.POW._der.DerError, e: + except Exception, e: logger.warning('Caught %s while processing %s: %s' % ( type(e), vs.filename, e)) continue diff --git a/rpkid/portal-gui/settings.py.in b/rpkid/portal-gui/settings.py.in index 0c939c28..7eed4aa7 100644 --- a/rpkid/portal-gui/settings.py.in +++ b/rpkid/portal-gui/settings.py.in @@ -106,4 +106,7 @@ TEMPLATE_CONTEXT_PROCESSORS = ( "django.core.context_processors.static" ) +# where to put static files +STATIC_ROOT = '/usr/local/share/rpki/static' + STATIC_URL = '/static/' diff --git a/rpkid/rpki/gui/app/templates/app/child_detail.html b/rpkid/rpki/gui/app/templates/app/child_detail.html index 0c6a4922..3e1feaaa 100644 --- a/rpkid/rpki/gui/app/templates/app/child_detail.html +++ b/rpkid/rpki/gui/app/templates/app/child_detail.html @@ -51,5 +51,5 @@ <a class='btn' href="{% url rpki.gui.app.views.child_add_asn object.pk %}" title='Delegate an ASN to this child'><i class="icon-plus-sign"></i> AS</a> <a class='btn' href="{% url rpki.gui.app.views.child_add_prefix object.pk %}" title='Delegate a prefix to this child'><i class="icon-plus-sign"></i> Prefix</a> <a class='btn' href="{% url rpki.gui.app.views.child_response object.pk %}" title='Download XML file to send to child'><i class="icon-download"></i> Export</a> -{{ block.super }} +<a class="btn" href="{% url rpki.gui.app.views.child_delete object.pk %}" title="Delete this child"><i class="icon-trash"></i> Delete</a> {% endblock action %} diff --git a/rpkid/rpki/gui/app/templates/app/client_detail.html b/rpkid/rpki/gui/app/templates/app/client_detail.html index bb9ea212..2e3930e6 100644 --- a/rpkid/rpki/gui/app/templates/app/client_detail.html +++ b/rpkid/rpki/gui/app/templates/app/client_detail.html @@ -16,3 +16,7 @@ </div> </div> {% endblock object_display %} + +{% block action %} +<a class="btn" href="{% url rpki.gui.app.views.client_delete object.pk %}"><i class="icon-trash"></i> Delete</a> +{% endblock %} diff --git a/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html b/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html index abaa7560..fde43a97 100644 --- a/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html +++ b/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html @@ -52,6 +52,6 @@ {% endblock object_display %} {% block action %} -{{ block.super }} <a class="btn" href="{% url gbr-edit object.pk %}"><i class="icon-edit"></i> Edit</a> +<a class="btn" href="{% url gbr-delete object.pk %}"><i class="icon-trash"></i> Delete</a> {% endblock %} diff --git a/rpkid/rpki/gui/app/templates/app/object_detail.html b/rpkid/rpki/gui/app/templates/app/object_detail.html index 81fdbdf0..fc1e142e 100644 --- a/rpkid/rpki/gui/app/templates/app/object_detail.html +++ b/rpkid/rpki/gui/app/templates/app/object_detail.html @@ -12,7 +12,6 @@ {% endblock object_display %} {% block action %} -<a class="btn" href="{{ object.get_absolute_url }}delete" title="Delete this object"><i class="icon-trash"></i> Delete</a> {% endblock action %} {% endblock content %} diff --git a/rpkid/rpki/gui/app/templates/app/parent_detail.html b/rpkid/rpki/gui/app/templates/app/parent_detail.html index c50d37e5..7b2f85f0 100644 --- a/rpkid/rpki/gui/app/templates/app/parent_detail.html +++ b/rpkid/rpki/gui/app/templates/app/parent_detail.html @@ -58,6 +58,6 @@ {% endblock object_display %} {% block action %} -{{ block.super }} -<a class='btn' href='{{ object.get_absolute_url }}export' title='Download XML to send to repository operator'><i class="icon-download"></i> Export</a> +<a class='btn' href='{% url rpki.gui.app.views.parent_export object.pk %}' title='Download XML to send to repository operator'><i class="icon-download"></i> Export</a> +<a class="btn" href="{% url rpki.gui.app.views.parent_delete object.pk %}" title="Delete this parent"><i class="icon-trash"></i> Delete</a> {% endblock action %} diff --git a/rpkid/rpki/gui/app/templates/app/repository_detail.html b/rpkid/rpki/gui/app/templates/app/repository_detail.html index 4100d8b9..5eec3d02 100644 --- a/rpkid/rpki/gui/app/templates/app/repository_detail.html +++ b/rpkid/rpki/gui/app/templates/app/repository_detail.html @@ -18,3 +18,7 @@ </div> </div> {% endblock object_display %} + +{% block action %} +<a class="btn" href="{% url rpki.gui.app.views.repository_delete object.pk %}" title="Delete this repository"><i class="icon-trash"></i> Delete</a> +{% endblock %} diff --git a/rpkid/rpki/gui/app/templates/app/roa_detail.html b/rpkid/rpki/gui/app/templates/app/roa_detail.html index 5500941f..e9defcc1 100644 --- a/rpkid/rpki/gui/app/templates/app/roa_detail.html +++ b/rpkid/rpki/gui/app/templates/app/roa_detail.html @@ -23,3 +23,7 @@ </div> </div> {% endblock %} + +{% block action %} +<a class="btn" href="{% url rpki.gui.app.views.roa_delete object.pk %}"><i class="icon-trash"></i> Delete</a> +{% endblock %} diff --git a/rpkid/rpki/gui/app/templates/app/route_detail.html b/rpkid/rpki/gui/app/templates/app/route_detail.html new file mode 100644 index 00000000..1d526b42 --- /dev/null +++ b/rpkid/rpki/gui/app/templates/app/route_detail.html @@ -0,0 +1,43 @@ +{% extends "app/object_detail.html" %} + +{# template for displaying the list of ROAs covering a specific route #} + +{% block object_display %} + +<div class="row"> + <div class="span3 well"> + <table class="table table-striped table-condensed"> + <tr><th>Prefix</th><th>AS</th></tr> + <tr> + <td>{{ object.as_resource_range }}</td> + <td>{{ object.asn }} + </td> + </tr> + </table> + </div> +</div> + +<div class="row"> +<p>The table below lists all ROAs which cover the route described above. + +<table class="table table-striped table-condensed"> + <tr> + <th>Prefix</th> + <th>Max Length</th> + <th>ASN</th> + <th>Expires</th> + <th>URI</th> + </tr> + {% for pfx in roa_prefixes %} + <tr> + <td>{{ pfx.as_resource_range }}</td> + <td>{{ pfx.max_length }}</td> + <td>{{ pfx.roas.all.0.asid }}</td> + <td>{{ pfx.roas.all.0.not_after }}</td> + <td>{{ pfx.roas.all.0.repo.uri }}</td> + </tr> + {% endfor %} +</table> +</div> + +{% endblock %} diff --git a/rpkid/rpki/gui/app/templates/app/route_roa_list.html b/rpkid/rpki/gui/app/templates/app/route_roa_list.html deleted file mode 100644 index 1907315d..00000000 --- a/rpkid/rpki/gui/app/templates/app/route_roa_list.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "app/object_table.html" %} - -{# template for displaying the list of ROAs covering a specific route #} - -{% block table_header %} -<th>Prefix</th> -<th>Max Length</th> -<th>ASN</th> -<th>Expires</th> -<th>URI</th> -{% endblock %} - -{% block object_detail %} -<td>{{ object.as_resource_range }}</td> -<td>{{ object.max_length }}</td> -<td>{{ object.roas.all.0.asid }}</td> -<td>{{ object.roas.all.0.not_after }}</td> -<td>{{ object.roas.all.0.repo.uri }}</td> -{% endblock object_detail %} diff --git a/rpkid/rpki/gui/app/templates/app/routes_view.html b/rpkid/rpki/gui/app/templates/app/routes_view.html index 8b2a4a18..a1406398 100644 --- a/rpkid/rpki/gui/app/templates/app/routes_view.html +++ b/rpkid/rpki/gui/app/templates/app/routes_view.html @@ -32,7 +32,7 @@ This view shows currently advertised routes for the prefixes listed in resource <td>{{ r.asn }}</td> <td> <span class='label {{ r.status_label }}'>{{ r.status }}</span> - <a href='{{ r.get_absolute_url }}/roa/' help='display ROAs matching this prefix'>roas</a> + <a href='{% url rpki.gui.app.views.route_detail r.pk %}' title='display ROAs covering this prefix'><i class="icon-info-sign"></i></a> </td> </tr> {% endfor %} diff --git a/rpkid/rpki/gui/app/urls.py b/rpkid/rpki/gui/app/urls.py index c8dfaf1f..570ed7bb 100644 --- a/rpkid/rpki/gui/app/urls.py +++ b/rpkid/rpki/gui/app/urls.py @@ -35,11 +35,9 @@ urlpatterns = patterns( (r'^child/(?P<pk>\d+)/delete$', views.child_delete), (r'^child/(?P<pk>\d+)/edit$', views.child_edit), (r'^child/(?P<pk>\d+)/export$', views.child_response), - url(r'^gbr/create$', - views.handle_required(views.GhostbusterCreateView.as_view()), - name='gbr-create'), + url(r'^gbr/create$', views.ghostbuster_create, name='gbr-create'), url(r'^gbr/(?P<pk>\d+)/$', views.GhostbusterDetailView.as_view(), name='gbr-detail'), - url(r'^gbr/(?P<pk>\d+)/edit$', views.GhostbusterEditView.as_view(), name='gbr-edit'), + url(r'^gbr/(?P<pk>\d+)/edit$', views.ghostbuster_edit, name='gbr-edit'), url(r'^gbr/(?P<pk>\d+)/delete$', views.GhostbusterDeleteView.as_view(), name='gbr-delete'), (r'^refresh$', views.refresh), (r'^client/import$', views.client_import), @@ -54,7 +52,7 @@ urlpatterns = patterns( (r'^roa/confirm$', views.roa_create_confirm), (r'^roa/(?P<pk>\d+)/delete$', views.roa_delete), (r'^route/$', views.route_view), - (r'^route/(?P<pk>\d+)/roa/$', views.route_roa_list), + (r'^route/(?P<pk>\d+)/$', views.route_detail), (r'^user/$', views.user_list), (r'^user/create$', views.user_create), (r'^user/(?P<pk>\d+)/delete$', views.user_delete), diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py index 1a8be108..558fac1a 100644 --- a/rpkid/rpki/gui/app/views.py +++ b/rpkid/rpki/gui/app/views.py @@ -31,7 +31,7 @@ from django.utils.http import urlquote from django import http from django.core.urlresolvers import reverse, reverse_lazy from django.contrib.auth.models import User -from django.views.generic import DetailView, CreateView, UpdateView, DeleteView +from django.views.generic import DetailView, DeleteView from rpki.irdb import Zookeeper, ChildASN, ChildNet from rpki.gui.app import models, forms, glue, range_list @@ -581,27 +581,37 @@ class GhostbusterDeleteView(GenericDeleteView): return self.request.session['handle'].ghostbusters -class GhostbusterCreateView(CreateView): - form_class = forms.GhostbusterRequestForm - template_name = 'app/app_form.html' - - def get_form_kwargs(self): - kwargs = super(GhostbusterCreateView, self).get_form_kwargs() - kwargs['conf'] = self.request.session['handle'] - return kwargs - +@handle_required +def ghostbuster_create(request): + conf = request.session['handle'] + if request.method == 'POST': + form = forms.GhostbusterRequestForm(request.POST, request.FILES, + conf=conf) + if form.is_valid(): + obj = form.save(commit=False) + obj.vcard = glue.ghostbuster_to_vcard(obj) + obj.save() + return http.HttpResponseRedirect(reverse(dashboard)) + else: + form = forms.GhostbusterRequestForm(conf=conf) + return render(request, 'app/app_form.html', {'form': form}) -class GhostbusterEditView(UpdateView): - form_class = forms.GhostbusterRequestForm - template_name = 'app/app_form.html' - def get_queryset(self): - return self.request.session['handle'].ghostbusters - - def get_form_kwargs(self): - kwargs = super(GhostbusterEditView, self).get_form_kwargs() - kwargs['conf'] = self.request.session['handle'] - return kwargs +@handle_required +def ghostbuster_edit(request, pk): + conf = request.session['handle'] + obj = get_object_or_404(conf.ghostbusters, pk=pk) + if request.method == 'POST': + form = forms.GhostbusterRequestForm(request.POST, request.FILES, + conf=conf, instance=obj) + if form.is_valid(): + obj = form.save(commit=False) + obj.vcard = glue.ghostbuster_to_vcard(obj) + obj.save() + return http.HttpResponseRedirect(reverse(dashboard)) + else: + form = forms.GhostbusterRequestForm(conf=conf, instance=obj) + return render(request, 'app/app_form.html', {'form': form}) @handle_required @@ -694,13 +704,17 @@ def route_view(request): {'routes': routes, 'timestamp': ts}) -def route_roa_list(request, pk): +def route_detail(request, pk): """Show a list of ROAs that match a given route.""" - object = get_object_or_404(models.RouteOrigin, pk=pk) + # FIXME only supports IPv4 routes + route = get_object_or_404(models.RouteOrigin, pk=pk) # select accepted ROAs which cover this route - qs = ROAPrefixV4.objects.filter(prefix_min__lte=object.prefix_min, - prefix_max__gte=object.prefix_max).select_related() - return object_list(request, qs, template_name='app/route_roa_list.html') + # The rpki.net tool only generates a single prefix per ROA, but other tools + # may not, so we generate the list by roa prefix instead + qs = ROAPrefixV4.objects.filter(prefix_min__lte=route.prefix_min, + prefix_max__gte=route.prefix_max).select_related() + return render(request, 'app/route_detail.html', + {'object': route, 'roa_prefixes': qs}) @handle_required diff --git a/rpkid/setup.py b/rpkid/setup.py index ee6f04ef..db7e0135 100644 --- a/rpkid/setup.py +++ b/rpkid/setup.py @@ -69,6 +69,10 @@ setup(name = "rpkitoolkit", "rpki.gui", "rpki.gui.app", "rpki.gui.cacheview", "rpki.gui.api", "rpki.gui.routeview" ], ext_modules = [pow], - package_data = {'rpki.gui.app': ['migrations/*.py', 'templates/*.html', 'templates/*/*.html', 'templatetags/*.py'], - 'rpki.gui.cacheview': ['templates/*/*.html']}, + package_data = { + 'rpki.gui.app': ['migrations/*.py', 'static/*/*', + 'templates/*.html', 'templates/*/*.html', + 'templatetags/*.py'], + 'rpki.gui.cacheview': ['templates/*/*.html'] + }, data_files = data_files) |