aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--portal-gui/rpkigui/myrpki/glue.py18
-rw-r--r--portal-gui/rpkigui/myrpki/urls.py6
-rw-r--r--portal-gui/rpkigui/myrpki/views.py29
-rw-r--r--portal-gui/rpkigui/templates/myrpki/dashboard.html7
4 files changed, 55 insertions, 5 deletions
diff --git a/portal-gui/rpkigui/myrpki/glue.py b/portal-gui/rpkigui/myrpki/glue.py
index 8fb74812..009acc68 100644
--- a/portal-gui/rpkigui/myrpki/glue.py
+++ b/portal-gui/rpkigui/myrpki/glue.py
@@ -21,6 +21,7 @@ from __future__ import with_statement
import os
import os.path
import csv
+import stat
import sys
from django.conf import settings
@@ -55,11 +56,20 @@ def invoke_rpki(handle, args):
print 'invoking', cmd
os.system(cmd)
-def read_identity(handle):
- fname = settings.MYRPKI_DATA_DIR + '/' + handle + '/entitydb/identity.xml'
- with open(fname, 'r') as fp:
+def read_file_from_handle(handle, fname):
+ """read a filename relative to the directory for the given resource handle. returns
+ a tuple of (content, mtime)"""
+ with open(settings.MYRPKI_DATA_DIR + '/' + handle + '/' + fname, 'r') as fp:
data = fp.read()
- return data
+ mtime = os.fstat(fp.fileno())[stat.ST_MTIME]
+ return data, mtime
+
+#def read_identity(handle):
+# fname = settings.MYRPKI_DATA_DIR + '/' + handle + '/entitydb/identity.xml'
+# with open(fname, 'r') as fp:
+# data = fp.read()
+# return data
+read_identity = lambda h: read_file_from_handle(h, 'entitydb/identity.xml')[0]
def read_child_response(handle, child):
fname = '%s/%s/entitydb/children/%s.xml' % (settings.MYRPKI_DATA_DIR, handle, child)
diff --git a/portal-gui/rpkigui/myrpki/urls.py b/portal-gui/rpkigui/myrpki/urls.py
index dff4d283..64d1888e 100644
--- a/portal-gui/rpkigui/myrpki/urls.py
+++ b/portal-gui/rpkigui/myrpki/urls.py
@@ -38,7 +38,11 @@ urlpatterns = patterns('',
(r'^address/(?P<pk>\d+)/delete$', views.prefix_delete_view),
(r'^asn/(?P<pk>\d+)$', views.asn_view),
(r'^asn/(?P<pk>\d+)/allocate$', views.asn_allocate_view),
- (r'^roa/(?P<pk>\d+)/delete$', views.roa_request_delete_view)
+ (r'^roa/(?P<pk>\d+)/delete$', views.roa_request_delete_view),
+ (r'^demo/down/asns/(?P<self_handle>[^/]+)$', views.download_asns),
+ (r'^demo/down/prefixes/(?P<self_handle>[^/]+)$', views.download_prefixes),
+ (r'^demo/down/roas/(?P<self_handle>[^/]+)$', views.download_roas),
+ (r'^demo/up/myrpki/(?P<self_handle>[^/]+)$', views.upload_myrpki)
)
# vim:sw=4 ts=8 expandtab
diff --git a/portal-gui/rpkigui/myrpki/views.py b/portal-gui/rpkigui/myrpki/views.py
index 7827f706..68c8868e 100644
--- a/portal-gui/rpkigui/myrpki/views.py
+++ b/portal-gui/rpkigui/myrpki/views.py
@@ -15,6 +15,7 @@ OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
"""
+import email.utils
import os
import tempfile
@@ -450,4 +451,32 @@ def asn_allocate_view(request, pk):
return render('myrpki/asn_view.html', { 'form': form,
'asn': obj, 'form': form, 'parent': parent_set }, request)
+@login_required
+def download_csv(request, self_handle, fname):
+ #ensure the requested handle is available to this user
+ conf_set = models.Conf.objects.filter(owner=request.user, handle=self_handle)
+ if not conf_set:
+ raise http.Http404, 'no such resource handle'
+ conf = conf_set[0]
+ fname = fname + '.csv'
+ content, mtime = glue.read_file_from_handle(conf.handle, fname)
+ resp = http.HttpResponse(content , mimetype='text/csv')
+ resp['Content-Disposition'] = 'attachment; filename=%s' % (fname, )
+ resp['Last-Modified'] = email.utils.formatdate(mtime, usegmt=True)
+ return resp
+
+def download_asns(request, self_handle):
+ return download_csv(request, self_handle, 'asns')
+
+def download_roas(request, self_handle):
+ return download_csv(request, self_handle, 'roas')
+
+def download_prefixes(request, self_handle):
+ return download_csv(request, self_handle, 'prefixes')
+
+@login_required
+def upload_myrpki(request, self_handle):
+ "handles POST of the myrpki.xml file for a given handle."
+ raise http.Http404, 'not implemented'
+
# vim:sw=4 ts=8 expandtab
diff --git a/portal-gui/rpkigui/templates/myrpki/dashboard.html b/portal-gui/rpkigui/templates/myrpki/dashboard.html
index ea925653..6be83b76 100644
--- a/portal-gui/rpkigui/templates/myrpki/dashboard.html
+++ b/portal-gui/rpkigui/templates/myrpki/dashboard.html
@@ -75,6 +75,10 @@ td { border: solid 1px; text-align: center; padding-left: 1em; padding-right: 1e
<p>-- none --
{% endif %}
+<p>
+Export (csv): <a href="/myrpki/demo/down/asns/{{ request.session.handle }}">asns</a> |
+<a href="/myrpki/demo/down/prefixes/{{ request.session.handle }}">prefixes</a>
+
</div>
<div style="border: outset"> <!-- ROAs -->
@@ -96,6 +100,9 @@ td { border: solid 1px; text-align: center; padding-left: 1em; padding-right: 1e
</tr>
{% endfor %}
</table>
+
+<p><a href="/myrpki/demo/down/roas/{{ request.session.handle }}">export (csv)</a>
+
</div><!-- roas -->
<div style="border: outset">