aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpkid/portal-gui/Makefile.in6
-rw-r--r--rpkid/portal-gui/apache.conf.in3
-rw-r--r--rpkid/portal-gui/scripts/rpki-manage.in2
-rw-r--r--rpkid/portal-gui/scripts/rpkigui-rcynic.py3
-rw-r--r--rpkid/portal-gui/settings.py.in3
-rw-r--r--rpkid/rpki/gui/app/templates/app/child_detail.html2
-rw-r--r--rpkid/rpki/gui/app/templates/app/client_detail.html4
-rw-r--r--rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html2
-rw-r--r--rpkid/rpki/gui/app/templates/app/object_detail.html1
-rw-r--r--rpkid/rpki/gui/app/templates/app/parent_detail.html4
-rw-r--r--rpkid/rpki/gui/app/templates/app/repository_detail.html4
-rw-r--r--rpkid/rpki/gui/app/templates/app/roa_detail.html4
-rw-r--r--rpkid/rpki/gui/app/templates/app/route_detail.html43
-rw-r--r--rpkid/rpki/gui/app/templates/app/route_roa_list.html19
-rw-r--r--rpkid/rpki/gui/app/templates/app/routes_view.html2
-rw-r--r--rpkid/rpki/gui/app/urls.py8
-rw-r--r--rpkid/rpki/gui/app/views.py64
-rw-r--r--rpkid/setup.py8
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)