++vpn network
This commit is contained in:
parent
5716cae900
commit
cf948b03a8
7 changed files with 65 additions and 62 deletions
|
@ -41,10 +41,6 @@ router.register(r'v1/service/matrix', serviceviews.MatrixServiceProductViewSet,
|
|||
router.register(r'v1/service/generic', serviceviews.GenericServiceProductViewSet, basename='genericserviceproduct')
|
||||
|
||||
|
||||
# Net
|
||||
#router.register(r'v1/net/vpn', netviews.VPNNetworkViewSet, basename='vpnnetwork')
|
||||
#router.register(r'v1/admin/vpnreservation', netviews.VPNNetworkReservationViewSet, basename='vpnnetreservation')
|
||||
|
||||
|
||||
# Pay
|
||||
router.register(r'v1/my/address', payviews.BillingAddressViewSet, basename='billingaddress')
|
||||
|
@ -67,9 +63,18 @@ router.register(r'v1/my/user', authviews.UserViewSet, basename='user')
|
|||
router.register(r'v1/admin/user', authviews.AdminUserViewSet, basename='useradmin')
|
||||
router.register(r'v1/user/register', authviews.AccountManagementViewSet, basename='user/register')
|
||||
|
||||
|
||||
################################################################################
|
||||
# v2
|
||||
|
||||
# Net
|
||||
router.register(r'v2/net/wireguardvpn', netviews.WireGuardVPNViewSet, basename='wireguardvpnnetwork')
|
||||
#router.register(r'v1/admin/vpnreservation', netviews.VPNNetworkReservationViewSet, basename='vpnnetreservation')
|
||||
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
path(r'api/', include(router.urls)),
|
||||
# web/ = stuff to view in the browser
|
||||
|
||||
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), # for login to REST API
|
||||
path('openapi', get_schema_view(
|
||||
|
@ -77,7 +82,9 @@ urlpatterns = [
|
|||
description="uncloud API",
|
||||
version="1.0.0"
|
||||
), name='openapi-schema'),
|
||||
path('vpn/create/', netviews.WireGuardVPNCreateView.as_view(), name="vpncreate"),
|
||||
|
||||
# web/ = stuff to view in the browser
|
||||
# path('web/vpn/create/', netviews.WireGuardVPNCreateView.as_view(), name="vpncreate"),
|
||||
path('login/', authviews.LoginView.as_view(), name="login"),
|
||||
path('logout/', authviews.LogoutView.as_view(), name="logout"),
|
||||
|
||||
|
|
|
@ -8,5 +8,4 @@ class WireGuardVPNForm(forms.ModelForm):
|
|||
|
||||
class Meta:
|
||||
model = WireGuardVPN
|
||||
|
||||
fields = [ "wireguard_public_key" ]
|
||||
|
|
|
@ -29,6 +29,8 @@ class WireGuardVPN(models.Model):
|
|||
"""
|
||||
Created VPNNetworks
|
||||
"""
|
||||
owner = models.ForeignKey(get_user_model(),
|
||||
on_delete=models.CASCADE)
|
||||
vpnpool = models.ForeignKey(WireGuardVPNPool,
|
||||
on_delete=models.CASCADE)
|
||||
|
||||
|
|
|
@ -39,4 +39,6 @@ def allowed_vpn_network_reservation_size():
|
|||
max_reservations=2**(F('subnetwork_mask')-F('network_mask'))).filter(
|
||||
num_reservations__lt=F('max_reservations'))
|
||||
|
||||
return set([ pool.subnetwork_mask for pool in pools ])
|
||||
# Need to return set of tuples, see
|
||||
# https://docs.djangoproject.com/en/3.1/ref/models/fields/#field-choices
|
||||
return set([ (pool.subnetwork_mask, pool.subnetwork_mask) for pool in pools ])
|
||||
|
|
|
@ -5,6 +5,16 @@ from django.utils.translation import gettext_lazy as _
|
|||
from rest_framework import serializers
|
||||
|
||||
from .models import *
|
||||
from .services import *
|
||||
|
||||
class WireGuardVPNSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = WireGuardVPN
|
||||
fields = [ 'wireguard_public_key' ]
|
||||
read_only_fields = [ 'address ' ]
|
||||
|
||||
def create(self, validated_data):
|
||||
pass
|
||||
|
||||
# class WireGuardVPNPoolSerializer(serializers.ModelSerializer):
|
||||
# class Meta:
|
||||
|
|
|
@ -1,59 +1,35 @@
|
|||
from django.db import transaction
|
||||
|
||||
from .models import *
|
||||
from .selectors import *
|
||||
|
||||
@transaction.atomic
|
||||
def create_vpn(*,
|
||||
def create_wireguard_vpn(*,
|
||||
public_key: str,
|
||||
network_size: int
|
||||
) -> VPNNetwork:
|
||||
network_mask: int
|
||||
) -> WireGuardVPN:
|
||||
|
||||
# Select suitable pool
|
||||
pools = VPNPool.objects.filter(subnetwork_size=network_size)
|
||||
pool = get_suitable_pool(network_mask)[0]
|
||||
|
||||
# FIXME: exception - which?
|
||||
if not pools:
|
||||
return None
|
||||
|
||||
|
||||
# last_net = ipaddress.ip_network(self.used_networks.last().address)
|
||||
# last_net_ip = last_net[0]
|
||||
|
||||
# Find all pools with the correct size
|
||||
# if last_net_ip.version == 6:
|
||||
# offset_to_next = 2**(128 - self.subnetwork_size)
|
||||
# elif last_net_ip.version == 4:
|
||||
# offset_to_next = 2**(32 - self.subnetwork_size)
|
||||
|
||||
# For each pool see if it has still space:
|
||||
# num network reversations < 2**(subnetwork_size-network_size)
|
||||
# next_net_ip = last_net_ip + offset_to_next
|
||||
|
||||
|
||||
def next_free_network(self):
|
||||
if self.num_free_networks == 0:
|
||||
# FIXME: use right exception
|
||||
raise Exception("No free networks")
|
||||
|
||||
if len(self.free_networks) > 0:
|
||||
return self.free_networks[0].address
|
||||
|
||||
if len(self.used_networks) > 0:
|
||||
"""
|
||||
sample:
|
||||
|
||||
pool = 2a0a:e5c1:200::/40
|
||||
last_used = 2a0a:e5c1:204::/48
|
||||
|
||||
next:
|
||||
"""
|
||||
|
||||
last_net = ipaddress.ip_network(self.used_networks.last().address)
|
||||
last_net_ip = last_net[0]
|
||||
|
||||
if last_net_ip.version == 6:
|
||||
offset_to_next = 2**(128 - self.subnetwork_size)
|
||||
elif last_net_ip.version == 4:
|
||||
offset_to_next = 2**(32 - self.subnetwork_size)
|
||||
|
||||
next_net_ip = last_net_ip + offset_to_next
|
||||
|
||||
return str(next_net_ip)
|
||||
else:
|
||||
# first network to be created
|
||||
return self.network
|
||||
# return str(next_net_ip)
|
||||
# else:
|
||||
# # first network to be created
|
||||
# return self.network
|
||||
|
||||
@property
|
||||
def wireguard_config_filename(self):
|
||||
|
|
|
@ -23,17 +23,17 @@ from .forms import *
|
|||
# queryset = VPNNetworkReservation.objects.all()
|
||||
|
||||
|
||||
# class VPNNetworkViewSet(viewsets.ModelViewSet):
|
||||
# serializer_class = VPNNetworkSerializer
|
||||
# permission_classes = [permissions.IsAuthenticated]
|
||||
class WireGuardVPNViewSet(viewsets.ModelViewSet):
|
||||
serializer_class = WireGuardVPNSerializer
|
||||
permission_classes = [permissions.IsAuthenticated]
|
||||
|
||||
# def get_queryset(self):
|
||||
# if self.request.user.is_superuser:
|
||||
# obj = VPNNetwork.objects.all()
|
||||
# else:
|
||||
# obj = VPNNetwork.objects.filter(owner=self.request.user)
|
||||
def get_queryset(self):
|
||||
if self.request.user.is_superuser:
|
||||
obj = WireGuardVPN.objects.all()
|
||||
else:
|
||||
obj = WireGuardVPN.objects.filter(owner=self.request.user)
|
||||
|
||||
# return obj
|
||||
return obj
|
||||
|
||||
|
||||
class WireGuardVPNCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
|
||||
|
@ -49,7 +49,14 @@ class WireGuardVPNCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView
|
|||
return self.success_message % dict(cleaned_data,
|
||||
the_prefix = self.object.prefix)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['available_sizes'] = 2
|
||||
return context
|
||||
# def get_context_data(self, **kwargs):
|
||||
# context = super().get_context_data(**kwargs)
|
||||
# context['available_sizes'] = 2
|
||||
# return context
|
||||
|
||||
# def post(request, *args, **kwargs):
|
||||
# print(request)
|
||||
# print(*args)
|
||||
# print(*kwargs)
|
||||
|
||||
# def post(self, request, *args, **kwargs):
|
||||
|
|
Loading…
Reference in a new issue