weegee: allow specifying arbitrary metadata

This commit is contained in:
Shiz 2021-12-16 01:38:31 +01:00
parent b3d1d61a4a
commit 012c93fb3d
3 changed files with 35 additions and 11 deletions

View File

@ -403,6 +403,7 @@ def main():
interface = WeegeeInterface.create(ctx, args.name, interface_name,
private_key=args.private_key, public_key=args.public_key,
addresses=args.address, port=args.port, hosts=[WeegeeHost.load(ctx, h) for h in args.host],
extra=args.metadata,
)
interface.save()
@ -413,6 +414,7 @@ def main():
add_interface.add_argument('-K', '--private-key', metavar='KEY', help='private key (optional)')
add_interface.add_argument('-i', '--interface', metavar='NAME', help='interface name (optional)')
add_interface.add_argument('-p', '--port', type=int, help='listen port')
add_interface.add_argument('-d', '--metadata', action='append', help='metadata item(s)')
add_interface.add_argument('name', help='interface name')
add_interface.set_defaults(func=do_add_interface, parser=add_interface)
@ -490,6 +492,7 @@ def main():
interface = WeegeePublicInterface.load(ctx, args.interface)
peer = WeegeePeer.create(ctx, args.name, interface,
routes=args.route, host=args.endpoint, port=args.port,
extra=args.metadata,
)
peer.save()
@ -497,6 +500,7 @@ def main():
add_peer.add_argument('-r', '--route', type=ipaddress.ip_network, action='append', default=[], help='peer route(s)')
add_peer.add_argument('-e', '--endpoint', metavar='HOST', help='peer endpoint host (optional)')
add_peer.add_argument('-p', '--port', type=int, help='peer endpoint port (optional)')
add_peer.add_argument('-d', '--metadata', action='append', help='metadata item(s)')
add_peer.add_argument('name', help='peer name')
add_peer.add_argument('interface', help='existing interface name')
add_peer.set_defaults(func=do_add_peer, parser=add_peer)
@ -594,7 +598,7 @@ def main():
addresses=args.address, port=args.port, hosts=[WeegeeHost.load(ctx, name) for name in args.host or ctx.get_config().default_server_hosts],
)
interface.save()
server = WeegeeServer.create(ctx, args.name, interface, routes=args.routes, host=args.endpoint)
server = WeegeeServer.create(ctx, args.name, interface, routes=args.route, host=args.endpoint, extra=args.metadata)
server.save()
add_server = server_commands.add_parser('create', help='add new server')
@ -604,6 +608,7 @@ def main():
add_server.add_argument('-k', '--public-key', metavar='KEY', help='public key (optional)')
add_server.add_argument('-K', '--private-key', metavar='KEY', help='private key (optional)')
add_server.add_argument('-i', '--interface', metavar='NAME', help='interface name (optional)')
add_server.add_argument('-d', '--metadata', action='append', help='metadata item(s)')
add_server.add_argument('name', help='server name')
add_server.add_argument('endpoint', help='endpoint host')
add_server.add_argument('port', type=int, help='listen port')
@ -653,7 +658,7 @@ def main():
addresses=args.address, hosts=[WeegeeHost.load(ctx, name) for name in args.host or ctx.get_config().default_client_hosts],
)
interface.save()
client = WeegeeClient.create(ctx, args.name, server, preshared_key=args.preshared_key, interface=interface, routes=[])
client = WeegeeClient.create(ctx, args.name, server, preshared_key=args.preshared_key, interface=interface, routes=[], extra=args.metadata)
client.save()
add_client = client_commands.add_parser('create', help='add new client')
@ -663,6 +668,7 @@ def main():
add_client.add_argument('-K', '--private-key', metavar='KEY', help='private key (optional)')
add_client.add_argument('-p', '--preshared-key', metavar='KEY', help='preshared key (optional)')
add_client.add_argument('-i', '--interface', metavar='NAME', help='interface name (optional)')
add_client.add_argument('-d', '--metadata', action='append', help='metadata item(s)')
add_client.add_argument('server', help='server name')
add_client.add_argument('name', help='client name')
add_client.set_defaults(func=do_add_client, parser=add_client)

View File

@ -4,7 +4,7 @@ from logging import getLogger
from dataclasses import dataclass, field
from typing import Optional as O, Union as U, Any, TypeVar, Type as TypeOf
from .dazy import Meta, Item, Template
from .dazy import Type, Meta, Item, Template
from .wireguard import (
IPAddress, IPNetwork, IPInterface,
WireguardHostType, WireguardHost, WireguardPeer, WireguardConnection, which_connection,
@ -49,11 +49,22 @@ class WeegeeBase:
return Item.exists(context.instance, cls.get_name(name))
@classmethod
def create(cls: TypeOf[B], context: WeegeeContext, name: str, **kwargs) -> B:
def create(cls: TypeOf[B], context: WeegeeContext, name: str, extra: O[list[str]] = None, **kwargs) -> B:
meta = cls.get_meta(context)
item = Item.make(context.instance, cls.get_name(name), **kwargs)
name = cls.get_name(name)
extra_item = None
if extra:
extra_item = Item.parse(context.instance, name, extra)
for n in list(extra_item.unresolved):
extra_item.unresolved[n] = repr(extra_item.unresolved[n])
extra_item.resolve_type(n, Type.parse('str'))
item = Item.make(context.instance, name, **kwargs)
if not item.is_complete(meta):
raise TypeError('internal error')
if extra_item:
item = extra_item.merge(item)
return cls(context, item, meta)
@classmethod
@ -168,7 +179,7 @@ class WeegeeHost(WeegeeBase):
conn: WireguardHost = field(init=False)
@classmethod
def create(cls, ctx: WeegeeContext, name: str, type: WireguardHostType = WireguardHostType.Unsupported, host: O[str] = None, user: O[str] = None, elevate_user: O[str] = None, automanage: bool = False, autosync: bool = False) -> 'WeegeeHost':
def create(cls, ctx: WeegeeContext, name: str, type: WireguardHostType = WireguardHostType.Unsupported, host: O[str] = None, user: O[str] = None, elevate_user: O[str] = None, automanage: bool = False, autosync: bool = False, extra: O[list[str]] = None) -> 'WeegeeHost':
return super().create(ctx, name,
automanage=automanage,
autosync=autosync,
@ -176,6 +187,7 @@ class WeegeeHost(WeegeeBase):
host=host,
user=user,
elevate_user=elevate_user,
extra=extra,
)
@property
@ -319,7 +331,7 @@ class WeegeeInterface(WeegeePublicInterface):
return set(i for i in cls.find_all(ctx) if set(i.hosts) & hosts)
@classmethod
def create(cls, ctx: WeegeeContext, name: str, interface_name: str, private_key: O[str] = None, public_key: O[str] = None, port: O[int] = None, hosts: list[WeegeeHost] = [], addresses: list[IPInterface] = []) -> 'WeegeeInterface':
def create(cls, ctx: WeegeeContext, name: str, interface_name: str, private_key: O[str] = None, public_key: O[str] = None, port: O[int] = None, hosts: list[WeegeeHost] = [], addresses: list[IPInterface] = [], extra: O[list[str]] = None) -> 'WeegeeInterface':
for host in [WeegeeHost.get_local_host(ctx)] + hosts:
try:
private_key = private_key or host.conn.gen_private_key()
@ -336,6 +348,7 @@ class WeegeeInterface(WeegeePublicInterface):
interface_name=interface_name,
public_key=public_key, private_key=private_key,
addresses=addresses, port=port,
extra=extra,
)
def save(self, path: O[str] = None) -> None:
@ -372,11 +385,13 @@ class WeegeePeer(WeegeeBase):
return set(p for p in cls.find_all(ctx) if p.interface in interfaces)
@classmethod
def create(cls, ctx: WeegeeContext, name: str, interface: WeegeePublicInterface, routes: list[IPNetwork], host: O[str] = None, port: O[int] = None) -> 'WeegeePeer':
def create(cls, ctx: WeegeeContext, name: str, interface: WeegeePublicInterface, routes: list[IPNetwork], host: O[str] = None, port: O[int] = None, extra: O[list[str]] = None) -> 'WeegeePeer':
print('peer', name)
return super().create(ctx, name,
interface=interface.item,
routes=routes,
host=host, port=port,
extra=extra,
)
def save(self, path: O[str] = None) -> None:
@ -416,11 +431,13 @@ class WeegeeConnection(WeegeeBase):
return set(c for c in cls.find_all(ctx) if set(c.peers) & peers)
@classmethod
def create(cls, ctx: WeegeeContext, name: str, peers: list[WeegeePeer], preshared_key: O[str] = None) -> 'WeegeeConnection':
def create(cls, ctx: WeegeeContext, name: str, peers: list[WeegeePeer], preshared_key: O[str] = None, extra: O[list[str]] = None) -> 'WeegeeConnection':
if not preshared_key:
hosts = {WeegeeHost.get_local_host(ctx)}
for p in peers:
hosts.update(p.interface.hosts)
interface = p.interface
if interface.is_full():
hosts.update(interface.to_full().hosts)
for host in hosts:
try:
preshared_key = host.conn.gen_preshared_key()
@ -433,6 +450,7 @@ class WeegeeConnection(WeegeeBase):
return super().create(ctx, name,
peers=[p.item for p in peers],
preshared_key=preshared_key,
extra=extra,
)
def save(self, path: O[str] = None) -> None:

View File

@ -483,7 +483,7 @@ class Config:
c.resolve_type(name, type)
for name, value in chain(self.values.items(), other.values.items()):
if name not in c:
c[name] = deepcopy(value)
c.values[name] = deepcopy(value)
return c
def split(self: C, other: 'Config') -> C: