133 lines
3.3 KiB
Python
133 lines
3.3 KiB
Python
from dataclasses import dataclass
|
|
from typing import Union as U
|
|
|
|
from .dazy import Instance, Config, RefType, ArrType, Meta
|
|
|
|
|
|
@dataclass
|
|
class WeegeeDesc:
|
|
name: str
|
|
version: int
|
|
|
|
def get_name(self) -> str:
|
|
return f'{self.name}@{self.version}'
|
|
|
|
@dataclass
|
|
class WeegeeMeta(WeegeeDesc):
|
|
spec: list[str]
|
|
item_prefix: str = ''
|
|
|
|
|
|
WEEGEE_HOST = WeegeeMeta(
|
|
name='wg/host',
|
|
version=1,
|
|
spec=[
|
|
'autosync: int = 0',
|
|
'automanage: int = 0',
|
|
'host: ?str = ',
|
|
'user: ?str = ',
|
|
'elevate_user: ?str = ',
|
|
],
|
|
item_prefix='wg/host',
|
|
)
|
|
WEEGEE_SERVER = WeegeeMeta(
|
|
name='wg/server',
|
|
version=1,
|
|
spec=[
|
|
f'hosts: [@{WEEGEE_HOST.get_name()}]',
|
|
'interface: str',
|
|
'public_key: str',
|
|
'private_key: str',
|
|
'addresses: [ipintf]',
|
|
'routed_addresses: [ipintf]',
|
|
'host: str',
|
|
'port: int',
|
|
],
|
|
item_prefix='wg/server',
|
|
)
|
|
WEEGEE_CLIENT = WeegeeMeta(
|
|
name='wg/client',
|
|
version=1,
|
|
spec=[
|
|
f'hosts: [@{WEEGEE_HOST.get_name()}]',
|
|
f'server: @{WEEGEE_SERVER.get_name()}',
|
|
'interface: str = "wg0"',
|
|
'public_key: str',
|
|
'private_key: str',
|
|
'preshared_key: str',
|
|
'addresses: [ipintf]',
|
|
],
|
|
item_prefix='wg/client',
|
|
)
|
|
WEEGEE_CONFIG = WeegeeMeta(
|
|
name='wg/config',
|
|
version=1,
|
|
spec=[
|
|
f'default_server_hosts: [@{WEEGEE_HOST.get_name()}] = []',
|
|
f'default_client_hosts: [@{WEEGEE_HOST.get_name()}] = []',
|
|
],
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class WeegeeTemplate(WeegeeDesc):
|
|
template: str
|
|
variables: dict[str, U[WeegeeMeta, list[WeegeeMeta]]]
|
|
|
|
def make_config(self, instance: Instance, **kwargs) -> 'Config':
|
|
args = {}
|
|
for k, v in kwargs.items():
|
|
vtype = self.variables[k]
|
|
if isinstance(vtype, list):
|
|
tname = vtype[0].get_name()
|
|
ttype = ArrType(RefType(tname))
|
|
vval = [x.resolve(Meta.load(instance, tname)) for x in v]
|
|
else:
|
|
tname = vtype.get_name()
|
|
ttype = RefType(tname)
|
|
vval = v.resolve(Meta.load(instance, tname))
|
|
args[k] = (ttype, vval)
|
|
return Config.make(instance, '<vars>', **args)
|
|
|
|
WEEGEE_SERVER_CONF = WeegeeTemplate(
|
|
name='wg/server-conf',
|
|
version=1,
|
|
template="""
|
|
[Interface]
|
|
Address = {{server.addresses | join(', ')}}
|
|
ListenPort = {{server.port}}
|
|
PrivateKey = {{server.private_key}}
|
|
|
|
PostUp = iptables -A FORWARD -i %i -j ACCEPT
|
|
PostDown = iptables -D FORWARD -i %i -j ACCEPT
|
|
|
|
{% for client in clients -%}
|
|
[Peer]
|
|
# Client: {{client.name}}
|
|
PublicKey = {{client.public_key}}
|
|
PresharedKey = {{client.preshared_key}}
|
|
AllowedIPs = {{client.addresses | join(', ')}}
|
|
|
|
{% endfor %}
|
|
""".strip(),
|
|
variables={'server': WEEGEE_SERVER, 'clients': [WEEGEE_CLIENT]},
|
|
)
|
|
|
|
WEEGEE_CLIENT_CONF = WeegeeTemplate(
|
|
name='wg/client-conf',
|
|
version=1,
|
|
template="""
|
|
[Interface]
|
|
PrivateKey = {{client.private_ke}}
|
|
Address = {{client.addresses | join(', ')}}
|
|
|
|
[Peer]
|
|
PublicKey = {{client.server.public_key}}
|
|
PresharedKey = {{client.preshared_key}}
|
|
AllowedIPs = {{client.server.routed_addresses | join(', ')}}
|
|
Endpoint = {{client.server.host}}:{{client.server.port}}
|
|
PersistentKeepalive = 30
|
|
""".strip(),
|
|
variables={'client': WEEGEE_CLIENT},
|
|
)
|