diff options
-rw-r--r-- | rpki/gui/app/forms.py | 5 | ||||
-rw-r--r-- | rpki/gui/app/models.py | 7 | ||||
-rw-r--r-- | rpki/gui/app/templates/app/dashboard.html | 22 | ||||
-rw-r--r-- | rpki/gui/app/templates/app/eecertificaterequest_detail.html | 33 | ||||
-rw-r--r-- | rpki/gui/app/templates/app/eecertificaterequest_list.html | 29 | ||||
-rw-r--r-- | rpki/gui/app/urls.py | 4 | ||||
-rw-r--r-- | rpki/gui/app/views.py | 78 |
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) |