]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Fail early with a clear error if keyring does not exist
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 13 Feb 2024 11:26:46 +0000 (12:26 +0100)
committerJörg Behrmann <behrmann@physik.fu-berlin.de>
Tue, 13 Feb 2024 13:02:51 +0000 (14:02 +0100)
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.

12 files changed:
mkosi/distributions/arch.py
mkosi/distributions/centos.py
mkosi/distributions/debian.py
mkosi/distributions/fedora.py
mkosi/distributions/mageia.py
mkosi/distributions/openmandriva.py
mkosi/distributions/opensuse.py
mkosi/distributions/rhel.py
mkosi/distributions/rhel_ubi.py
mkosi/distributions/ubuntu.py
mkosi/installer/apt.py
mkosi/util.py

index 7038db5f9d1380c4d477ade48529f445e07e6d97..0c45aa1c0414ce0af7395bc369e47ff24ee39282 100644 (file)
@@ -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)
index 12098cf0256f878db7c2b6aa94dcf015dad4da69..cc42df6876661564e50dfd2aa0a096780726334f 100644 (file)
@@ -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")
index f19eac133ef7078805e24e1a4055f9ccab0c2671..1db94fd54c487521bbd51a5be077b44bba70c42a 100644 (file)
@@ -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,
index 6bfaf9eeb211e14ae30644c02a59edbb08186570..27eab68e5c0450e86129cea640f6d763d5e42df7 100644 (file)
@@ -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(
index c1c11bcfdafdb439fb5bede1718a8273336861f5..0fe44e88977ebb0b867e90df35e2ffb0143dea6f 100644 (file)
@@ -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(
index de2e2ade5ff7187b7bf387f6da55ad0a660c141a..d6dc031e50f32f72ad2c5369d5d77ff80bd28451 100644 (file)
@@ -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"
 
index e2e1fbc34e0216ab86c26a03d0185cd21ac6c499..230c7e49f6a910e6cf21c5e39bc1644e280dbcfe 100644 (file)
@@ -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())
 
index 38cb88673852f2a1ae18e592e251711b7b24cb36..35de9e4bf7084a2c72830af79b8678c833ee03e3 100644 (file)
@@ -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")
index 033dee56de3300c27bf2994b08c78eb6c8c5072e..e486a0049698cad7af4d72a6d8e382683aae6551 100644 (file)
@@ -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")
index 2f89e1251e7460e30574f1828b8c7d3609dc4dbb..16d0859b2a80b8403b2c9b9a75e6aff76723cc9c 100644 (file)
@@ -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,
index 8990bda666f6fb10c15767e6a51a61def68c5024..8dbd3302031565250a78812a912fe2e4e704d3bd 100644 (file)
@@ -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))
index 2db55b51058f570862a3cf1a22752dc3278083df..ba7c272553ba5bde6222d113a56f3f377596d3b7 100644 (file)
@@ -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: