weegee: cli: add `import` command

This commit is contained in:
Shiz 2021-12-14 19:56:51 +01:00
parent 59c73126f1
commit a4d5cede90
1 changed files with 72 additions and 0 deletions

View File

@ -9,6 +9,7 @@ from typing import Optional as O
logging.basicConfig(level=logging.DEBUG)
from .dazy import Item
from .wireguard import WireguardHostType
from . import (
WeegeeContext, WeegeeConfig,
@ -19,6 +20,8 @@ from . import (
setup,
)
logger = logging.getLogger(setup.__module__ + '.cli')
def find_order(n: int, orders: list[tuple[int, str]]) -> tuple[float, str]:
for threshold, o in reversed(orders):
@ -105,6 +108,75 @@ def main():
sync = commands.add_parser('sync', help='synchronize interfaces')
sync.set_defaults(func=do_sync, parser=sync)
def do_import(parser: argparse.ArgumentParser, args: argparse.Namespace, ctx: WeegeeContext) -> int:
ret = 0
# First split...
added = {}
deleted = set()
current = None
for line in args.file:
line = line.rstrip('\n')
if line.startswith('#--- '):
current = line[len('#--- '):].strip()
if args.no_delete:
logger.error(f'import: {name}: attempted delete but --no-delete given; aborting')
ret = 1
break
deleted.add(current)
continue
if line.startswith('#+++ '):
current = line[len('#+++ '):].strip()
if current in added:
logger.warn(f'import: {name}: duplicate encountered')
continue
if not current:
logger.warn(f'import: ignoring leading line: {line}')
continue
added.setdefault(current, []).append(line.rstrip('\n'))
if ret:
return ret
# ... then process additions ...
objects = {}
success = True
for name, definition in added.items():
if Item.exists(ctx.instance, name):
if not args.force:
logger.error(f'import: {name}: already exists; aborting')
ret = 2
break
else:
logger.info(f'import: {name}: replace')
else:
logger.info(f'import: {name}: add')
item = Item.parse(ctx.instance, name, definition)
item.save()
objects[name] = item
# ... maybe roll back ...
if ret:
for o in objects.values():
print(f'import: {name}: rollback')
o.delete()
return ret
# ... and finally process deletions!
for name in deleted:
if not Item.exists(ctx.instance, name):
logger.warn(f'import: {name}: does not exist')
continue
Item.load(ctx.instance, name).delete()
return ret
import_cmd = commands.add_parser('import', help='import definitions')
import_cmd.add_argument('-n', '--no-delete', action='store_true', help='do not delete items')
import_cmd.add_argument('-f', '--force', action='store_true', help='replace existing items')
import_cmd.add_argument('file', type=argparse.FileType('r', encoding='utf-8'), nargs='?', default=sys.stdin)
import_cmd.set_defaults(func=do_import, parser=import_cmd)
# System commands