From 81bbcda8ebc1682ba7cc5541a15cc7d9d6be8fc0 Mon Sep 17 00:00:00 2001
From: Sebastian Lohff
Date: Sat, 25 Mar 2017 04:11:37 +0100
Subject: [PATCH] Evvverything!
---
api/__init__.py | 0
api/admin.py | 3 +
api/apps.py | 5 +
api/migrations/__init__.py | 0
api/models.py | 3 +
api/tests.py | 3 +
api/urls.py | 9 ++
api/views.py | 107 ++++++++++++++++++
dnmgmt/settings.py | 2 +
dnmgmt/urls.py | 2 +
domains/migrations/0003_auto_20170322_1801.py | 20 ++++
templates/whoisdb/create_js.html | 76 +++++++++++++
templates/whoisdb/obj_create.html | 3 +
templates/whoisdb/overview.html | 2 +-
templates/whoisdb/wizard.html | 46 ++++++++
whoisdb/urls.py | 3 +
whoisdb/views.py | 36 ++++++
17 files changed, 319 insertions(+), 1 deletion(-)
create mode 100644 api/__init__.py
create mode 100644 api/admin.py
create mode 100644 api/apps.py
create mode 100644 api/migrations/__init__.py
create mode 100644 api/models.py
create mode 100644 api/tests.py
create mode 100644 api/urls.py
create mode 100644 api/views.py
create mode 100644 domains/migrations/0003_auto_20170322_1801.py
create mode 100644 templates/whoisdb/create_js.html
create mode 100644 templates/whoisdb/wizard.html
diff --git a/api/__init__.py b/api/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/api/admin.py b/api/admin.py
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/api/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/api/apps.py b/api/apps.py
new file mode 100644
index 0000000..d87006d
--- /dev/null
+++ b/api/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class ApiConfig(AppConfig):
+ name = 'api'
diff --git a/api/migrations/__init__.py b/api/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/api/models.py b/api/models.py
new file mode 100644
index 0000000..71a8362
--- /dev/null
+++ b/api/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/api/tests.py b/api/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/api/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/api/urls.py b/api/urls.py
new file mode 100644
index 0000000..ccf5776
--- /dev/null
+++ b/api/urls.py
@@ -0,0 +1,9 @@
+from django.conf.urls import url
+
+from . import views as api_views
+
+urlpatterns = [
+ url(r'asblock/free-as/$', api_views.asblockFreeAS, name='asblock-free-as'),
+ url(r'asblock/free-subnet/$', api_views.freeSubnet, name='inetnum-free-subnet'),
+
+]
diff --git a/api/views.py b/api/views.py
new file mode 100644
index 0000000..82dca93
--- /dev/null
+++ b/api/views.py
@@ -0,0 +1,107 @@
+#from django.shortcuts import render
+from django.http import JsonResponse
+from django.core.exceptions import ValidationError
+from django.contrib.auth.views import login_required
+
+from whoisdb.models import ASBlock, ASNumber, InetNum
+
+@login_required
+def asblockFreeAS(request):
+
+ ret = {
+ "success": False,
+ "errorMsg": None,
+ "number": -1,
+ }
+
+ try:
+ blockName = request.GET.get('block', None)
+ if not blockName:
+ raise ValidationError("No block given")
+
+ try:
+ mnts = request.user.maintainer_set.all()
+ block = ASBlock.objects.filter(mnt_by__in=mnts).distinct().get(handle=blockName)
+ if block.asblock_set.count() > 0:
+ raise ValidationError("AS Block already has sub AS Blocks")
+ if block.asnumber_set.count() > 0:
+ num = block.asnumber_set.order_by("-number")[0].number + 1
+ if num > block.asEnd:
+ num = None
+ for n in range(block.asBegin, block.asEnd+1):
+ try:
+ ASNumber.objects.get(number=n)
+ except ASNumber.DoesNotExist:
+ num = n
+ break
+ if not num:
+ raise ValidationError("No free AS Number in block")
+ ret["number"] = num
+ else:
+ ret["number"] = block.asBegin
+ except ASBlock.DoesNotExist:
+ raise ValidationError("Could not get AS Block")
+
+ ret["success"] = True
+ except ValidationError as e:
+ ret["errorMsg"] = e.message
+ return JsonResponse(ret)
+@login_required
+def freeSubnet(request):
+
+ ret = {
+ "success": False,
+ "errorMsg": None,
+ "network": None,
+ }
+
+
+ try:
+ parentRangeName = request.GET.get('parentRange', None)
+ if not parentRangeName:
+ raise ValidationError("No subnet given")
+
+ parentRange = None
+ try:
+ mnts = request.user.maintainer_set.all()
+ parentRange = InetNum.objects.filter(mnt_by__in=mnts).distinct().get(handle=parentRangeName)
+ except InetNum.DoesNotExist:
+ raise ValidationError("Parent range does not exist / is not maintained by you")
+
+ prefixLen = 0
+ try:
+ prefixLen = int(request.GET.get("prefixLen", 27))
+ if prefixLen < 8 or \
+ (parentRange.protocol == InetNum.IPv4 and prefixLen > 32) or \
+ (parentRange.protocol == InetNum.IPv6 and prefixLen > 128):
+ raise ValidationError("Given prefix length is out of range")
+ except ValueError:
+ raise ValidationError("PrefixLen is not a number")
+ nets = list(parentRange.getNetwork().subnets())
+ for subRange in parentRange.inetnum_set.all():
+ newNet = None
+ for net in nets:
+ if subRange.getNetwork().network_address in net:
+ newNet = net
+ if not newNet:
+ # critical error, we want a 500 here
+ raise ValueError("Subnet not in range")
+
+ nets.remove(newNet)
+ nets.extend(newNet.address_exclude(subRange.getNetwork()))
+
+ nets = sorted(nets)
+ usableNet = None
+ for net in nets:
+ if net.prefixlen <= prefixLen:
+ usableNet = net
+ break
+
+ if not usableNet:
+ raise ValidationError("No space left in given range")
+
+ ret["network"] = "%s/%s" % (usableNet.network_address, prefixLen)
+ ret["success"] = True
+ except ValidationError as e:
+ ret["errorMsg"] = e.message
+ return JsonResponse(ret)
diff --git a/dnmgmt/settings.py b/dnmgmt/settings.py
index 80944e6..f6b95df 100644
--- a/dnmgmt/settings.py
+++ b/dnmgmt/settings.py
@@ -39,10 +39,12 @@ INSTALLED_APPS = [
'django.contrib.messages',
'django.contrib.staticfiles',
'crispy_forms',
+ 'formtools',
'dncore',
'whoisdb',
'rrequests',
'domains',
+ 'api',
]
MIDDLEWARE = [
diff --git a/dnmgmt/urls.py b/dnmgmt/urls.py
index 01e23d4..8ac828e 100644
--- a/dnmgmt/urls.py
+++ b/dnmgmt/urls.py
@@ -21,6 +21,7 @@ import dncore.views
import whoisdb.urls
import rrequests.urls
import domains.urls
+import api.urls
urlpatterns = [
@@ -32,4 +33,5 @@ urlpatterns = [
url(r'^whoisdb/', include(whoisdb.urls, namespace='whoisdb')),
url(r'^rrequests/', include(rrequests.urls, namespace='rrequests')),
url(r'^domains/', include(domains.urls, namespace='domains')),
+ url(r'^api/', include(api.urls, namespace='api')),
]
diff --git a/domains/migrations/0003_auto_20170322_1801.py b/domains/migrations/0003_auto_20170322_1801.py
new file mode 100644
index 0000000..9dfb06c
--- /dev/null
+++ b/domains/migrations/0003_auto_20170322_1801.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2017-03-22 18:01
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('domains', '0002_auto_20170321_1854'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='nameserver',
+ name='name',
+ field=models.CharField(max_length=256),
+ ),
+ ]
diff --git a/templates/whoisdb/create_js.html b/templates/whoisdb/create_js.html
new file mode 100644
index 0000000..133fb30
--- /dev/null
+++ b/templates/whoisdb/create_js.html
@@ -0,0 +1,76 @@
+
+
diff --git a/templates/whoisdb/obj_create.html b/templates/whoisdb/obj_create.html
index 307ff1f..7c80275 100644
--- a/templates/whoisdb/obj_create.html
+++ b/templates/whoisdb/obj_create.html
@@ -17,5 +17,8 @@
+
+{% include "whoisdb/create_js.html" %}
+
{% endblock %}
diff --git a/templates/whoisdb/overview.html b/templates/whoisdb/overview.html
index 7e39e09..afa454d 100644
--- a/templates/whoisdb/overview.html
+++ b/templates/whoisdb/overview.html
@@ -15,7 +15,7 @@
- Create new Maintainer, create new Contact, request resources{% if netblocks %}, create Subnet{% endif %}{% if asblocks %}, create AS, create ASblock{% endif %}
+ Create new Maintainer, create new Contact, request resources{% if netblocks %}, create Subnet{% endif %}{% if asblocks %}, create AS, create ASblock{% endif %}{% if netblocks and asblocks %}, create AS / Subnet pair{% endif %}