diff options
-rw-r--r-- | portal-gui/rpkigui/myrpki/forms.py | 118 | ||||
-rw-r--r-- | portal-gui/rpkigui/myrpki/misc.py | 10 | ||||
-rw-r--r-- | portal-gui/rpkigui/myrpki/views.py | 11 | ||||
-rw-r--r-- | portal-gui/rpkigui/templates/myrpki/prefix_view.html | 18 |
4 files changed, 97 insertions, 60 deletions
diff --git a/portal-gui/rpkigui/myrpki/forms.py b/portal-gui/rpkigui/myrpki/forms.py index 672eff38..e66d8f6d 100644 --- a/portal-gui/rpkigui/myrpki/forms.py +++ b/portal-gui/rpkigui/myrpki/forms.py @@ -19,7 +19,7 @@ from django import forms import rpki.ipaddrs -from rpkigui.myrpki import models +from rpkigui.myrpki import models, misc from rpkigui.myrpki.asnset import asnset class AddConfForm(forms.Form): @@ -49,61 +49,81 @@ class ImportForm(forms.Form): handle = forms.CharField() xml = forms.FileField() -def PrefixSplitForm(prefix, *args, **kwargs): +def PrefixSplitForm(parent, *args, **kwargs): class _wrapper(forms.Form): - lo = forms.IPAddressField() - hi = forms.IPAddressField() + prefix = forms.CharField(max_length=200, help_text='CIDR or range') - def clean_lo(self): - lo = self.cleaned_data.get('lo') - # convert from string to long representation - try: - loaddr = rpki.ipaddrs.parse(lo) - except socket.error: - raise forms.ValidationError, 'Invalid IP address string' - pfx_loaddr = rpki.ipaddrs.parse(prefix.lo) - pfx_hiaddr = rpki.ipaddrs.parse(prefix.hi) - if type(loaddr) != type(pfx_hiaddr): - raise forms.ValidationError, \ - 'Not the same IP address type as parent' - if loaddr < pfx_loaddr or loaddr > pfx_hiaddr: - raise forms.ValidationError, \ - 'Value out of range of parent prefix' - return lo - - def clean_hi(self): - hi = self.cleaned_data.get('hi') - # convert from string to long representation + def clean(self): + p = self.cleaned_data.get('prefix') try: - hiaddr = rpki.ipaddrs.parse(hi) - except socket.error: - raise forms.ValidationError, 'Invalid IP address string' - pfx_loaddr = rpki.ipaddrs.parse(prefix.lo) - pfx_hiaddr = rpki.ipaddrs.parse(prefix.hi) - if type(hiaddr) != type(pfx_loaddr): - raise forms.ValidationError, \ - 'Not the same IP address type as parent' - if hiaddr < pfx_loaddr or hiaddr > pfx_hiaddr: + r = misc.parse_resource_range(p) + except ValueError, err: + print err + raise forms.ValidationError, 'invalid prefix or range' + pr = parent.as_resource_range() + if r.min < pr.min or r.max > pr.max: raise forms.ValidationError, \ - 'Value out of range of parent prefix' - return hi - - def clean(self): - hi = self.cleaned_data.get('hi') - lo = self.cleaned_data.get('lo') - # hi or lo may be None if field validation failed - if hi and lo: - # convert from string to long representation - hiaddr = rpki.ipaddrs.parse(hi) - loaddr = rpki.ipaddrs.parse(lo) - if hiaddr < loaddr: - raise forms.ValidationError, 'Hi value is smaller than Lo' - if prefix.allocated: - raise forms.ValidationError, 'Prefix is assigned to child' + 'range is outside parent range' + if parent.allocated: + raise forms.ValidationError, 'Prefix is assigned to child' return self.cleaned_data - return _wrapper(*args, **kwargs) +#def PrefixSplitForm(prefix, *args, **kwargs): +# class _wrapper(forms.Form): +# lo = forms.IPAddressField() +# hi = forms.IPAddressField() +# +# def clean_lo(self): +# lo = self.cleaned_data.get('lo') +# # convert from string to long representation +# try: +# loaddr = rpki.ipaddrs.parse(lo) +# except socket.error: +# raise forms.ValidationError, 'Invalid IP address string' +# pfx_loaddr = rpki.ipaddrs.parse(prefix.lo) +# pfx_hiaddr = rpki.ipaddrs.parse(prefix.hi) +# if type(loaddr) != type(pfx_hiaddr): +# raise forms.ValidationError, \ +# 'Not the same IP address type as parent' +# if loaddr < pfx_loaddr or loaddr > pfx_hiaddr: +# raise forms.ValidationError, \ +# 'Value out of range of parent prefix' +# return lo +# +# def clean_hi(self): +# hi = self.cleaned_data.get('hi') +# # convert from string to long representation +# try: +# hiaddr = rpki.ipaddrs.parse(hi) +# except socket.error: +# raise forms.ValidationError, 'Invalid IP address string' +# pfx_loaddr = rpki.ipaddrs.parse(prefix.lo) +# pfx_hiaddr = rpki.ipaddrs.parse(prefix.hi) +# if type(hiaddr) != type(pfx_loaddr): +# raise forms.ValidationError, \ +# 'Not the same IP address type as parent' +# if hiaddr < pfx_loaddr or hiaddr > pfx_hiaddr: +# raise forms.ValidationError, \ +# 'Value out of range of parent prefix' +# return hi +# +# def clean(self): +# hi = self.cleaned_data.get('hi') +# lo = self.cleaned_data.get('lo') +# # hi or lo may be None if field validation failed +# if hi and lo: +# # convert from string to long representation +# hiaddr = rpki.ipaddrs.parse(hi) +# loaddr = rpki.ipaddrs.parse(lo) +# if hiaddr < loaddr: +# raise forms.ValidationError, 'Hi value is smaller than Lo' +# if prefix.allocated: +# raise forms.ValidationError, 'Prefix is assigned to child' +# return self.cleaned_data +# +# return _wrapper(*args, **kwargs) + def PrefixAllocateForm(iv, child_set, *args, **kwargs): class _wrapper(forms.Form): child = forms.ModelChoiceField(initial=iv, queryset=child_set, diff --git a/portal-gui/rpkigui/myrpki/misc.py b/portal-gui/rpkigui/myrpki/misc.py index 125547a6..16954d87 100644 --- a/portal-gui/rpkigui/myrpki/misc.py +++ b/portal-gui/rpkigui/myrpki/misc.py @@ -28,4 +28,14 @@ def str_to_range(lo, hi): else: return rpki.resource_set.resource_range_ipv6(x, y) +def parse_resource_range(s): + '''Parse an IPv4/6 resource range.''' + # resource_set functions only accept str + if isinstance(s, unicode): + s = s.encode() + try: + return rpki.resource_set.resource_range_ipv4.parse_str(s) + except ValueError: + return rpki.resource_set.resource_range_ipv6.parse_str(s) + # vim:sw=4 ts=8 expandtab diff --git a/portal-gui/rpkigui/myrpki/views.py b/portal-gui/rpkigui/myrpki/views.py index 0a026ebc..be9741a5 100644 --- a/portal-gui/rpkigui/myrpki/views.py +++ b/portal-gui/rpkigui/myrpki/views.py @@ -26,9 +26,7 @@ from django.db import IntegrityError from django import http from django.views.generic.list_detail import object_list -from rpkigui.myrpki import models -from rpkigui.myrpki import forms -from rpkigui.myrpki import glue +from rpkigui.myrpki import models, forms, glue, misc from rpkigui.myrpki.asnset import asnset # For each type of object, we have a detail view, a create view and @@ -308,8 +306,11 @@ def prefix_split_view(request, pk): if request.method == 'POST': form = forms.PrefixSplitForm(prefix, request.POST) if form.is_valid(): - obj = models.AddressRange(lo=form.cleaned_data['lo'], - hi=form.cleaned_data['hi'], parent=prefix) + r = misc.parse_resource_range(form.cleaned_data['prefix']) + obj = models.AddressRange(lo=str(r.min), hi=str(r.max), + parent=prefix) + #obj = models.AddressRange(lo=form.cleaned_data['lo'], + # hi=form.cleaned_data['hi'], parent=prefix) obj.save() return http.HttpResponseRedirect(obj.get_absolute_url()) else: diff --git a/portal-gui/rpkigui/templates/myrpki/prefix_view.html b/portal-gui/rpkigui/templates/myrpki/prefix_view.html index ec4132e1..bd38ee5f 100644 --- a/portal-gui/rpkigui/templates/myrpki/prefix_view.html +++ b/portal-gui/rpkigui/templates/myrpki/prefix_view.html @@ -69,12 +69,18 @@ td { border: solid 1px; text-align: center; padding-left: 1em; padding-right: 1e </form> {% endif %} <!-- form --> -<p>Action: -<a href="{{addr.get_absolute_url}}/split">split</a> | -<a href="{{addr.get_absolute_url}}/allocate">give to child</a> | -{% if addr.is_prefix %} -<a href="{{addr.get_absolute_url}}/roa">roa</a> | +<p>Action:<br> +{% if not addr.allocated %} +<a href="{{addr.get_absolute_url}}/split">split</a><br> +{% endif %} +{% if not addr.roa_requests.all %} +<a href="{{addr.get_absolute_url}}/allocate">give to child</a><br> +{% endif %} +{% if addr.is_prefix and not addr.allocated %} +<a href="{{ addr.get_absolute_url }}/roa">roa</a><br> +{% endif %} +{% if not addr.allocated and addr.parent %} +<a href="{{ addr.get_absolute_url }}/delete">delete</a><br> {% endif %} -<a href="{{addr.get_absolute_url}}/delete">delete</a> {% endblock %} |