diff --git a/shipcat/main.py b/shipcat/main.py index 6812c693ebd9875eb942001a1b05d1ffca5b3c6c..b42460d85b5db1f98351a47b4ff4886519cc30bf 100755 --- a/shipcat/main.py +++ b/shipcat/main.py @@ -52,15 +52,10 @@ def setup_container(args: argparse.Namespace, require_root: bool, container: Opt except ConfigError as e: die(str(e)) - if args.as_user is None: - uid = 0 - else: - uid = args.as_user - - if require_root and uid != 0: + if require_root and args.as_user != 0: die('This operation must be performed by root') - if not check_rights(cc, uid, args.as_groups): + if not check_rights(cc, args.as_user, args.as_groups): die('You do not have permission to operate this container') return cc @@ -308,6 +303,14 @@ def cmd_rsync(args: argparse.Namespace) -> None: run_command(cmd) +def cmd_list(args: argparse.Namespace) -> None: + for conf in Path(config.container_config_dir).iterdir(): + if conf.suffix == '.toml': + cc = ContainerConfig.load(config, conf.stem) + if args.all or check_rights(cc, args.as_user, args.as_groups): + print(cc.container) + + def parse_int_list(s: str) -> List[int]: return list(map(int, s.split(','))) @@ -316,14 +319,11 @@ def main() -> None: parser = argparse.ArgumentParser( description="Ship's Cat -- a container management tool", ) - parser.add_argument('--as-user', type=int, metavar='UID', help='user ID of requesting user') + parser.add_argument('--as-user', type=int, default=0, metavar='UID', help='user ID of requesting user') parser.add_argument('--as-groups', type=parse_int_list, metavar='GID,...', help='group IDs of requesting user (primary first)') parser.add_argument('--verbose', '-v', default=False, action='store_true', help='be chatty and explain what is going on') subparsers = parser.add_subparsers(help='action to perform', dest='action', required=True, metavar='ACTION') - init_parser = subparsers.add_parser('init', help='initialize a new container', description='Initialize a new container. Should be called by root.') - init_parser.add_argument('name', help='name of the container') - create_parser = subparsers.add_parser('create', help='create a container from an image', description='Create a container from an image.') create_parser.add_argument('name', help='name of the container') @@ -339,6 +339,12 @@ def main() -> None: create_parser.add_argument('--tty', '-t', default=False, action='store_true', help='stdio will be attached to a pseudo-terminal') create_parser.add_argument('--user', '-u', metavar='USER[:GROUP]', help='user/group to run the command under (default: root)') + init_parser = subparsers.add_parser('init', help='initialize a new container', description='Initialize a new container. Should be called by root.') + init_parser.add_argument('name', help='name of the container') + + list_parser = subparsers.add_parser('list', help='list available containers', description='List available containers.') + list_parser.add_argument('--all', '-a', default=False, action='store_true', help='include containers with no permission to operate') + start_parser = subparsers.add_parser('rsync', help='rsync connection wrapper', description=""" Connection wrapper for rsync. @@ -368,6 +374,7 @@ def main() -> None: 'enable': cmd_enable, 'exec': cmd_exec, 'init': cmd_init, + 'list': cmd_list, 'rsync': cmd_rsync, 'shell': cmd_shell, 'start': cmd_start,