aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2012-01-19 23:26:59 +0000
committerMichael Elkins <melkins@tislabs.com>2012-01-19 23:26:59 +0000
commit6ee1eab3d04f105111a0edfc963eec4de1d2dfe7 (patch)
tree1db9dd846a6d3391d129d59601731c9e61579e14
parent7cdaa9831e69b1943093751a3b6b0edb4f50d4aa (diff)
initial support for managing repositories and pubclients
svn path=/branches/tk161/; revision=4237
-rw-r--r--rpkid/rpki/gui/app/models.py24
-rw-r--r--rpkid/rpki/gui/app/templates/app/pubclient_list.html9
-rw-r--r--rpkid/rpki/gui/app/templates/app/repository_list.html19
-rw-r--r--rpkid/rpki/gui/app/urls.py10
-rw-r--r--rpkid/rpki/gui/app/views.py124
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