File 0002-Include-sys-conf-ext-info-in-metadata-file.patch of Package mkosi
From a5fa1020ca126a7f127fb27c8db4928edac80c04 Mon Sep 17 00:00:00 2001
From: Alberto Planas <aplanas@suse.com>
Date: Fri, 25 Jul 2025 13:40:03 +0200
Subject: [PATCH] Include {sys,conf}ext info in metadata file
Signed-off-by: Alberto Planas <aplanas@suse.com>
---
mkosi/__init__.py | 3 +++
mkosi/manifest.py | 19 +++++++++++++++++--
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/mkosi/__init__.py b/mkosi/__init__.py
index 51b06ab0..e45d7bd4 100644
--- a/mkosi/__init__.py
+++ b/mkosi/__init__.py
@@ -3773,6 +3773,9 @@ def build_image(context: Context) -> None:
configure_ssh(context)
configure_clock(context)
+ if manifest:
+ manifest.record_extension_release()
+
install_systemd_boot(context)
install_grub(context)
install_shim(context)
diff --git a/mkosi/manifest.py b/mkosi/manifest.py
index 5fd7682f..dd6a29be 100644
--- a/mkosi/manifest.py
+++ b/mkosi/manifest.py
@@ -8,12 +8,13 @@ import textwrap
from pathlib import Path
from typing import IO, Any, Optional
-from mkosi.config import ManifestFormat
+from mkosi.config import ManifestFormat, OutputFormat
from mkosi.context import Context
from mkosi.distributions import PackageType
from mkosi.installer.apt import Apt
from mkosi.log import complete_step
from mkosi.run import run
+from mkosi.util import read_env_file
@dataclasses.dataclass
@@ -85,6 +86,7 @@ class Manifest:
context: Context
packages: list[PackageManifest] = dataclasses.field(default_factory=list)
source_packages: dict[str, SourcePackageManifest] = dataclasses.field(default_factory=dict)
+ extension: dict[str, str] = dataclasses.field(default_factory=dict)
_init_timestamp: datetime.datetime = dataclasses.field(
init=False, default_factory=lambda: datetime.datetime.now().replace(microsecond=0)
@@ -233,15 +235,26 @@ class Manifest:
self.source_packages[source] = source_package
source_package.add(package)
+ def record_extension_release(self) -> None:
+ if self.context.config.output_format not in (OutputFormat.sysext, OutputFormat.confext):
+ return
+
+ with complete_step(f"Recording {type} information in manifest…"):
+ d = "usr/lib" if self.context.config.output_format == OutputFormat.sysext else "etc"
+ p = self.context.root / d / f"extension-release.d/extension-release.{self.context.config.output}"
+
+ self.extension = read_env_file(p)
+
def has_data(self) -> bool:
# We might add more data in the future
- return len(self.packages) > 0
+ return len(self.packages) > 0 or len(self.extension) > 0
def as_dict(self) -> dict[str, Any]:
config = {
"name": self.context.config.image_id or "image",
"distribution": str(self.context.config.distribution),
"architecture": str(self.context.config.architecture),
+ "output_format": str(self.context.config.output_format),
}
if self.context.config.image_version is not None:
config["version"] = self.context.config.image_version
@@ -255,6 +268,8 @@ class Manifest:
"config": config,
# Describe the image content in terms of packages.
"packages": [package.as_dict() for package in self.packages],
+ # Describe the SYSEXT / CONFEXT metadata.
+ "extension": self.extension,
}
def write_json(self, out: IO[str]) -> None:
--
2.43.0