[vpn] implement creating vpns

This commit is contained in:
Nico Schottelius 2020-12-13 17:59:35 +01:00
commit cd19c47fdb
6 changed files with 130 additions and 55 deletions

View file

@ -4,32 +4,46 @@ from .models import *
from .selectors import *
@transaction.atomic
def create_wireguard_vpn(*,
public_key: str,
network_mask: int
) -> WireGuardVPN:
def create_wireguard_vpn(owner, public_key, network_mask):
pool = get_suitable_pool(network_mask)[0]
pool = get_suitable_pools(network_mask)[0]
count = pool.wireguardvpn_set.count()
# FIXME: exception - which?
if not pools:
return None
# First object
if count == 0:
return WireGuardVPN.objects.create(owner=owner,
vpnpool=pool,
pool_index=0,
wireguard_public_key=public_key)
# last_net = ipaddress.ip_network(self.used_networks.last().address)
# last_net_ip = last_net[0]
else: # Select last network and try +1 it
last_net = WireGuardVPN.objects.filter(vpnpool=pool).order_by('pool_index').last()
# 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_index = last_net.pool_index + 1
# next_net_ip = last_net_ip + offset_to_next
if next_index <= pool.max_pool_index:
return WireGuardVPN.objects.create(owner=owner,
vpnpool=pool,
pool_index=next_index,
wireguard_public_key=public_key)
# return str(next_net_ip)
# else:
# # first network to be created
# return self.network
# Still there? Then we need to lookup previously used networks
try:
free_lease = WireGuardVPNFreeLeases.objects.get(vpnpool=pool)
vpn = WireGuardVPN.objects.create(owner=owner,
vpnpool=pool,
pool_index=free_lease.pool_index,
wireguard_public_key=public_key)
free_lease.delete()
return vpn
except WireGuardVPNFreeLeases.DoesNotExist:
pass
@property
def wireguard_config_filename(self):