weegee: allow specifying arbitrary metadata
This commit is contained in:
parent
b3d1d61a4a
commit
012c93fb3d
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue