[vpn] implement creating vpns
This commit is contained in:
parent
cf948b03a8
commit
cd19c47fdb
6 changed files with 130 additions and 55 deletions
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue