weegee/weegee/desc.py

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},
)