diff --git a/osbuild/meta.py b/osbuild/meta.py index 3c083a6a..039d2858 100644 --- a/osbuild/meta.py +++ b/osbuild/meta.py @@ -296,6 +296,7 @@ class ModuleInfo: self.info = info["info"] self.desc = info["desc"] self.opts = info["schema"] + self.caps = info["caps"] def _load_opts(self, version, fallback=None): raw = self.opts[version] @@ -388,9 +389,16 @@ class ModuleInfo: detail = fullname, lineno, e.colno, line raise SyntaxError(msg, detail) from None + @classmethod + def _parse_caps(cls, _klass, _name, node): + if not node: + return set() + + return {e.s for e in node.value.elts} + @classmethod def load(cls, root, klass, name) -> Optional["ModuleInfo"]: - names = ["SCHEMA", "SCHEMA_2"] + names = ["SCHEMA", "SCHEMA_2", "CAPABILITIES"] def filter_type(lst, target): return [x for x in lst if isinstance(x, target)] @@ -425,13 +433,17 @@ class ModuleInfo: def parse_schema(node): return cls._parse_schema(klass, name, node) + def parse_caps(node): + return cls._parse_caps(klass, name, node) + info = { 'schema': { "1": parse_schema(values.get("SCHEMA")), "2": parse_schema(values.get("SCHEMA_2")), }, 'desc': doclist[0], - 'info': "\n".join(doclist[1:]) + 'info': "\n".join(doclist[1:]), + 'caps': parse_caps(values.get("CAPABILITIES")) } return cls(klass, name, path, info) diff --git a/osbuild/pipeline.py b/osbuild/pipeline.py index 80f08ced..36f88017 100644 --- a/osbuild/pipeline.py +++ b/osbuild/pipeline.py @@ -157,7 +157,7 @@ class Stage: build_root.mount_boot = bool(self.build) # drop capabilities other than `DEFAULT_CAPABILITIES` - build_root.caps = DEFAULT_CAPABILITIES + build_root.caps = DEFAULT_CAPABILITIES | self.info.caps tmpdir = store.tempdir(prefix="buildroot-tmp-") tmpdir = cm.enter_context(tmpdir)