aboutsummaryrefslogtreecommitdiff
path: root/rpkid/rpki
diff options
context:
space:
mode:
Diffstat (limited to 'rpkid/rpki')
-rw-r--r--rpkid/rpki/gui/app/forms.py18
-rw-r--r--rpkid/rpki/gui/app/models.py8
-rw-r--r--rpkid/rpki/gui/app/templates/app/child_detail.html3
-rw-r--r--rpkid/rpki/gui/app/templates/app/client_detail.html24
-rw-r--r--rpkid/rpki/gui/app/templates/app/dashboard.html11
-rw-r--r--rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html7
-rw-r--r--rpkid/rpki/gui/app/templates/app/object_confirm_delete.html4
-rw-r--r--rpkid/rpki/gui/app/templates/app/object_detail.html3
-rw-r--r--rpkid/rpki/gui/app/templates/app/parent_detail.html2
-rw-r--r--rpkid/rpki/gui/app/templates/app/roa_detail.html25
-rw-r--r--rpkid/rpki/gui/app/templates/app/user_list.html10
-rw-r--r--rpkid/rpki/gui/app/urls.py3
-rw-r--r--rpkid/rpki/gui/app/views.py61
13 files changed, 92 insertions, 87 deletions
diff --git a/rpkid/rpki/gui/app/forms.py b/rpkid/rpki/gui/app/forms.py
index 74874d49..1057ee01 100644
--- a/rpkid/rpki/gui/app/forms.py
+++ b/rpkid/rpki/gui/app/forms.py
@@ -58,11 +58,6 @@ class GhostbusterRequestForm(forms.ModelForm):
parent = forms.ModelChoiceField(queryset=None, required=False,
help_text='Specify specific parent, or none for all parents')
- # override full_name. it is required in the db schema, but we allow the
- # user to skip it and default from family+given name
- full_name = forms.CharField(max_length=40, required=False,
- help_text='automatically generated from family and given names if left blank')
-
#override
issuer = forms.ModelChoiceField(queryset=None, widget=forms.HiddenInput)
@@ -77,14 +72,10 @@ class GhostbusterRequestForm(forms.ModelForm):
class Meta:
model = models.GhostbusterRequest
- exclude = ('vcard')
+ exclude = ('vcard', 'given_name', 'family_name', 'additional_name',
+ 'honorific_prefix', 'honorific_suffix')
def clean(self):
- family_name = self.cleaned_data.get('family_name')
- given_name = self.cleaned_data.get('given_name')
- if not all([family_name, given_name]):
- raise forms.ValidationError('Family and Given names must be specified')
-
email = self.cleaned_data.get('email_address')
postal = self.cleaned_data.get('postal_address')
telephone = self.cleaned_data.get('telephone')
@@ -92,11 +83,6 @@ class GhostbusterRequestForm(forms.ModelForm):
raise forms.ValidationError(
'One of telephone, email or postal address must be specified')
- # if the full name is not specified, default to given+family
- fn = self.cleaned_data.get('full_name')
- if not fn:
- self.cleaned_data['full_name'] = '%s %s' % (given_name, family_name)
-
return self.cleaned_data
diff --git a/rpkid/rpki/gui/app/models.py b/rpkid/rpki/gui/app/models.py
index 0ed01aa8..2975aa0a 100644
--- a/rpkid/rpki/gui/app/models.py
+++ b/rpkid/rpki/gui/app/models.py
@@ -119,10 +119,6 @@ class Conf(rpki.irdb.models.ResourceHolderCA):
def roas(self):
return ROARequest.objects.filter(issuer=self)
- @models.permalink
- def get_absolute_url(self):
- return ('rpki.gui.app.views.user_detail', [str(self.pk)])
-
class Meta:
proxy = True
@@ -184,11 +180,9 @@ class ROARequest(rpki.irdb.models.ROARequest):
class ROARequestPrefix(rpki.irdb.models.ROARequestPrefix):
class Meta:
proxy = True
- verbose_name = 'ROA'
def __unicode__(self):
- return u'ROA request prefix %s for asn %d' % (str(self.as_roa_prefix()),
- self.roa_request.asn)
+ return u'ROA Request Prefix %s' % str(self.as_roa_prefix())
class GhostbusterRequest(rpki.irdb.models.GhostbusterRequest):
diff --git a/rpkid/rpki/gui/app/templates/app/child_detail.html b/rpkid/rpki/gui/app/templates/app/child_detail.html
index 8d62a278..0c6a4922 100644
--- a/rpkid/rpki/gui/app/templates/app/child_detail.html
+++ b/rpkid/rpki/gui/app/templates/app/child_detail.html
@@ -47,8 +47,9 @@
{% endblock object_display %}
{% block action %}
-{{ block.super }}
+<a class='btn' href="{% url rpki.gui.app.views.child_edit object.pk %}" title='Edit this child'><i class="icon-edit"></i> Edit</a>
<a class='btn' href="{% url rpki.gui.app.views.child_add_asn object.pk %}" title='Delegate an ASN to this child'><i class="icon-plus-sign"></i> AS</a>
<a class='btn' href="{% url rpki.gui.app.views.child_add_prefix object.pk %}" title='Delegate a prefix to this child'><i class="icon-plus-sign"></i> Prefix</a>
<a class='btn' href="{% url rpki.gui.app.views.child_response object.pk %}" title='Download XML file to send to child'><i class="icon-download"></i> Export</a>
+{{ block.super }}
{% endblock action %}
diff --git a/rpkid/rpki/gui/app/templates/app/client_detail.html b/rpkid/rpki/gui/app/templates/app/client_detail.html
index 0638e05b..bb9ea212 100644
--- a/rpkid/rpki/gui/app/templates/app/client_detail.html
+++ b/rpkid/rpki/gui/app/templates/app/client_detail.html
@@ -2,19 +2,17 @@
{% block object_display %}
<div class='row'>
- <div class='span2'>
- <p><strong>Name</strong>
- </div>
- <div class='span6'>
- <p>{{ object.handle }}
- </div>
-</div>
-<div class='row'>
- <div class='span2'>
- <p><strong>SIA</strong>
- </div>
- <div class='span6'>
- <p>{{ object.sia_base }}
+ <div class='span3'>
+ <table class="table">
+ <tr>
+ <td>Name</td>
+ <td>{{ object.handle }} </td>
+ </tr>
+ <tr>
+ <td>SIA</td>
+ <td>{{ object.sia_base }}</td>
+ </tr>
+ </table>
</div>
</div>
{% endblock object_display %}
diff --git a/rpkid/rpki/gui/app/templates/app/dashboard.html b/rpkid/rpki/gui/app/templates/app/dashboard.html
index 71398115..d7a660c4 100644
--- a/rpkid/rpki/gui/app/templates/app/dashboard.html
+++ b/rpkid/rpki/gui/app/templates/app/dashboard.html
@@ -105,6 +105,7 @@
<td>{{ roa.prefixes.all.0.max_prefixlen }}</td>
<td>{{ roa.asn }}</td>
<td>
+ <a class="btn btn-mini" href="{% url rpki.gui.app.views.roa_detail roa.pk %}" title="Detail"><i class="icon-info-sign"></i></a>
<a class="btn btn-mini" href="{% url rpki.gui.app.views.roa_delete roa.pk %}" title="Delete"><i class="icon-trash"></i></a>
</td>
</tr>
@@ -126,6 +127,7 @@
<td>{{ gbr.email_address }}</td>
<td>{{ gbr.telephone }}</td>
<td>
+ <a class="btn btn-mini" href="{% url gbr-detail gbr.pk %}" title="View"><i class="icon-info-sign"></i></a>
<a class="btn btn-mini" href="{% url gbr-edit gbr.pk %}" title="Edit"><i class="icon-edit"></i></a>
<a class="btn btn-mini" href="{% url gbr-delete gbr.pk %}" title="Delete"><i class="icon-trash"></i></a>
</td>
@@ -142,11 +144,12 @@
<h1>Children</h1>
</div>
<table class="table table-condensed table-striped">
+ <tr><th>Handle</th><th></th>
{% for child in conf.children %}
<tr>
<td><a href="{{ child.get_absolute_url }}">{{ child.handle }}</a></td>
<td>
- <a class="btn btn-mini" href="{% url rpki.gui.app.views.child_delete child.pk %}"><i class="icon-trash"></i></a>
+ <a class="btn btn-mini" href="{% url rpki.gui.app.views.child_delete child.pk %}" title="Delete"><i class="icon-trash"></i></a>
</td>
</tr>
{% endfor %}
@@ -163,7 +166,7 @@
<tr>
<td><a href="{{ parent.get_absolute_url }}">{{ parent.handle }}</a></td>
<td>
- <a class="btn btn-mini" href="{% url rpki.gui.app.views.parent_delete parent.pk %}"><i class="icon-trash"></i></a>
+ <a class="btn btn-mini" href="{% url rpki.gui.app.views.parent_delete parent.pk %}" title="Delete"><i class="icon-trash"></i></a>
</td>
</tr>
{% endfor %}
@@ -183,7 +186,7 @@
<tr>
<td><a href="{{ repo.get_absolute_url }}">{{ repo.handle }}</a></td>
<td>
- <a class="btn btn-mini" href="{% url rpki.gui.app.views.repository_delete repo.pk %}"><i class="icon-trash"></i></a>
+ <a class="btn btn-mini" href="{% url rpki.gui.app.views.repository_delete repo.pk %}" title="Delete"><i class="icon-trash"></i></a>
</td>
</tr>
{% endfor %}
@@ -201,7 +204,7 @@
<tr>
<td><a href="{% url rpki.gui.app.views.client_detail client.pk %}">{{ client.handle }}</a></td>
<td>
- <a class="btn btn-mini" href="{% url rpki.gui.app.views.client_delete client.pk %}"><i class="icon-trash"></i></a>
+ <a class="btn btn-mini" href="{% url rpki.gui.app.views.client_delete client.pk %}" title="Delete"><i class="icon-trash"></i></a>
</td>
</tr>
{% endfor %}
diff --git a/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html b/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html
index f4cb3c0f..abaa7560 100644
--- a/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html
+++ b/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html
@@ -2,7 +2,7 @@
{% block object_display %}
<table class='table table-striped table-condensed'>
- <tr><td >Full Name</td><td>{{ object.full_name }}</td></tr>
+ <tr><td>Full Name</td><td>{{ object.full_name }}</td></tr>
{% if object.honorific_prefix %}
<tr><td >Honorific Prefix</td><td>{{ object.honorific_prefix }}</td></tr>
@@ -50,3 +50,8 @@
</table>
{% endblock object_display %}
+
+{% block action %}
+{{ block.super }}
+<a class="btn" href="{% url gbr-edit object.pk %}"><i class="icon-edit"></i> Edit</a>
+{% endblock %}
diff --git a/rpkid/rpki/gui/app/templates/app/object_confirm_delete.html b/rpkid/rpki/gui/app/templates/app/object_confirm_delete.html
index da60409e..821b70b5 100644
--- a/rpkid/rpki/gui/app/templates/app/object_confirm_delete.html
+++ b/rpkid/rpki/gui/app/templates/app/object_confirm_delete.html
@@ -16,7 +16,7 @@ string specifying the concrete template to inherit from.
<form action='' method='POST'>
{% csrf_token %}
- <input class='btn btn-danger' type='submit' value='Confirm'>
- <a class='btn' href="{{ object.get_absolute_url }}">Cancel</a>
+ <input class='btn btn-danger' type='submit' value='Delete'>
+ <a class='btn' href="{% url rpki.gui.app.views.dashboard %}">Cancel</a>
</form>
{% endblock %}
diff --git a/rpkid/rpki/gui/app/templates/app/object_detail.html b/rpkid/rpki/gui/app/templates/app/object_detail.html
index 131e24cc..81fdbdf0 100644
--- a/rpkid/rpki/gui/app/templates/app/object_detail.html
+++ b/rpkid/rpki/gui/app/templates/app/object_detail.html
@@ -12,8 +12,7 @@
{% endblock object_display %}
{% block action %}
-<a class="btn" href="{{ object.get_absolute_url }}edit"><i class="icon-edit"></i> Edit</a>
-<a class="btn btn-danger" href="{{ object.get_absolute_url }}delete"><i class="icon-trash icon-white"></i> Delete</a>
+<a class="btn" href="{{ object.get_absolute_url }}delete" title="Delete this object"><i class="icon-trash"></i> Delete</a>
{% endblock action %}
{% endblock content %}
diff --git a/rpkid/rpki/gui/app/templates/app/parent_detail.html b/rpkid/rpki/gui/app/templates/app/parent_detail.html
index 591de843..c50d37e5 100644
--- a/rpkid/rpki/gui/app/templates/app/parent_detail.html
+++ b/rpkid/rpki/gui/app/templates/app/parent_detail.html
@@ -59,5 +59,5 @@
{% block action %}
{{ block.super }}
-<a class='btn' href='{{ object.get_absolute_url }}export' title='Download XML to send to repository operator'>Export</a>
+<a class='btn' href='{{ object.get_absolute_url }}export' title='Download XML to send to repository operator'><i class="icon-download"></i> Export</a>
{% endblock action %}
diff --git a/rpkid/rpki/gui/app/templates/app/roa_detail.html b/rpkid/rpki/gui/app/templates/app/roa_detail.html
new file mode 100644
index 00000000..5500941f
--- /dev/null
+++ b/rpkid/rpki/gui/app/templates/app/roa_detail.html
@@ -0,0 +1,25 @@
+{% extends "app/object_detail.html" %}
+
+{% block object_display %}
+<div class="row">
+ <div class="span3 well">
+ <table class="table">
+ <tr><th>Prefix</th><th>Max Length</th><th>AS</th></tr>
+ <tr>
+ <td>{{ object.prefixes.all.0.as_roa_prefix }}</td>
+ <td>{{ object.prefixes.all.0.max_prefixlen }}</td>
+ <td>{{ object.asn }}</td>
+ </tr>
+ </table>
+ </div>
+ <div class="span2">
+ <h3>Covered Routes</h3>
+ <table class="table">
+ <tr><th>Prefix</th><th>AS</th></tr>
+ {% for r in routes %}
+ <tr><td>{{ r.as_resource_range }}</td><td>{{ r.asn }}</td></tr>
+ {% endfor %}
+ </table>
+ </div>
+</div>
+{% endblock %}
diff --git a/rpkid/rpki/gui/app/templates/app/user_list.html b/rpkid/rpki/gui/app/templates/app/user_list.html
index 607e5a9c..fed943f0 100644
--- a/rpkid/rpki/gui/app/templates/app/user_list.html
+++ b/rpkid/rpki/gui/app/templates/app/user_list.html
@@ -9,21 +9,19 @@
<tr>
<th>Username</th>
<th>Email</th>
- <th>Action</th>
+ <th></th>
</tr>
{% for u in users %}
<tr>
<td>{{ u.0.handle }}</td>
<td>{{ u.1.email }}</td>
<td>
- <a class='btn small' href='{{ u.0.get_absolute_url }}/edit'>Edit</a>
- <a class='btn small danger' href='{{ u.0.get_absolute_url }}/delete'>Delete</a>
+ <a class='btn btn-small' href='{% url rpki.gui.app.views.user_edit u.0.pk %}' title="Edit"><i class="icon-edit"></i></a>
+ <a class='btn btn-small' href='{% url rpki.gui.app.views.user_delete u.0.pk %}' title="Delete"><i class="icon-trash"></i></a>
</td>
</tr>
{% endfor %}
</table>
-<div class='actions'>
- <a class='btn' href="{% url rpki.gui.app.views.user_create %}" title="create a new locally hosted resource handle">Create</a>
-</div>
+<a class='btn' href="{% url rpki.gui.app.views.user_create %}" title="create a new locally hosted resource handle">Create</a>
{% endblock content %}
diff --git a/rpkid/rpki/gui/app/urls.py b/rpkid/rpki/gui/app/urls.py
index 99e0c7dc..c8dfaf1f 100644
--- a/rpkid/rpki/gui/app/urls.py
+++ b/rpkid/rpki/gui/app/urls.py
@@ -49,15 +49,14 @@ urlpatterns = patterns(
(r'^repo/import$', views.repository_import),
(r'^repo/(?P<pk>\d+)/$', views.repository_detail),
(r'^repo/(?P<pk>\d+)/delete$', views.repository_delete),
+ (r'^roa/(?P<pk>\d+)/$', views.roa_detail),
(r'^roa/create$', views.roa_create),
(r'^roa/confirm$', views.roa_create_confirm),
(r'^roa/(?P<pk>\d+)/delete$', views.roa_delete),
(r'^route/$', views.route_view),
- (r'^route/(?P<pk>\d+)/$', views.route_detail),
(r'^route/(?P<pk>\d+)/roa/$', views.route_roa_list),
(r'^user/$', views.user_list),
(r'^user/create$', views.user_create),
- (r'^user/(?P<pk>\d+)/$', views.user_detail),
(r'^user/(?P<pk>\d+)/delete$', views.user_delete),
(r'^user/(?P<pk>\d+)/edit$', views.user_edit),
)
diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py
index 05d6380b..1a8be108 100644
--- a/rpkid/rpki/gui/app/views.py
+++ b/rpkid/rpki/gui/app/views.py
@@ -29,11 +29,9 @@ from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, render
from django.utils.http import urlquote
from django import http
-from django.views.generic.list_detail import object_detail
from django.core.urlresolvers import reverse, reverse_lazy
from django.contrib.auth.models import User
from django.views.generic import DetailView, CreateView, UpdateView, DeleteView
-from django.conf import settings
from rpki.irdb import Zookeeper, ChildASN, ChildNet
from rpki.gui.app import models, forms, glue, range_list
@@ -41,7 +39,8 @@ from rpki.resource_set import (resource_range_as, resource_range_ipv4,
resource_range_ipv6, roa_prefix_ipv4)
from rpki import sundial
-from rpki.gui.cacheview.models import ROAPrefixV4, ROAPrefixV6, ROA
+from rpki.gui.cacheview.models import ROAPrefixV4, ROA
+from rpki.gui.routeview.models import RouteOrigin
def superuser_required(f):
@@ -321,9 +320,7 @@ def child_add_prefix(request, pk):
version = 'IPv4'
child.address_ranges.create(start_ip=str(r.min), end_ip=str(r.max),
version=version)
- z = Zookeeper(handle=conf.handle, logstream=logstream)
- if settings.RPKID_RUN:
- z.run_rpkid_now()
+ Zookeeper(handle=conf.handle, logstream=logstream).run_rpkid_now()
return http.HttpResponseRedirect(child.get_absolute_url())
else:
form = forms.AddNetForm(child=child)
@@ -342,9 +339,7 @@ def child_add_asn(request, pk):
asns = form.cleaned_data.get('asns')
r = resource_range_as.parse_str(asns)
child.asns.create(start_as=r.min, end_as=r.max)
- if settings.RPKID_RUN:
- z = Zookeeper(handle=conf.handle, logstream=logstream)
- z.run_rpkid_now()
+ Zookeeper(handle=conf.handle, logstream=logstream).run_rpkid_now()
return http.HttpResponseRedirect(child.get_absolute_url())
else:
form = forms.AddASNForm(child=child)
@@ -373,8 +368,7 @@ def child_edit(request, pk):
# remove AS & prefixes that are not selected in the form
models.ChildASN.objects.filter(child=child).exclude(pk__in=form.cleaned_data.get('as_ranges')).delete()
models.ChildNet.objects.filter(child=child).exclude(pk__in=form.cleaned_data.get('address_ranges')).delete()
- if settings.RPKID_RUN:
- Zookeeper(handle=conf.handle, logstream=log).run_rpkid_now()
+ Zookeeper(handle=conf.handle, logstream=log).run_rpkid_now()
return http.HttpResponseRedirect(child.get_absolute_url())
else:
form = form_class(initial={
@@ -425,6 +419,19 @@ def child_delete(request, pk):
@handle_required
+def roa_detail(request, pk):
+ conf = request.session['handle']
+ obj = get_object_or_404(conf.roas, pk=pk)
+ pfx = obj.prefixes.all()[0].as_resource_range()
+ routes = RouteOrigin.objects.filter(prefix_min__gte=pfx.min,
+ prefix_max__lte=pfx.max)
+ return render(request, 'app/roa_detail.html', {
+ 'object': obj,
+ 'routes': routes,
+ })
+
+
+@handle_required
def roa_create(request):
"""Present the user with a form to create a ROA.
@@ -507,8 +514,7 @@ def roa_create_confirm(request):
roa.prefixes.create(version=v, prefix=str(rng.min),
prefixlen=rng.prefixlen(),
max_prefixlen=max_prefixlen)
- if settings.RPKID_RUN:
- Zookeeper(handle=conf.handle, logstream=log).run_rpkid_now()
+ Zookeeper(handle=conf.handle, logstream=log).run_rpkid_now()
return http.HttpResponseRedirect(reverse(dashboard))
# What should happen when the submission form isn't valid? For now
# just fall through and redirect back to the ROA creation form
@@ -528,8 +534,7 @@ def roa_delete(request, pk):
roa = get_object_or_404(conf.roas, pk=pk)
if request.method == 'POST':
roa.delete()
- if settings.RPKID_RUN:
- Zookeeper(handle=conf.handle).run_rpkid_now()
+ Zookeeper(handle=conf.handle).run_rpkid_now()
return http.HttpResponseRedirect(reverse(dashboard))
### Process GET ###
@@ -620,7 +625,9 @@ def roa_match(rng):
pfx = 'prefixes'
rv = []
- for obj in route_manager.filter(prefix_min__gte=rng.min, prefix_max__lte=rng.max):
+ # return a max of 50 routes
+ for obj in route_manager.filter(prefix_min__gte=rng.min,
+ prefix_max__lte=rng.max)[:50]:
# This is a bit of a gross hack, since the foreign keys for v4 and v6
# prefixes have different names.
args = {'%s__prefix_min__lte' % pfx: obj.prefix_min,
@@ -646,17 +653,17 @@ def validate_route(route, roas):
# 2. if the candidate ROA set is empty, end with unknown
if not roas.exists():
route.status = 'unknown'
- route.status_label = 'warning'
+ route.status_label = 'label-warning'
# 3. if any candidate roa matches the origin AS and max_length, end with
# valid
#
# AS0 is always invalid.
elif route.asn != 0 and roas.filter(**args).exists():
- route.status_label = 'success'
+ route.status_label = 'label-success'
route.status = 'valid'
# 4. otherwise the route is invalid
else:
- route.status_label = 'important'
+ route.status_label = 'label-important'
route.status = 'invalid'
return route
@@ -687,10 +694,6 @@ def route_view(request):
{'routes': routes, 'timestamp': ts})
-def route_detail(request, pk):
- pass
-
-
def route_roa_list(request, pk):
"""Show a list of ROAs that match a given route."""
object = get_object_or_404(models.RouteOrigin, pk=pk)
@@ -703,9 +706,9 @@ def route_roa_list(request, pk):
@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')
+ return render(request,
+ 'app/repository_detail.html',
+ {'object': get_object_or_404(conf.repositories, pk=pk)})
@handle_required
@@ -798,12 +801,6 @@ def user_list(request):
@superuser_required
-def user_detail(request):
- """Placeholder for Conf.get_absolute_url()."""
- pass
-
-
-@superuser_required
def user_delete(request, pk):
conf = models.Conf.objects.get(pk=pk)
log = request.META['wsgi.errors']