aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2013-03-22 17:21:33 +0000
committerMichael Elkins <melkins@tislabs.com>2013-03-22 17:21:33 +0000
commita74de1b1dbc68cf179cd644de816cc55120e0953 (patch)
tree095b055b1259e51130fa6f87cabe2f3f8d34ab70
parent5a29132d0c5713d803dce81e20c00d97018f545e (diff)
add import/export of asns.csv and prefixes.csv
see #323 svn path=/trunk/; revision=5198
-rw-r--r--rpkid/rpki/gui/app/templates/app/dashboard.html16
-rw-r--r--rpkid/rpki/gui/app/urls.py4
-rw-r--r--rpkid/rpki/gui/app/views.py84
3 files changed, 95 insertions, 9 deletions
diff --git a/rpkid/rpki/gui/app/templates/app/dashboard.html b/rpkid/rpki/gui/app/templates/app/dashboard.html
index d03e0846..f91db40d 100644
--- a/rpkid/rpki/gui/app/templates/app/dashboard.html
+++ b/rpkid/rpki/gui/app/templates/app/dashboard.html
@@ -175,13 +175,25 @@
</tr>
{% endfor %}
</table>
- <a class="btn" href="{% url "rpki.gui.app.views.child_import" %}"><i class="icon-upload"></i> Import</a>
+ <div class="row-fluid">
+ <div class='span6'>
+ <a class="btn" href="{% url "rpki.gui.app.views.child_import" %}" title="Import XML request from Child"><i class="icon-upload"></i> Child</a>
+ <a class="btn" href="{% url "import-asns" %}" title="Import CSV file containing ASN delgations to children"><i class="icon-upload"></i> ASNs</a>
+ <a class="btn" href="{% url "import-prefixes" %}" title="import CSV file containing prefix delgations to children"><i class="icon-upload"></i> Prefixes</a>
+ </div>
+ </div>
+ <div class="row-fluid">
+ <div class='span6'>
+ <a class="btn" href="{% url "export-asns" %}" title="Export CSV file containing ASN delgations to children"><i class="icon-download"></i> ASNs</a>
+ <a class="btn" href="{% url "export-prefixes" %}" title="Export CSV file containing prefix delgations to children"><i class="icon-download"></i> Prefixes</a>
+ </div>
+ </div>
</div><!-- /span -->
<div class="span6">
<div class="page-header">
<h1>Parents</h1>
</div>
-<table class="table table-condensed table-striped">
+ <table class="table table-condensed table-striped">
<tr><th>Handle</th><th></th></tr>
{% for parent in conf.parents %}
<tr>
diff --git a/rpkid/rpki/gui/app/urls.py b/rpkid/rpki/gui/app/urls.py
index b5b3ab5c..cacc17a0 100644
--- a/rpkid/rpki/gui/app/urls.py
+++ b/rpkid/rpki/gui/app/urls.py
@@ -24,6 +24,10 @@ urlpatterns = patterns(
(r'^conf/export$', views.conf_export),
(r'^conf/list$', views.conf_list),
(r'^conf/select$', views.conf_select),
+ url(r'^conf/export_asns$', views.export_asns, name='export-asns'),
+ url(r'^conf/export_prefixes$', views.export_prefixes, name='export-prefixes'),
+ url(r'^conf/import_asns$', views.import_asns, name='import-asns'),
+ url(r'^conf/import_prefixes$', views.import_prefixes, name='import-prefixes'),
(r'^parent/import$', views.parent_import),
(r'^parent/(?P<pk>\d+)/$', views.parent_detail),
(r'^parent/(?P<pk>\d+)/delete$', views.parent_delete),
diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py
index b8a49903..5edf9205 100644
--- a/rpkid/rpki/gui/app/views.py
+++ b/rpkid/rpki/gui/app/views.py
@@ -24,6 +24,8 @@ __version__ = '$Id$'
import os
import os.path
from tempfile import NamedTemporaryFile
+import cStringIO
+import csv
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, render, redirect
@@ -263,7 +265,7 @@ def conf_select(request):
return http.HttpResponseRedirect(next_url)
-def serve_xml(content, basename):
+def serve_xml(content, basename, ext='csv'):
"""
Generate a HttpResponse object with the content type set to XML.
@@ -271,9 +273,11 @@ def serve_xml(content, basename):
`basename` is the prefix to specify for the XML filename.
+ `csv` is the type (default: xml)
+
"""
- resp = http.HttpResponse(content, mimetype='application/xml')
- resp['Content-Disposition'] = 'attachment; filename=%s.xml' % (basename,)
+ resp = http.HttpResponse(content, mimetype='application/%s' % ext)
+ resp['Content-Disposition'] = 'attachment; filename=%s.%s' % (basename, ext)
return resp
@@ -285,6 +289,74 @@ def conf_export(request):
xml = z.generate_identity()
return serve_xml(str(xml), '%s.identity' % conf.handle)
+
+@handle_required
+def export_asns(request):
+ """Export CSV file containing ASN allocations to children."""
+ conf = request.session['handle']
+ s = cStringIO.StringIO()
+ csv_writer = csv.writer(s, delimiter=' ')
+ for childasn in ChildASN.objects.filter(child__issuer=conf):
+ csv_writer.writerow([childasn.child.handle, str(childasn.as_resource_range())])
+ return serve_xml(s.getvalue(), '%s.asns' % conf.handle, ext='csv')
+
+
+@handle_required
+def import_asns(request):
+ conf = request.session['handle']
+ if request.method == 'POST':
+ form = forms.ImportCSVForm(request.POST, request.FILES)
+ if form.is_valid():
+ f = NamedTemporaryFile(prefix='asns', suffix='.csv', delete=False)
+ f.write(request.FILES['csv'].read())
+ f.close()
+ z = Zookeeper(handle=conf.handle)
+ z.load_asns(f.name)
+ z.synchronize()
+ os.unlink(f.name)
+ return redirect(dashboard)
+ else:
+ form = forms.ImportCSVForm()
+ return render(request, 'app/app_form.html', {
+ 'form_title': 'Import CSV containing ASN delegations',
+ 'form': form,
+ 'cancel_url': reverse(dashboard)
+ })
+
+
+@handle_required
+def export_prefixes(request):
+ """Export CSV file containing ASN allocations to children."""
+ conf = request.session['handle']
+ s = cStringIO.StringIO()
+ csv_writer = csv.writer(s, delimiter=' ')
+ for childnet in ChildNet.objects.filter(child__issuer=conf):
+ csv_writer.writerow([childnet.child.handle, str(childnet.as_resource_range())])
+ return serve_xml(s.getvalue(), '%s.prefixes' % conf.handle, ext='csv')
+
+
+@handle_required
+def import_prefixes(request):
+ conf = request.session['handle']
+ if request.method == 'POST':
+ form = forms.ImportCSVForm(request.POST, request.FILES)
+ if form.is_valid():
+ f = NamedTemporaryFile(prefix='prefixes', suffix='.csv', delete=False)
+ f.write(request.FILES['csv'].read())
+ f.close()
+ z = Zookeeper(handle=conf.handle)
+ z.load_prefixes(f.name)
+ z.synchronize()
+ os.unlink(f.name)
+ return redirect(dashboard)
+ else:
+ form = forms.ImportCSVForm()
+ return render(request, 'app/app_form.html', {
+ 'form_title': 'Import CSV containing Prefix delegations',
+ 'form': form,
+ 'cancel_url': reverse(dashboard)
+ })
+
@handle_required
def parent_import(request):
@@ -770,14 +842,12 @@ def roa_import(request):
def roa_export(request):
"""Export CSV containing ROA declarations."""
# FIXME: remove when Zookeeper can do this
- import cStringIO
- import csv
f = cStringIO.StringIO()
- csv = csv.writer(f, delimiter=' ')
+ csv_writer = csv.writer(f, delimiter=' ')
conf = request.session['handle']
# each roa prefix gets a unique group so rpkid will issue separate roas
for group, roapfx in enumerate(ROARequestPrefix.objects.filter(roa_request__issuer=conf)):
- csv.writerow([str(roapfx.as_roa_prefix()), roapfx.roa_request.asn, '%s-%d' % (conf.handle, group)])
+ csv_writer.writerow([str(roapfx.as_roa_prefix()), roapfx.roa_request.asn, '%s-%d' % (conf.handle, group)])
resp = http.HttpResponse(f.getvalue(), mimetype='application/csv')
resp['Content-Disposition'] = 'attachment; filename=roas.csv'
return resp