From: Daan De Meyer Date: Tue, 13 Feb 2024 11:26:46 +0000 (+0100) Subject: Fail early with a clear error if keyring does not exist X-Git-Tag: v21~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=32d293cf5fd32e3510b8a45dc5fdd3a8a4904f24;p=thirdparty%2Fmkosi.git Fail early with a clear error if keyring does not exist We also introduce listify() and apply it to all repositories() functions to make them return lists instead of generators to avoid tripping up on the fact that generators can only be iterated once. --- diff --git a/mkosi/distributions/arch.py b/mkosi/distributions/arch.py index 7038db5f9..0c45aa1c0 100644 --- a/mkosi/distributions/arch.py +++ b/mkosi/distributions/arch.py @@ -8,6 +8,7 @@ from mkosi.distributions import Distribution, DistributionInstaller, PackageType from mkosi.installer import PackageManager from mkosi.installer.pacman import Pacman from mkosi.log import die +from mkosi.util import listify class Installer(DistributionInstaller): @@ -66,6 +67,7 @@ class Installer(DistributionInstaller): Pacman.invoke(context, "--remove", ["--nosave", "--recursive"], packages) @classmethod + @listify def repositories(cls, context: Context) -> Iterable[Pacman.Repository]: if context.config.local_mirror: yield Pacman.Repository("core", context.config.local_mirror) diff --git a/mkosi/distributions/centos.py b/mkosi/distributions/centos.py index 12098cf02..cc42df687 100644 --- a/mkosi/distributions/centos.py +++ b/mkosi/distributions/centos.py @@ -17,6 +17,7 @@ from mkosi.installer.dnf import Dnf from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey from mkosi.log import complete_step, die from mkosi.tree import rmtree +from mkosi.util import listify from mkosi.versioncomp import GenericVersion @@ -227,6 +228,7 @@ class Installer(DistributionInstaller): ) @classmethod + @listify def repositories(cls, context: Context) -> Iterable[RpmRepository]: if context.config.local_mirror: yield from cls.repository_variants(context, "AppStream") diff --git a/mkosi/distributions/debian.py b/mkosi/distributions/debian.py index f19eac133..1db94fd54 100644 --- a/mkosi/distributions/debian.py +++ b/mkosi/distributions/debian.py @@ -13,7 +13,7 @@ from mkosi.installer import PackageManager from mkosi.installer.apt import Apt from mkosi.log import die from mkosi.run import run -from mkosi.util import umask +from mkosi.util import listify, umask class Installer(DistributionInstaller): @@ -42,6 +42,7 @@ class Installer(DistributionInstaller): return Apt @staticmethod + @listify def repositories(context: Context, local: bool = True) -> Iterable[Apt.Repository]: types = ("deb", "deb-src") components = ("main", *context.config.repositories) @@ -57,7 +58,7 @@ class Installer(DistributionInstaller): return mirror = context.config.mirror or "http://deb.debian.org/debian" - signedby = "/usr/share/keyrings/debian-archive-keyring.gpg" + signedby = Path("/usr/share/keyrings/debian-archive-keyring.gpg") yield Apt.Repository( types=types, diff --git a/mkosi/distributions/fedora.py b/mkosi/distributions/fedora.py index 6bfaf9eeb..27eab68e5 100644 --- a/mkosi/distributions/fedora.py +++ b/mkosi/distributions/fedora.py @@ -14,6 +14,7 @@ from mkosi.installer import PackageManager from mkosi.installer.dnf import Dnf from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey from mkosi.log import die +from mkosi.util import listify class Installer(DistributionInstaller): @@ -70,6 +71,7 @@ class Installer(DistributionInstaller): Dnf.invoke(context, "remove", packages) @classmethod + @listify def repositories(cls, context: Context) -> Iterable[RpmRepository]: gpgurls = ( find_rpm_gpgkey( diff --git a/mkosi/distributions/mageia.py b/mkosi/distributions/mageia.py index c1c11bcfd..0fe44e889 100644 --- a/mkosi/distributions/mageia.py +++ b/mkosi/distributions/mageia.py @@ -8,6 +8,7 @@ from mkosi.context import Context from mkosi.distributions import Distribution, fedora, join_mirror from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey from mkosi.log import die +from mkosi.util import listify class Installer(fedora.Installer): @@ -38,6 +39,7 @@ class Installer(fedora.Installer): shutil.copy2(d, vmlinuz) @classmethod + @listify def repositories(cls, context: Context) -> Iterable[RpmRepository]: gpgurls = ( find_rpm_gpgkey( diff --git a/mkosi/distributions/openmandriva.py b/mkosi/distributions/openmandriva.py index de2e2ade5..d6dc031e5 100644 --- a/mkosi/distributions/openmandriva.py +++ b/mkosi/distributions/openmandriva.py @@ -8,6 +8,7 @@ from mkosi.context import Context from mkosi.distributions import Distribution, fedora, join_mirror from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey from mkosi.log import die +from mkosi.util import listify class Installer(fedora.Installer): @@ -42,6 +43,7 @@ class Installer(fedora.Installer): shutil.copy2(d, vmlinuz) @classmethod + @listify def repositories(cls, context: Context) -> Iterable[RpmRepository]: mirror = context.config.mirror or "http://mirror.openmandriva.org" diff --git a/mkosi/distributions/opensuse.py b/mkosi/distributions/opensuse.py index e2e1fbc34..230c7e49f 100644 --- a/mkosi/distributions/opensuse.py +++ b/mkosi/distributions/opensuse.py @@ -15,6 +15,7 @@ from mkosi.installer.zypper import Zypper from mkosi.log import die from mkosi.run import find_binary, run from mkosi.sandbox import finalize_crypto_mounts +from mkosi.util import listify class Installer(DistributionInstaller): @@ -94,6 +95,7 @@ class Installer(DistributionInstaller): Dnf.invoke(context, "remove", packages) @classmethod + @listify def repositories(cls, context: Context) -> Iterable[RpmRepository]: zypper = find_binary("zypper", root=context.config.tools()) diff --git a/mkosi/distributions/rhel.py b/mkosi/distributions/rhel.py index 38cb88673..35de9e4bf 100644 --- a/mkosi/distributions/rhel.py +++ b/mkosi/distributions/rhel.py @@ -8,6 +8,7 @@ from mkosi.context import Context from mkosi.distributions import centos, join_mirror from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey from mkosi.log import die +from mkosi.util import listify class Installer(centos.Installer): @@ -107,6 +108,7 @@ class Installer(centos.Installer): ) @classmethod + @listify def repositories(cls, context: Context) -> Iterable[RpmRepository]: yield from cls.repository_variants(context, "baseos") yield from cls.repository_variants(context, "appstream") diff --git a/mkosi/distributions/rhel_ubi.py b/mkosi/distributions/rhel_ubi.py index 033dee56d..e486a0049 100644 --- a/mkosi/distributions/rhel_ubi.py +++ b/mkosi/distributions/rhel_ubi.py @@ -5,6 +5,7 @@ from collections.abc import Iterable from mkosi.context import Context from mkosi.distributions import centos, join_mirror from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey +from mkosi.util import listify class Installer(centos.Installer): @@ -50,6 +51,7 @@ class Installer(centos.Installer): ) @classmethod + @listify def repositories(cls, context: Context) -> Iterable[RpmRepository]: yield from cls.repository_variants(context, "baseos") yield from cls.repository_variants(context, "appstream") diff --git a/mkosi/distributions/ubuntu.py b/mkosi/distributions/ubuntu.py index 2f89e1251..16d0859b2 100644 --- a/mkosi/distributions/ubuntu.py +++ b/mkosi/distributions/ubuntu.py @@ -1,11 +1,13 @@ # SPDX-License-Identifier: LGPL-2.1+ from collections.abc import Iterable +from pathlib import Path from mkosi.config import Architecture from mkosi.context import Context from mkosi.distributions import debian from mkosi.installer.apt import Apt +from mkosi.util import listify class Installer(debian.Installer): @@ -18,6 +20,7 @@ class Installer(debian.Installer): return "lunar" @staticmethod + @listify def repositories(context: Context, local: bool = True) -> Iterable[Apt.Repository]: types = ("deb", "deb-src") @@ -41,7 +44,7 @@ class Installer(debian.Installer): else: mirror = context.config.mirror or "http://ports.ubuntu.com" - signedby = "/usr/share/keyrings/ubuntu-archive-keyring.gpg" + signedby = Path("/usr/share/keyrings/ubuntu-archive-keyring.gpg") yield Apt.Repository( types=types, diff --git a/mkosi/installer/apt.py b/mkosi/installer/apt.py index 8990bda66..8dbd33020 100644 --- a/mkosi/installer/apt.py +++ b/mkosi/installer/apt.py @@ -7,6 +7,7 @@ from typing import NamedTuple, Optional from mkosi.config import Config from mkosi.context import Context from mkosi.installer import PackageManager +from mkosi.log import die from mkosi.mounts import finalize_ephemeral_source_mounts from mkosi.run import find_binary, run from mkosi.sandbox import apivfs_cmd @@ -20,7 +21,7 @@ class Apt(PackageManager): url: str suite: str components: tuple[str, ...] - signedby: Optional[str] + signedby: Optional[Path] def __str__(self) -> str: return textwrap.dedent( @@ -94,6 +95,14 @@ class Apt(PackageManager): sources = context.pkgmngr / "etc/apt/sources.list.d/mkosi.sources" if not sources.exists(): + for repo in repos: + if repo.signedby and not repo.signedby.exists(): + die( + f"Keyring for repo {repo.url} not found at {repo.signedby}", + hint="Make sure the right keyring package (e.g. debian-archive-keyring or ubuntu-keyring) is " + "installed", + ) + with sources.open("w") as f: for repo in repos: f.write(str(repo)) diff --git a/mkosi/util.py b/mkosi/util.py index 2db55b510..ba7c27255 100644 --- a/mkosi/util.py +++ b/mkosi/util.py @@ -33,6 +33,13 @@ def dictify(f: Callable[..., Iterator[tuple[T, V]]]) -> Callable[..., dict[T, V] return functools.update_wrapper(wrapper, f) +def listify(f: Callable[..., Iterable[T]]) -> Callable[..., list[T]]: + def wrapper(*args: Any, **kwargs: Any) -> list[T]: + return list(f(*args, **kwargs)) + + return functools.update_wrapper(wrapper, f) + + @dictify def read_env_file(path: Path) -> Iterator[tuple[str, str]]: with path.open() as f: