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 %}