diff options
-rw-r--r-- | portal-gui/rpkigui/myrpki/glue.py | 18 | ||||
-rw-r--r-- | portal-gui/rpkigui/myrpki/urls.py | 6 | ||||
-rw-r--r-- | portal-gui/rpkigui/myrpki/views.py | 29 | ||||
-rw-r--r-- | portal-gui/rpkigui/templates/myrpki/dashboard.html | 7 |
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"> |