From f3c4a51b85c5121039239885d3c04805595022fc Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Sun, 8 Mar 2026 10:41:58 +0100 Subject: [PATCH] cmds.secrets.CmdCompileTemplates: Support -ogm Add support for the -o (--owner) -g (--group) -m (--mode) options. They allow to specify a default for compiling templates, but _don't_ override what's in the #conf: specification line in .jw-tmpl or .jw-secret files. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/cmds/secrets/Cmd.py | 33 ++++++++++++++++--- .../pkg/cmds/secrets/CmdCompileTemplates.py | 9 ++++- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/python/jw/pkg/cmds/secrets/Cmd.py b/src/python/jw/pkg/cmds/secrets/Cmd.py index e6fddc83..4e83a238 100644 --- a/src/python/jw/pkg/cmds/secrets/Cmd.py +++ b/src/python/jw/pkg/cmds/secrets/Cmd.py @@ -22,11 +22,33 @@ class Cmd(Base): # export @dataclass class Attrs: + mode: int | None = None owner: str | None = None group: str | None = None conf: str | None = None + def update(self, rhs: Args|None) -> Args: + if rhs is not None: + if rhs.mode: + self.mode = rhs.mode + if rhs.owner: + self.owner = rhs.owner + if rhs.group: + self.group = rhs.group + if rhs.conf: + self.conf = rhs.conf + return self + + def emtpy(self) -> bool: + if self.mode is not None: + return False + if self.owner is not None: + return False + if self.group is not None: + return False + return True + def __read_key_value_file(self, path: str) -> dict[str, str]: ret: dict[str, str] = {} with open(path, "r", encoding="utf-8") as f: @@ -230,17 +252,18 @@ class Cmd(Base): # export log(NOTICE, f'Removing {path}') os.unlink(path) - async def _compile_template_files(self, packages: Iterable[str], attrs: str|Attrs=None) -> list[str]: + async def _compile_template_files(self, packages: Iterable[str], default_attrs: Attrs) -> list[str]: + if default_attrs is None: + default_attrs = Attrs() for target in await self._list_compilation_targets(packages): - default_attrs = self.__read_attributes([target + '.jw-tmpl']) - if default_attrs is None: - default_attrs = attrs + attrs = default_attrs + attrs.update(self.__read_attributes([target + '.jw-tmpl'])) secret = target + '.jw-secret' replace = {} if not os.path.exists(secret) else self.__read_key_value_file(secret) for ext in [ '.jw-secret-file', '.jw-tmpl' ]: src = target + ext if os.path.exists(src): - self.__copy_securely(src=src, dst=target, default_attrs=default_attrs, replace=replace) + self.__copy_securely(src=src, dst=target, default_attrs=attrs, replace=replace) break else: log(WARNING, f'No secret found for target {target}, not compiling') diff --git a/src/python/jw/pkg/cmds/secrets/CmdCompileTemplates.py b/src/python/jw/pkg/cmds/secrets/CmdCompileTemplates.py index afc11f60..25a42e9f 100644 --- a/src/python/jw/pkg/cmds/secrets/CmdCompileTemplates.py +++ b/src/python/jw/pkg/cmds/secrets/CmdCompileTemplates.py @@ -15,4 +15,11 @@ class CmdCompileTemplates(Cmd): # export super().__init__(parent, 'compile-templates', help="Compile package template files") async def _run(self, args: Namespace) -> None: - await self._compile_template_files(args.packages) + attrs = Cmd.Attrs(args.mode, args.owner, args.group, None) + await self._compile_template_files(args.packages, attrs) + + def add_arguments(self, parser: ArgumentParser) -> None: + super().add_arguments(parser) + parser.add_argument('--owner', '-o', default=None, help='Default output file owner') + parser.add_argument('--group', '-g', default=None, help='Default output file group') + parser.add_argument('--mode', '-m', default=None, help='Default output file mode')