aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpki/gui/app/forms.py5
-rw-r--r--rpki/gui/app/models.py7
-rw-r--r--rpki/gui/app/templates/app/dashboard.html22
-rw-r--r--rpki/gui/app/templates/app/eecertificaterequest_detail.html33
-rw-r--r--rpki/gui/app/templates/app/eecertificaterequest_list.html29
-rw-r--r--rpki/gui/app/urls.py4
-rw-r--r--rpki/gui/app/views.py78
7 files changed, 177 insertions, 1 deletions
diff --git a/rpki/gui/app/forms.py b/rpki/gui/app/forms.py
index 5394a804..e60ba932 100644
--- a/rpki/gui/app/forms.py
+++ b/rpki/gui/app/forms.py
@@ -440,3 +440,8 @@ class ResourceHolderCreateForm(forms.Form):
if handle and parent and parent.children.filter(handle=handle).exists():
raise forms.ValidationError('parent already has a child by that name')
return self.cleaned_data
+
+
+class RouterCertificateRequestForm(forms.Form):
+ """form for uploading router cert request"""
+ xml = forms.FileField(label='XML file')
diff --git a/rpki/gui/app/models.py b/rpki/gui/app/models.py
index 32a897c7..21a86487 100644
--- a/rpki/gui/app/models.py
+++ b/rpki/gui/app/models.py
@@ -24,6 +24,7 @@ import rpki.exceptions
import rpki.irdb.models
import rpki.gui.models
import rpki.gui.routeview.models
+import rpki.oids
from south.modelsinspector import add_introspection_rules
@@ -201,6 +202,12 @@ class Conf(rpki.irdb.models.ResourceHolderCA):
self.alerts.all().delete()
+ @property
+ def router_certs(self):
+ """returns a query set of all rpki router certs associated with this
+ resource holder."""
+ return self.ee_certificate_requests.filter(eku=rpki.oids.id_kp_bgpsec_router)
+
class Meta:
proxy = True
diff --git a/rpki/gui/app/templates/app/dashboard.html b/rpki/gui/app/templates/app/dashboard.html
index 65dbb90f..c042af12 100644
--- a/rpki/gui/app/templates/app/dashboard.html
+++ b/rpki/gui/app/templates/app/dashboard.html
@@ -159,6 +159,28 @@
</div><!-- /span -->
</div><!-- /row -->
+<div class='row-fluid'>
+<div class='span6'>
+<div class='page-header'>
+<h1>Router Certificate Requests</h1>
+</div>
+<table class='table table-condensed table-striped'>
+<tr><th>SN</th><th>ASN</th><th>Valid Until</th></tr>
+{% for rtr in conf.router_certs %}
+<tr>
+ <td>{{ rtr.sn }}</td> <td>{{ rtr.asns.all.0.start_as }} </td>
+ <td>{{ rtr.valid_until }}</td>
+ <td>
+ <a class="btn btn-mini" href="{% url "router-detail" rtr.pk %}" title="View"><i class="icon-info-sign"></i></a>
+ <a class="btn btn-mini" href="{% url "router-delete" rtr.pk %}" title="Delete"><i class="icon-trash"></i></a>
+ </td>
+</tr>
+{% endfor %}
+</table>
+<a class="btn" href="{% url "router-import" %}"><i class="icon-plus-sign"></i> Import</a>
+</div>
+</div>
+
<div class="row-fluid">
<div class="span6">
<div class="page-header">
diff --git a/rpki/gui/app/templates/app/eecertificaterequest_detail.html b/rpki/gui/app/templates/app/eecertificaterequest_detail.html
new file mode 100644
index 00000000..13903f83
--- /dev/null
+++ b/rpki/gui/app/templates/app/eecertificaterequest_detail.html
@@ -0,0 +1,33 @@
+{% extends "app/app_base.html" %}
+
+{% block content %}
+<div class="page-header">
+ <h1>Router Certificate Request Detail <small>{{ object.cn }}</small></h1>
+</div>
+
+<div class="row-fluid">
+<table class="table">
+ <tr>
+ <th>CN</th><td> {{ object.cn }}</td>
+ </tr>
+ <tr>
+ <th>SN</th><td> {{ object.sn }}</td>
+ </tr>
+ <tr>
+ <th>SKI</th><td> {{ object.gski }}</td>
+ </tr>
+ <tr>
+ <th>ASN</th><td> {{ object.asns.all.0.start_as }}</td>
+ </tr>
+ <tr>
+ <th>Valid Until</th><td> {{ object.valid_until }} </td>
+ </tr>
+</table>
+
+{% block action %}
+<div class="row-fluid">
+<a class="btn btn-danger" title="delete this router certificate request" href="{% url "router-delete" object.pk %}"><i class="icon-trash"></i> Delete</a>
+</div>
+{% endblock %}
+
+{% endblock %}
diff --git a/rpki/gui/app/templates/app/eecertificaterequest_list.html b/rpki/gui/app/templates/app/eecertificaterequest_list.html
new file mode 100644
index 00000000..bf9078ad
--- /dev/null
+++ b/rpki/gui/app/templates/app/eecertificaterequest_list.html
@@ -0,0 +1,29 @@
+{% extends "app/app_base.html" %}
+
+{% block content %}
+<div class="page-header">
+ <h1>Router Certificate Requests</h1>
+</div>
+
+<table class="table table-striped">
+ <thead>
+ <tr>
+ <th>ASN</th>
+ <th>CN</th>
+ <th>SN</th>
+ <th>GSKI</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for obj in object_list %}
+ <tr>
+ <td>{{ obj.asns.all.0.start_as }}</td>
+ <td><a href="{% url 'router-detail' obj.pk %}" title="view router certificate request">{{ obj.cn }}</a></td>
+ <td>{{ obj.sn }}</td>
+ <td>{{ obj.gski }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+</table>
+
+{% endblock content %}
diff --git a/rpki/gui/app/urls.py b/rpki/gui/app/urls.py
index f21f4961..f595ea8f 100644
--- a/rpki/gui/app/urls.py
+++ b/rpki/gui/app/urls.py
@@ -74,6 +74,10 @@ urlpatterns = patterns(
(r'^route/$', 'rpki.gui.app.views.route_view'),
(r'^route/(?P<pk>\d+)/$', 'rpki.gui.app.views.route_detail'),
url(r'^route/suggest$', views.route_suggest, name="suggest-roas"),
+ url(r'^router/$', views.RouterListView.as_view(), name='router-list'),
+ url(r'^router/import$', views.RouterImportView.as_view(), name='router-import'),
+ url(r'^router/(?P<pk>\d+)$', views.RouterDetailView.as_view(), name='router-detail'),
+ url(r'^router/(?P<pk>\d+)/delete$', views.RouterDeleteView.as_view(), name='router-delete'),
(r'^user/$', 'rpki.gui.app.views.user_list'),
(r'^user/create$', 'rpki.gui.app.views.user_create'),
(r'^user/(?P<pk>\d+)/delete$', 'rpki.gui.app.views.user_delete'),
diff --git a/rpki/gui/app/views.py b/rpki/gui/app/views.py
index 9a1c4cfe..86ec30d7 100644
--- a/rpki/gui/app/views.py
+++ b/rpki/gui/app/views.py
@@ -35,7 +35,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, ListView, DeleteView
+from django.views.generic import DetailView, ListView, DeleteView, FormView
from django.core.paginator import Paginator, InvalidPage
from django.forms.formsets import formset_factory, BaseFormSet
import django.db.models
@@ -1326,3 +1326,79 @@ def alert_clear_all(request):
else:
form = forms.Empty()
return render(request, 'app/alert_confirm_clear.html', {'form': form})
+
+
+
+class RouterListView(ListView):
+ template_name = 'app/eecertificaterequest_list.html'
+
+ @method_decorator(handle_required)
+ def dispatch(self, request, *args, **kwargs):
+ return super(RouterListView, self).dispatch(request, *args, **kwargs)
+
+ def get_queryset(self, *args, **kwargs):
+ conf = get_conf(self.request.user, self.request.session['handle'])
+ return conf.router_certs.all()
+
+
+class RouterDetailView(DetailView):
+ template_name = 'app/eecertificaterequest_detail.html'
+
+ @method_decorator(handle_required)
+ def dispatch(self, request, *args, **kwargs):
+ return super(RouterDetailView, self).dispatch(request, *args, **kwargs)
+
+ def get_queryset(self, *args, **kwargs):
+ conf = get_conf(self.request.user, self.request.session['handle'])
+ return conf.router_certs.all()
+
+
+class RouterDeleteView(DeleteView):
+ success_url = reverse_lazy(dashboard)
+ #template_name = 'app/eecertificaterequest_confirm_delete.html'
+ template_name = 'app/object_confirm_delete.html'
+
+ @method_decorator(handle_required)
+ def dispatch(self, request, *args, **kwargs):
+ return super(RouterDeleteView, self).dispatch(request, *args, **kwargs)
+
+ def get_queryset(self, *args, **kwargs):
+ conf = get_conf(self.request.user, self.request.session['handle'])
+ return conf.router_certs.all()
+
+ def get_context_data(self, **kwargs):
+ kwargs['parent_template'] = 'app/eecertificaterequest_detail.html'
+ return super(RouterDeleteView, self).get_context_data(**kwargs)
+
+ def delete(self, request, *args, **kwargs):
+ # override the delete hook so that we can nudge rpkid after the object is gone
+ r = super(RouterDeleteView, self).delete(request, *args, **kwargs)
+ Zookeeper(handle=request.session['handle']).run_rpkid_now()
+ return r
+
+
+class RouterImportView(FormView):
+ form_class = forms.RouterCertificateRequestForm
+ success_url = reverse_lazy(dashboard)
+ template_name = 'app/app_form.html'
+
+ @method_decorator(handle_required)
+ def dispatch(self, request, *args, **kwargs):
+ return super(RouterImportView, self).dispatch(request, *args, **kwargs)
+
+ def form_valid(self, form):
+ conf = get_conf(self.request.user, self.request.session['handle'])
+ tmpf = NamedTemporaryFile(prefix='import', suffix='.xml',
+ delete=False)
+ tmpf.write(form.cleaned_data['xml'].read())
+ tmpf.close()
+ z = Zookeeper(handle=conf.handle)
+ z.add_router_certificate_request(tmpf.name)
+ z.run_rpkid_now()
+ os.remove(tmpf.name)
+ return super(RouterImportView, self).form_valid(form)
+
+ def get_context_data(self, **kwargs):
+ kwargs['form_title'] = 'Import Router Certificate Request'
+ kwargs['cancel_url'] = reverse(dashboard)
+ return super(RouterImportView, self).get_context_data(**kwargs)