aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--portal-gui/rpkigui/myrpki/forms.py118
-rw-r--r--portal-gui/rpkigui/myrpki/misc.py10
-rw-r--r--portal-gui/rpkigui/myrpki/views.py11
-rw-r--r--portal-gui/rpkigui/templates/myrpki/prefix_view.html18
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 %}