diff options
Diffstat (limited to 'portal-gui/rpkigui')
-rw-r--r-- | portal-gui/rpkigui/myrpki/admin.py | 20 | ||||
-rw-r--r-- | portal-gui/rpkigui/myrpki/models.py | 35 | ||||
-rw-r--r-- | portal-gui/rpkigui/myrpki/urls.py | 3 | ||||
-rw-r--r-- | portal-gui/rpkigui/myrpki/views.py | 95 | ||||
-rw-r--r-- | portal-gui/rpkigui/settings.py | 2 | ||||
-rw-r--r-- | portal-gui/rpkigui/templates/myrpki/child_view.html | 27 | ||||
-rw-r--r-- | portal-gui/rpkigui/templates/myrpki/dashboard.html | 17 | ||||
-rw-r--r-- | portal-gui/rpkigui/templates/myrpki/parent_view.html | 16 | ||||
-rw-r--r-- | portal-gui/rpkigui/templates/myrpki/resource_view.html | 8 |
9 files changed, 149 insertions, 74 deletions
diff --git a/portal-gui/rpkigui/myrpki/admin.py b/portal-gui/rpkigui/myrpki/admin.py index 72d330a2..3d843bb0 100644 --- a/portal-gui/rpkigui/myrpki/admin.py +++ b/portal-gui/rpkigui/myrpki/admin.py @@ -2,9 +2,6 @@ from django import forms from django.contrib import admin from rpkigui.myrpki import models -#class CertAdmin( admin.ModelAdmin ): -# pass - class ConfAdmin( admin.ModelAdmin ): pass @@ -23,10 +20,13 @@ class ParentAdmin( admin.ModelAdmin ): class RoaAdmin( admin.ModelAdmin ): pass -#admin.site.register( models.Cert, CertAdmin ) -admin.site.register( models.Conf, ConfAdmin ) -admin.site.register( models.Child, ChildAdmin ) -admin.site.register( models.AddressRange, AddressRangeAdmin ) -admin.site.register( models.Asn, AsnAdmin ) -admin.site.register( models.Parent, ParentAdmin ) -admin.site.register( models.Roa, RoaAdmin ) +class ResourceCertAdmin(admin.ModelAdmin): + pass + +admin.site.register(models.Conf, ConfAdmin) +admin.site.register(models.Child, ChildAdmin) +admin.site.register(models.AddressRange, AddressRangeAdmin) +admin.site.register(models.Asn, AsnAdmin) +admin.site.register(models.Parent, ParentAdmin) +admin.site.register(models.Roa, RoaAdmin) +admin.site.register(models.ResourceCert, ResourceCertAdmin) diff --git a/portal-gui/rpkigui/myrpki/models.py b/portal-gui/rpkigui/myrpki/models.py index d062698e..9abc80ed 100644 --- a/portal-gui/rpkigui/myrpki/models.py +++ b/portal-gui/rpkigui/myrpki/models.py @@ -79,10 +79,9 @@ class Parent(models.Model): # service_uri = models.URLField( verify_exists=False ) # sia_base = models.URLField( verify_exists=False ) - # resources granted from my parent - address_range = models.ManyToManyField(AddressRange, blank=True, - related_name='from_parent') - asn = models.ManyToManyField(Asn, related_name='from_parent', blank=True) + #address_range = models.ManyToManyField(AddressRange, blank=True, + # related_name='from_parent') + #asn = models.ManyToManyField(Asn, related_name='from_parent', blank=True) def __unicode__(self): return u"%s's parent %s" % (self.conf, self.handle) @@ -94,15 +93,43 @@ class Parent(models.Model): # parents of a specific configuration should be unique unique_together = ('conf', 'handle') +class ResourceCert(models.Model): + parent = models.ForeignKey(Parent, related_name='resources') + + # resources granted from my parent + asn = models.ManyToManyField(Asn, related_name='from_cert', blank=True, + null=True) + address_range = models.ManyToManyField(AddressRange, related_name='from_cert', + blank=True, null=True) + + # unique id for this resource certificate + # FIXME: URLField(verify_exists=False) doesn't seem to work - the admin + # editor won't accept a rsync:// scheme as valid + uri = models.CharField(max_length=200) + + # certificate validity period + not_before = models.DateTimeField() + not_after = models.DateTimeField() + + def get_absolute_url(self): + return u"/myrpki/resource/%d" % (self.pk,) + + def __unicode__(self): + return u"%s's resource cert from parent %s" % (self.parent.conf.handle, + self.parent.handle) + class Roa(models.Model): conf = models.ForeignKey(Conf, related_name='roas') prefix = models.ManyToManyField(AddressRange) max_len = models.IntegerField() asn = models.IntegerField() comments = models.TextField() + active = models.BooleanField() def __unicode__(self): return u"%s's ROA for %d" % (self.conf, self.asn) def get_absolute_url(self): return u'/myrpki/roa/%d' % (self.pk, ) + +# vim:sw=4 ts=8 expandtab diff --git a/portal-gui/rpkigui/myrpki/urls.py b/portal-gui/rpkigui/myrpki/urls.py index 2a8e2a96..b8230bff 100644 --- a/portal-gui/rpkigui/myrpki/urls.py +++ b/portal-gui/rpkigui/myrpki/urls.py @@ -16,6 +16,7 @@ urlpatterns = patterns('', (r'^import/parent$', views.parent_import), (r'^import/child$', views.child_import), (r'^parent/(?P<parent_handle>[^/]+)$', views.parent_view), + (r'^child/(?P<child_handle>[^/]+)$', views.child_view), # (r'^parent/(?P<parent_handle>[^/]+)/address$', views.parent_address), # (r'^parent/(?P<parent_handle>[^/]+)/asn$', views.parent_asn), (r'^address/(?P<pk>\d+)$', views.address_view), @@ -23,3 +24,5 @@ urlpatterns = patterns('', (r'^roa/$', views.roa_edit ), (r'^roa/(?P<pk>\d+)$', views.roa_edit ), ) + +# vim:sw=4 ts=8 expandtab diff --git a/portal-gui/rpkigui/myrpki/views.py b/portal-gui/rpkigui/myrpki/views.py index 1789fd91..c7d93779 100644 --- a/portal-gui/rpkigui/myrpki/views.py +++ b/portal-gui/rpkigui/myrpki/views.py @@ -91,14 +91,16 @@ def dashboard(request): roa_asns = [r.asn for r in handle.roas.all()] # get list of unallocated asns asns = [o for p in handle.parents.all() - for o in p.asn.filter(parent__isnull=True, allocated__isnull=True).exclude(lo__in=roa_asns) + for c in p.resources.all() + for o in c.asn.filter(parent__isnull=True, allocated__isnull=True).exclude(lo__in=roa_asns) if (o.hi == o.lo)] # get list of address ranges included in ROAs roa_addrs = [p for r in handle.roas.all() for p in r.prefix.all()] # get list of unallocated address ranges ars = [o for p in handle.parents.all() - for o in p.address_range.filter(parent__isnull=True, allocated__isnull=True) + for c in p.resources.all() + for o in c.address_range.filter(parent__isnull=True, allocated__isnull=True) if (not o in roa_addrs)] return render('myrpki/dashboard.html', { 'conf': handle, 'asns': asns, @@ -138,36 +140,36 @@ def dashboard(request): # return delete_object( request, model=models.Cert, object_id=id, # post_delete_redirect='/dashboard/' ) -@login_required -def conf_add(request): - '''Allow the user to create a new configuration.''' - errors = [] - if request.method == 'POST': - form = forms.AddConfForm(request.POST) - if form.is_valid(): - try: - handle = form.cleaned_data['handle'] - # ensure this user is in the group for this handle - grps = request.user.groups.filter(name=handle) - if len(grps) == 0: - errors.append( - 'You are not in the proper group for that handle.') - else: - conf = models.Conf.objects.create( - handle=form.cleaned_data['handle'], owner=grps[0]) - conf.save() - glue.form_to_conf(form.cleaned_data) - return http.HttpResponseRedirect('/myrpki/') - # data model will ensure the handle is unique - except IntegrityError, e: - print e - errors.append('That handle already exists.') - else: - errors.append("The form wasn't valid.") - else: - form = forms.AddConfForm() - return render_to_response('myrpki/add_conf.html', - { 'form': form, 'errors': errors }) +#@login_required +#def conf_add(request): +# '''Allow the user to create a new configuration.''' +# errors = [] +# if request.method == 'POST': +# form = forms.AddConfForm(request.POST) +# if form.is_valid(): +# try: +# handle = form.cleaned_data['handle'] +# # ensure this user is in the group for this handle +# grps = request.user.groups.filter(name=handle) +# if len(grps) == 0: +# errors.append( +# 'You are not in the proper group for that handle.') +# else: +# conf = models.Conf.objects.create( +# handle=form.cleaned_data['handle'], owner=grps[0]) +# conf.save() +# glue.form_to_conf(form.cleaned_data) +# return http.HttpResponseRedirect('/myrpki/') +# # data model will ensure the handle is unique +# except IntegrityError, e: +# print e +# errors.append('That handle already exists.') +# else: +# errors.append("The form wasn't valid.") +# else: +# form = forms.AddConfForm() +# return render_to_response('myrpki/add_conf.html', +# { 'form': form, 'errors': errors }) @login_required def conf_list(request): @@ -314,26 +316,23 @@ def child_import(request): { 'form': form, 'kind': 'child', 'post_url': '/myrpki/import/child'}, request) -def get_parent_or_404(handle, obj): - '''Return the Parent object that the given address range derives +def get_parents_or_404(handle, obj): + '''Return the Parent object(s) that the given address range derives from, or raise a 404 error.''' while obj.parent: obj = obj.parent - if isinstance(obj, models.AddressRange): - fn = lambda x: x.address_range.all() - else: - fn = lambda x: x.asn.all() + cert_set = obj.from_cert.filter(parent__in=handle.parents.all()) + if cert_set.count() == 0: + raise http.Http404 - for p in handle.parents.all(): - if obj in fn(p): return p - raise http.Http404 + return handle.parents.filter(pk__in=[c.parent.pk for c in cert_set]) def resource_view(request, object_type, form_type, pk): '''view/subdivide an address range.''' handle = request.session['handle'] obj = get_object_or_404(object_type, pk=pk) # ensure this resource range belongs to a parent of the current conf - parent = get_parent_or_404(handle, obj) + parent_set = get_parents_or_404(handle, obj) if request.method == 'POST': form = form_type(handle, obj, request.POST) @@ -357,7 +356,7 @@ def resource_view(request, object_type, form_type, pk): else: form = form_type(handle, obj) return render('myrpki/resource_view.html', { 'addr': obj, 'form': form, - 'parent': parent }, request) + 'parent': parent_set }, request) @handle_required def address_view(request, pk): @@ -405,3 +404,13 @@ def roa_edit(request, pk=None): prefix = [o.pk for o in obj.prefix.all()] if obj else [] form = forms.RoaForm(handle, asn, comments, prefix) return render('myrpki/roaform.html', { 'form': form }, request) + +@handle_required +def child_view(request, child_handle): + '''Detail view of child for the currently selected handle.''' + handle = request.session['handle'] + child = get_object_or_404(handle.children.all(), handle__exact=child_handle) + + return render('myrpki/child_view.html', { 'child': child }, request) + +# vim:sw=4 ts=8 expandtab diff --git a/portal-gui/rpkigui/settings.py b/portal-gui/rpkigui/settings.py index 529b0235..bc7a6a99 100644 --- a/portal-gui/rpkigui/settings.py +++ b/portal-gui/rpkigui/settings.py @@ -62,7 +62,7 @@ MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', # for django 1.2 -# 'django.middleware.csrf.CsrfMiddleware' + 'django.middleware.csrf.CsrfMiddleware' ) ROOT_URLCONF = 'rpkigui.urls' diff --git a/portal-gui/rpkigui/templates/myrpki/child_view.html b/portal-gui/rpkigui/templates/myrpki/child_view.html new file mode 100644 index 00000000..77e2cf51 --- /dev/null +++ b/portal-gui/rpkigui/templates/myrpki/child_view.html @@ -0,0 +1,27 @@ +{% extends "base.html" %} + +{% block content %} +<p>Handle: <a href="/myrpki/">{{ request.session.handle.handle }}</a> +<h1>Child View</h1> +<p>Child: {{ child.handle }} + +<h2>Delegated Addresses</h2> +<table> + <tr><td>Low</td><td>High</td><td></td></tr> +{% for a in child.address_range.all %} +<tr> + <td>{{ a.lo }}</td> + <td>{{ a.hi }}</td> + <td><a href="{{ a.get_absolute_url }}">view</a></td> +</tr> +{% endfor %} +</table> + +<h2>Delegated ASNs</h2> +<ul> +{% for a in child.asn.all %} +<li><a href="{{ a.get_absolute_url }}">{{ a }}</a> +{% endfor %} +</ul> + +{% endblock %} diff --git a/portal-gui/rpkigui/templates/myrpki/dashboard.html b/portal-gui/rpkigui/templates/myrpki/dashboard.html index 12fee303..692e204d 100644 --- a/portal-gui/rpkigui/templates/myrpki/dashboard.html +++ b/portal-gui/rpkigui/templates/myrpki/dashboard.html @@ -7,22 +7,31 @@ <div style="border: inset"> <h1 style="text-align: center">Parents</h1> + <ul> {% for parent in request.session.handle.parents.all %} <li><a href="{{ parent.get_absolute_url }}">{{ parent.handle }}</a> -{% if parent.asn.count or parent.address_range.count %} + +{% if parent.resources.count %} <p>Accepted resources: <ul> -{% for asn in parent.asn.all %} +{% for cert in parent.resources.all %} + +{% for asn in cert.asn.all %} <li><a href="{{ asn.get_absolute_url }}">{{ asn }}</a> {% endfor %} -{% for address in parent.address_range.all %} + +{% for address in cert.address_range.all %} <li><a href="{{ address.get_absolute_url }}">{{ address }}</a> {% endfor %} + +{% endfor %} <!--certs--> </ul> {% endif %} + {% endfor %} </ul> + <a href="/myrpki/import/parent">[add]</a> </div> @@ -32,7 +41,7 @@ <p> <ul> {% for child in request.session.handle.children.all %} -<li><a href="/myrpki/child/{{ child.handle }}/">{{ child.handle }}</a> +<li><a href="/myrpki/child/{{ child.handle }}">{{ child.handle }}</a> {% if child.address_range.count or child.asn.count %} <p>Delegated resources: <ul> diff --git a/portal-gui/rpkigui/templates/myrpki/parent_view.html b/portal-gui/rpkigui/templates/myrpki/parent_view.html index 1f1c2465..9756c83a 100644 --- a/portal-gui/rpkigui/templates/myrpki/parent_view.html +++ b/portal-gui/rpkigui/templates/myrpki/parent_view.html @@ -5,30 +5,26 @@ <h1>Parent View</h1> <p>Parent: {{ parent.handle }} <h2>Delegated Addresses</h2> -{% if parent.address_range.count %} <table> <tr><td>Low</td><td>High</td><td></td></tr> -{% for a in parent.address_range.all %} +{% for c in parent.resources.all %} +{% for a in c.address_range.all %} <tr> <td>{{ a.lo }}</td> <td>{{ a.hi }}</td> <td><a href="{{ a.get_absolute_url }}">view</a></td> </tr> {% endfor %} +{% endfor %} </table> -{% else %} -<p>--none-- -{% endif %} <h2>Delegated ASNs</h2> -{% if parent.asn.count %} <ul> -{% for a in parent.asn.all %} +{% for c in parent.resources.all %} +{% for a in c.asn.all %} <li><a href="{{ a.get_absolute_url }}">{{ a }}</a> {% endfor %} +{% endfor %} </ul> -{% else %} -<p>--none-- -{% endif %} {% endblock %} diff --git a/portal-gui/rpkigui/templates/myrpki/resource_view.html b/portal-gui/rpkigui/templates/myrpki/resource_view.html index e2992f4e..d230e66f 100644 --- a/portal-gui/rpkigui/templates/myrpki/resource_view.html +++ b/portal-gui/rpkigui/templates/myrpki/resource_view.html @@ -8,8 +8,12 @@ <td>Range:</td><td>{{ addr }}</td> </tr> <tr> - <td>Parent:</td> - <td><a href="{{ parent.get_absolute_url }}">{{ parent.handle }}</a></td> + <td>Received from:</td> + <td> + {% for p in parent %} + <a href="{{ p.get_absolute_url }}">{{ p.handle }}</a> + {% endfor %} + </td> </tr> {% if addr.parent %} <tr> |