weegee: cli: add `import` command
This commit is contained in:
parent
59c73126f1
commit
a4d5cede90
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue