weegee: cli: factor out common subcommands

This commit is contained in:
Shiz 2021-12-16 01:57:53 +01:00
parent 104bbe8cfd
commit 45b3d5b189
3 changed files with 110 additions and 180 deletions

View File

@ -49,9 +49,14 @@ def timestampify(dt: datetime) -> str:
return f'{round(n)} {unit}{"s" if n >= 1.5 else ""} {"from now" if future else "ago"}'
def do_get(item: Any, var: str) -> None:
def perform_get(item: Any, var: str) -> None:
for piece in var.split('.'):
item = getattr(item, piece)
base, *keys = piece.split('/')
if base:
item = getattr(item, base)
for k in keys:
item = item[int(k)]
if item is None:
print()
elif isinstance(item, list):
@ -272,10 +277,33 @@ def main():
sys_clean.set_defaults(func=do_clean, parser=sys_clean)
# Common subcommands
def add_common_subcommands(sparser: argparse._SubParsersAction) -> None:
def do_get(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
item = args.objtype.load(ctx, args.name)
for var in args.var:
perform_get(item, var)
get = sparser.add_parser('get', help='get variable')
get.add_argument('name', help='name')
get.add_argument('var', nargs='*', help='variable spec')
get.set_defaults(func=do_get, parser=get)
def do_delete(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
if not args.yes_i_want_to_destroy_this:
parser.error('please pass --yes-i-want-to-destroy-this if you really want to destroy')
item = args.objtype.load(ctx, args.name)
item.delete()
delete = sparser.add_parser('destroy', help='delete')
delete.add_argument('name', help='host name')
delete.set_defaults(func=do_delete, parser=delete)
# Host commands
host = commands.add_parser('host', help='host commands')
host.set_defaults(parser=host)
host.set_defaults(parser=host, objtype=WeegeeHost)
host_commands = host.add_subparsers(title='subcommand')
def do_add_host(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
@ -297,15 +325,7 @@ def main():
add_host.add_argument('name', help='host name')
add_host.set_defaults(func=do_add_host, parser=add_host)
def do_del_host(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
if not args.yes_i_want_to_destroy_this:
parser.error('please pass --yes-i-want-to-destroy-this if you really want to destroy this host')
host = WeegeeHost.load(ctx, args.name)
host.delete()
del_host = host_commands.add_parser('destroy', help='delete host')
del_host.add_argument('name', help='host name')
del_host.set_defaults(func=do_del_host, parser=del_host)
add_common_subcommands(host_commands)
def do_configure_host(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
host = WeegeeHost.load(ctx, args.name)
@ -395,7 +415,7 @@ def main():
# Interface commands
interface = commands.add_parser('interface', help='interface commands')
interface.set_defaults(parser=interface)
interface.set_defaults(parser=interface, objtype=WeegeeInterface)
interface_commands = interface.add_subparsers(title='subcommand')
def do_add_interface(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
@ -418,25 +438,7 @@ def main():
add_interface.add_argument('name', help='interface name')
add_interface.set_defaults(func=do_add_interface, parser=add_interface)
def do_del_interface(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
if not args.yes_i_want_to_destroy_this:
parser.error('please pass --yes-i-want-to-destroy-this if you really want to destroy this interface')
interface = WeegeeInterface.load(ctx, args.name)
interface.delete()
del_interface = interface_commands.add_parser('destroy', help='delete interface')
del_interface.add_argument('name', help='interface name')
del_interface.set_defaults(func=do_del_interface, parser=del_interface)
def do_get_interface(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
interface = WeegeeInterface.load(ctx, args.name)
for var in args.var:
do_get(interface, var)
get_interface = interface_commands.add_parser('get', help='get interface variable')
get_interface.add_argument('name', help='interface name')
get_interface.add_argument('var', nargs='*', help='variable spec')
get_interface.set_defaults(func=do_get_interface, parser=get_interface)
add_common_subcommands(interface_commands)
def do_conf_interface(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
interface = WeegeeInterface.load(ctx, args.name)
@ -484,8 +486,78 @@ def main():
# Peer commands
def add_common_peer_subcommands(sparser: argparse._SubParsersAction) -> None:
add_common_subcommands(sparser)
def do_export(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
peer = args.objtype.load(ctx, args.name)
interface = peer.interface.to_public()
print(f'#+++ {interface.item_name}')
for l in interface.item.purify().dump():
print(l)
print(f'#+++ {peer.item_name}')
for l in peer.item.purify().dump():
print(l)
export = sparser.add_parser('export', help='export peer')
export.add_argument('name', help='name')
export.set_defaults(func=do_export, parser=export)
def do_connect(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
if not WeegeeConnection.exists(ctx, args.name):
connection = WeegeeConnection.create(ctx, args.name,
peers=[], preshared_key=args.preshared_key,
)
else:
connection = WeegeeConnection.load(ctx, args.name)
connection.peers += [WeegeePeer.load(ctx, peer).item for peer in args.peer]
if args.preshared_key:
connection.preshared_key = preshared_key
connection.save()
connect = sparser.add_parser('connect', help='connect peers')
connect.add_argument('-k', '--preshared-key', metavar='NAME', help='preshared key (optional)')
connect.add_argument('name', help='connection name')
connect.add_argument('peer', nargs='*', help='peer names')
connect.set_defaults(func=do_connect, parser=connect)
def do_disconnect(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
connection = args.objtype.load(ctx, args.name)
peers = connection.peers
for peer in args.peer:
peers.remove(WeegeePeer.load(ctx, peer).item)
connection.peers = peers
if connection.peers:
connection.save()
else:
connection.delete()
disconnect = sparser.add_parser('disconnect', help='disconnect peers')
disconnect.add_argument('name', help='connection name')
disconnect.add_argument('peer', nargs='+', help='peer names')
disconnect.set_defaults(func=do_disconnect, parser=disconnect)
def do_get_connection(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
connection = args.objtype.load(ctx, args.name)
for var in args.var:
perform_get(connection, var)
get_connection = sparser.add_parser('get-connect', help='get connection variable')
get_connection.add_argument('name', help='connection name')
get_connection.add_argument('var', nargs='*', help='variable spec')
get_connection.set_defaults(func=do_get_connection, parser=get_connection)
def do_print_config(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
peer = args.objtype.load(ctx, args.name)
print(config_interface(peer.interface.to_full()))
print_config = sparser.add_parser('print-config', help='show WireGuard configuration')
print_config.add_argument('name', help='peer name')
print_config.set_defaults(func=do_print_config, parser=print_config)
peer = commands.add_parser('peer', help='peer commands')
peer.set_defaults(parser=peer)
peer.set_defaults(parser=peer, objtype=WeegeePeer)
peer_commands = peer.add_subparsers(title='subcommand')
def do_add_peer(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
@ -505,90 +577,13 @@ def main():
add_peer.add_argument('interface', help='existing interface name')
add_peer.set_defaults(func=do_add_peer, parser=add_peer)
def do_del_peer(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
if not args.yes_i_want_to_destroy_this:
parser.error('please pass --yes-i-want-to-destroy-this if you really want to destroy this peer')
peer = WeegeePeer.load(ctx, args.name)
peer.delete()
del_peer = peer_commands.add_parser('destroy', help='delete peer')
del_peer.add_argument('name', help='peer name')
del_peer.set_defaults(func=do_del_peer, parser=del_peer)
def do_get_peer(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
peer = WeegeePeer.load(ctx, args.name)
for var in args.var:
do_get(peer, var)
get_peer = peer_commands.add_parser('get', help='get peer variable')
get_peer.add_argument('name', help='peer name')
get_peer.add_argument('var', nargs='*', help='variable spec')
get_peer.set_defaults(func=do_get_peer, parser=get_peer)
def do_export_peer(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
peer = WeegeePeer.load(ctx, args.name)
interface = peer.interface.to_public()
print(f'#+++ {interface.item_name}')
for l in interface.item.purify().dump():
print(l)
print(f'#+++ {peer.item_name}')
for l in peer.item.purify().dump():
print(l)
export_peer = peer_commands.add_parser('export', help='export public part of peer')
export_peer.add_argument('name', help='peer name')
export_peer.set_defaults(func=do_export_peer, parser=export_peer)
def do_connect_peer(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
if not WeegeeConnection.exists(ctx, args.name):
connection = WeegeeConnection.create(ctx, args.name,
peers=[], preshared_key=args.preshared_key,
)
else:
connection = WeegeeConnection.load(ctx, args.name)
connection.peers += [WeegeePeer.load(ctx, peer).item for peer in args.peer]
if args.preshared_key:
connection.preshared_key = preshared_key
connection.save()
connect_peer = peer_commands.add_parser('connect', help='connect peers')
connect_peer.add_argument('-k', '--preshared-key', metavar='NAME', help='preshared key (optional)')
connect_peer.add_argument('name', help='connection name')
connect_peer.add_argument('peer', nargs='*', help='peer names')
connect_peer.set_defaults(func=do_connect_peer, parser=connect_peer)
def do_disconnect_peer(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
connection = WeegeeConnection.load(ctx, args.name)
peers = connection.peers
for peer in args.peer:
peers.remove(WeegeePeer.load(ctx, peer).item)
connection.peers = peers
if connection.peers:
connection.save()
else:
connection.delete()
disconnect_peer = peer_commands.add_parser('disconnect', help='disconnect peers')
disconnect_peer.add_argument('name', help='connection name')
disconnect_peer.add_argument('peer', nargs='+', help='peer names')
disconnect_peer.set_defaults(func=do_disconnect_peer, parser=disconnect_peer)
def do_get_connection(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
connection = WeegeeConnection.load(ctx, args.name)
for var in args.var:
do_get(connection, var)
get_connection = peer_commands.add_parser('get-connect', help='get connection variable')
get_connection.add_argument('name', help='connection name')
get_connection.add_argument('var', nargs='*', help='variable spec')
get_connection.set_defaults(func=do_get_connection, parser=get_connection)
add_common_peer_subcommands(peer_commands)
# Server commands
server = commands.add_parser('server', help='server commands')
server.set_defaults(parser=server)
server.set_defaults(parser=server, objtype=WeegeeServer)
server_commands = server.add_subparsers(title='subcommand')
def do_add_server(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
@ -614,39 +609,13 @@ def main():
add_server.add_argument('port', type=int, help='listen port')
add_server.set_defaults(func=do_add_server, parser=add_server)
def do_del_server(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
if not args.yes_i_want_to_destroy_this:
parser.error('please pass --yes-i-want-to-destroy-this if you really want to destroy this server')
server = WeegeeServer.load(ctx, args.name)
server.delete()
del_server = server_commands.add_parser('destroy', help='delete server')
del_server.add_argument('name', help='server name')
del_server.set_defaults(func=do_del_server, parser=del_server)
def do_conf_server(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
server = WeegeeServer.load(ctx, args.name)
print(server.gen_config())
conf_server = server_commands.add_parser('print-config', help='show WireGuard configuration')
conf_server.add_argument('name', help='server name')
conf_server.set_defaults(func=do_conf_server, parser=conf_server)
def do_get_server(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
server = WeegeeServer.load(ctx, args.name)
for var in args.var:
do_get(server, var)
get_server = server_commands.add_parser('get', help='get server variable')
get_server.add_argument('name', help='server name')
get_server.add_argument('var', nargs='*', help='variable spec')
get_server.set_defaults(func=do_get_server, parser=get_server)
add_common_peer_subcommands(server_commands)
# Client commands
client = commands.add_parser('client', help='client commands')
client.set_defaults(parser=client)
client.set_defaults(parser=client, objtype=WeegeeClient)
client_commands = client.add_subparsers(title='subcommand')
def do_add_client(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
@ -673,39 +642,7 @@ def main():
add_client.add_argument('name', help='client name')
add_client.set_defaults(func=do_add_client, parser=add_client)
def do_del_client(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
if not args.yes_i_want_to_destroy_this:
parser.error('please pass --yes-i-want-to-destroy-this if you really want to destroy this client')
server = WeegeeServer.load(ctx, args.server)
client = server.get_client(args.name)
client.delete()
del_client = client_commands.add_parser('destroy', help='delete client')
del_client.add_argument('server', help='server name')
del_client.add_argument('name', help='name')
del_client.set_defaults(func=do_del_client, parser=del_client)
def do_conf_client(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
server = WeegeeServer.load(ctx, args.server)
client = server.get_client(args.name)
print(client.gen_config())
conf_client = client_commands.add_parser('print-config', help='show WireGuard configuration')
conf_client.add_argument('server', help='server name')
conf_client.add_argument('name', help='name')
conf_client.set_defaults(func=do_conf_client, parser=conf_client)
def do_get_client(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> None:
server = WeegeeServer.load(ctx, args.server)
client = server.get_client(args.name)
for var in args.var:
do_get(client, var)
get_client = client_commands.add_parser('get', help='get client variable')
get_client.add_argument('server', help='server name')
get_client.add_argument('name', help='name')
get_client.add_argument('var', nargs='*', help='variable spec')
get_client.set_defaults(func=do_get_client, parser=get_client)
add_common_peer_subcommands(client_commands)
# The main buffet

View File

@ -386,7 +386,6 @@ class WeegeePeer(WeegeeBase):
@classmethod
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,

View File

@ -28,9 +28,6 @@ class WeegeeServer(WeegeePeer):
super().delete(trash=trash)
sync_all_interfaces(self.context, auto=True)
def gen_config(self) -> str:
return config_interface(self.interface.to_full())
@dataclass(eq=False, repr=False)
class WeegeeClient(WeegeePeer):
@classmethod
@ -53,6 +50,3 @@ class WeegeeClient(WeegeePeer):
self.connection.delete(trash=trash)
super().delete(trash=trash)
sync_all_interfaces(self.context, auto=True)
def gen_config(self) -> str:
return config_interface(self.interface.to_full())