diff options
author | Rob Austein <sra@hactrn.net> | 2014-10-05 17:42:22 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2014-10-05 17:42:22 +0000 |
commit | 7d250756df425252344d29c54256ca141b915ed3 (patch) | |
tree | 767e199979f05abf950b918f49c06fe7e14d8697 | |
parent | 4598ade64714fcbba5b8785ba84533522254708b (diff) | |
parent | d4f19b6a2957b11d286b1306cc1b209ee18e200c (diff) |
Pull from trunk.
svn path=/branches/tk705/; revision=5988
-rwxr-xr-x | ca/irbe_cli | 5 | ||||
-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 | ||||
-rw-r--r-- | rpki/gui/script_util.py | 11 | ||||
-rw-r--r-- | rpki/rpkic.py | 8 |
10 files changed, 199 insertions, 3 deletions
diff --git a/ca/irbe_cli b/ca/irbe_cli index de907ca7..d425095b 100755 --- a/ca/irbe_cli +++ b/ca/irbe_cli @@ -325,6 +325,7 @@ if True: os.environ.update(DJANGO_SETTINGS_MODULE = "rpki.django_settings") else: + import django from django.conf import settings settings.configure( DATABASES = { "default" : { @@ -336,7 +337,11 @@ else: "PORT" : "", "OPTIONS" : { "init_command": "SET storage_engine=INNODB" }}}, INSTALLED_APPS = ("rpki.irdb",), + MIDDLEWARE_CLASSES = (), ) + if django.VERSION >= (1, 7): + from django.apps import apps + apps.populate(settings.INSTALLED_APPS) import rpki.irdb diff --git a/rpki/gui/app/forms.py b/rpki/gui/app/forms.py index 02561303..03f00814 100644 --- a/rpki/gui/app/forms.py +++ b/rpki/gui/app/forms.py @@ -445,3 +445,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 d6332796..9d453261 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 @@ -202,6 +203,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 228d5c6c..14ec82a3 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 @@ -1337,3 +1337,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) diff --git a/rpki/gui/script_util.py b/rpki/gui/script_util.py index 678ddae6..8919139c 100644 --- a/rpki/gui/script_util.py +++ b/rpki/gui/script_util.py @@ -32,6 +32,7 @@ def setup(): os.environ.update(DJANGO_SETTINGS_MODULE = "rpki.django_settings") else: + import django from rpki import config from rpki import autoconf from django.conf import settings @@ -46,6 +47,14 @@ def setup(): 'NAME': cfg.get('sql-database'), 'USER': cfg.get('sql-username'), 'PASSWORD': cfg.get('sql-password'), - } + }, }, + MIDDLEWARE_CLASSES = (), ) + # Can't populate apps if we don't know what they are. If this + # explodes with an AppRegistryNotReady exception, the above comment + # about not needing to set INSTALLED_APPS is no longer true and + # you'll need to fix that here. + if False and django.VERSION >= (1, 7): + from django.apps import apps + apps.populate(settings.INSTALLED_APPS) diff --git a/rpki/rpkic.py b/rpki/rpkic.py index fdde6056..8529026b 100644 --- a/rpki/rpkic.py +++ b/rpki/rpkic.py @@ -143,6 +143,7 @@ class main(Cmd): os.environ.update(DJANGO_SETTINGS_MODULE = "rpki.django_settings") else: + import django from django.conf import settings settings.configure( DATABASES = { "default" : { @@ -153,8 +154,13 @@ class main(Cmd): "HOST" : "", "PORT" : "", "OPTIONS" : { "init_command": "SET storage_engine=INNODB" }}}, - INSTALLED_APPS = ["rpki.irdb"]) + INSTALLED_APPS = ("rpki.irdb",), + MIDDLEWARE_CLASSES = (), # API change, feh + ) + if django.VERSION >= (1, 7): # API change, feh + from django.apps import apps + apps.populate(settings.INSTALLED_APPS) import rpki.irdb # pylint: disable=W0621 |