diff options
author | Michael Elkins <melkins@tislabs.com> | 2012-01-19 23:26:59 +0000 |
---|---|---|
committer | Michael Elkins <melkins@tislabs.com> | 2012-01-19 23:26:59 +0000 |
commit | 6ee1eab3d04f105111a0edfc963eec4de1d2dfe7 (patch) | |
tree | 1db9dd846a6d3391d129d59601731c9e61579e14 | |
parent | 7cdaa9831e69b1943093751a3b6b0edb4f50d4aa (diff) |
initial support for managing repositories and pubclients
svn path=/branches/tk161/; revision=4237
-rw-r--r-- | rpkid/rpki/gui/app/models.py | 24 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/pubclient_list.html | 9 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/repository_list.html | 19 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/urls.py | 10 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/views.py | 124 |
5 files changed, 138 insertions, 48 deletions
diff --git a/rpkid/rpki/gui/app/models.py b/rpkid/rpki/gui/app/models.py index 87efdf8b..792a2c86 100644 --- a/rpkid/rpki/gui/app/models.py +++ b/rpkid/rpki/gui/app/models.py @@ -172,4 +172,28 @@ class Timestamp(models.Model): def __unicode__(self): return '%s: %s' % (self.name, self.ts) +class Repository(rpki.irdb.models.Repository): + class Meta: + proxy = True + + @models.permalink + def get_absolute_url(self): + return ('rpki.gui.app.views.repository_detail', [str(pk)]) + + def __unicode__(self): + return "%s's repository %s" % (self.issuer.handle, self.handle) + +class Client(rpki.irdb.models.Client): + "Proxy model for pubd clients." + + class Meta: + proxy = True + + @models.permalink + def get_absolute_url(self): + return ('rpki.gui.app.views.client_detail', [str(pk)]) + + def __unicode__(self): + return self.handle + # vim:sw=4 ts=8 expandtab diff --git a/rpkid/rpki/gui/app/templates/app/pubclient_list.html b/rpkid/rpki/gui/app/templates/app/pubclient_list.html new file mode 100644 index 00000000..0296dcdf --- /dev/null +++ b/rpkid/rpki/gui/app/templates/app/pubclient_list.html @@ -0,0 +1,9 @@ +{% extends "app/object_list.html" %} + +{% block actions %} +<div class='actions'> + <a class='btn' href='{% url rpki.gui.app.views.pubclient_import %}'>Import</a> +</div> +{% endblock actions %} + +<!-- vim:set sw=2: --> diff --git a/rpkid/rpki/gui/app/templates/app/repository_list.html b/rpkid/rpki/gui/app/templates/app/repository_list.html new file mode 100644 index 00000000..5dfc1eef --- /dev/null +++ b/rpkid/rpki/gui/app/templates/app/repository_list.html @@ -0,0 +1,19 @@ +{% extends "app/app_base.html" %} + +{% block content %} +<table style='zebra-striped'> + <tr> + <th>Name</th> + <th>SIA</th> + <th>Action</th> + </tr> + {% for obj in object_list %} + <tr> + <td>{{ obj.handle }}</td> + <td>{{ obj.sia_base }}</td> + <td><a class='btn danger' href='{{ obj.get_absolute_url }}/delete'>Delete</a></td> + </tr> + {% endfor %} +</table> +{% endblock content %} +<!-- vim:set sw=2: --> diff --git a/rpkid/rpki/gui/app/urls.py b/rpkid/rpki/gui/app/urls.py index 3e96df97..0bdd3786 100644 --- a/rpkid/rpki/gui/app/urls.py +++ b/rpkid/rpki/gui/app/urls.py @@ -42,14 +42,20 @@ urlpatterns = patterns('', (r'^gbr/(?P<pk>\d+)/edit$', views.ghostbuster_edit), (r'^gbr/(?P<pk>\d+)/delete$', views.ghostbuster_delete), (r'^refresh$', views.refresh), + (r'^client/$', views.client_list), + (r'^client/(?P<pk>\d+)$', views.client_detail), + (r'^client/(?P<pk>\d+)/delete$', views.client_delete), + (r'^client/(?P<pk>\d+)/import$', views.client_import), + (r'^repo/$', views.repository_list), + (r'^repo/(?P<pk>\d+)$', views.repository_detail), + (r'^repo/(?P<pk>\d+)/delete$', views.repository_delete), + (r'^repo/(?P<pk>\d+)/import$', views.repository_import), (r'^roa/$', views.roa_list), (r'^roa/(?P<pk>\d+)/$', views.roa_detail), (r'^roa/(?P<pk>\d+)/delete$', views.roa_delete), (r'^routes/$', views.route_view), (r'^import_child$', views.import_child), (r'^import_parent$', views.import_parent), - (r'^import_pubclient$', views.import_pubclient), - (r'^import_repository$', views.import_repository), (r'^child_wizard$', views.child_wizard), (r'^update_bpki', views.update_bpki), ) diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py index 0247dec2..fe1cd574 100644 --- a/rpkid/rpki/gui/app/views.py +++ b/rpkid/rpki/gui/app/views.py @@ -472,52 +472,6 @@ def import_parent(request): return render('app/import_parent_form.html', { 'form': form }, request) @handle_required -def import_repository(request): - conf = request.session['handle'] - log = request.META['wsgi.errors'] - - if request.method == 'POST': - form = forms.ImportRepositoryForm(request.POST, request.FILES) - if form.is_valid(): - tmpf = tempfile.NamedTemporaryFile(prefix='repository', suffix='.xml', delete=False) - f = tmpf.name - tmpf.write(form.cleaned_data['xml'].read()) - tmpf.close() - - glue.import_repository(log, conf, f) - - os.remove(tmpf.name) - - return http.HttpResponseRedirect(reverse(dashboard)) - else: - form = forms.ImportRepositoryForm() - - return render('app/import_repository_form.html', { 'form': form }, request) - -@handle_required -def import_pubclient(request): - conf = request.session['handle'] - log = request.META['wsgi.errors'] - - if request.method == 'POST': - form = forms.ImportPubClientForm(request.POST, request.FILES) - if form.is_valid(): - tmpf = tempfile.NamedTemporaryFile(prefix='pubclient', suffix='.xml', delete=False) - f = tmpf.name - tmpf.write(form.cleaned_data['xml'].read()) - tmpf.close() - - glue.import_pubclient(log, conf, f) - - os.remove(tmpf.name) - - return http.HttpResponseRedirect(reverse(dashboard)) - else: - form = forms.ImportPubClientForm() - - return render('app/import_pubclient_form.html', { 'form': form }, request) - -@handle_required def import_child(request): """ Import a repository response. @@ -747,4 +701,82 @@ def route_view(request): ts = dict((attr['name'], attr['ts']) for attr in models.Timestamp.objects.values()) return render('app/routes_view.html', { 'routes': routes, 'timestamp': ts }, request) +@handle_required +def repository_list(request): + conf = request.session['handle'] + qs = models.Repository.objects.filter(issuer=conf) + return object_list(request, queryset=qs, template_name='app/repository_list.html', + extra_context={ 'page_title': 'Repositories' }) + +@handle_required +def repository_detail(request, pk): + conf = request.session['handle'] + qs = models.Repository.objects.filter(issuer=conf) + return object_detail(request, queryset=qs, object_id=pk, template_name='app/repository_detail.html') + +@handle_required +def repository_delete(request, pk): + conf = request.session['handle'] + get_object_or_404(models.Repository, issuer=conf, pk=pk) # permission check + return delete_object(request, model=models.Repository, object_id=pk, template_name='app/repository_detail.html') + +@handle_required +def repository_import(request): + conf = request.session['handle'] + log = request.META['wsgi.errors'] + + if request.method == 'POST': + form = forms.ImportRepositoryForm(request.POST, request.FILES) + if form.is_valid(): + tmpf = tempfile.NamedTemporaryFile(prefix='repository', suffix='.xml', delete=False) + f = tmpf.name + tmpf.write(form.cleaned_data['xml'].read()) + tmpf.close() + + glue.import_repository(log, conf, f) + + os.remove(tmpf.name) + + return http.HttpResponseRedirect(reverse(dashboard)) + else: + form = forms.ImportRepositoryForm() + + return render('app/import_repository_form.html', { 'form': form }, request) + +@superuser_required +def client_list(request): + return object_list(request, queryset=models.Client.objects.all(), template_name='app/client_list.html', + extra_context={ 'page_title': 'Publication Clients' }) + +@superuser_required +def client_detail(request, pk): + return object_detail(request, queryset=models.Client.objects, object_id=pk, template_name='app/client_detail.html') + +@superuser_required +def client_delete(request, pk): + return delete_object(request, model=models.Client, object_id=pk, template_name='app/client_detail.html') + +@superuser_required +def client_import(request): + conf = request.session['handle'] + log = request.META['wsgi.errors'] + + if request.method == 'POST': + form = forms.ImportPubClientForm(request.POST, request.FILES) + if form.is_valid(): + tmpf = tempfile.NamedTemporaryFile(prefix='pubclient', suffix='.xml', delete=False) + f = tmpf.name + tmpf.write(form.cleaned_data['xml'].read()) + tmpf.close() + + glue.import_pubclient(log, conf, f) + + os.remove(tmpf.name) + + return http.HttpResponseRedirect(reverse(dashboard)) + else: + form = forms.ImportPubClientForm() + + return render('app/import_pubclient_form.html', { 'form': form }, request) + # vim:sw=4 ts=8 expandtab |