]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Split out rpm.py and hook up rpm logic with zypper as well
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Sat, 16 Dec 2023 21:58:21 +0000 (22:58 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 18 Dec 2023 11:19:13 +0000 (12:19 +0100)
We have a bunch of rpm related logic that's required when using
dnf and zypper so let's split out rpm.py and hook up everything in
both dnf and zypper.

13 files changed:
mkosi/distributions/alma.py
mkosi/distributions/centos.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/rocky.py
mkosi/installer/__init__.py
mkosi/installer/dnf.py
mkosi/installer/rpm.py [new file with mode: 0644]
mkosi/installer/zypper.py

index 8d5c751395af2b997bc36b5a29e70e30aa377dd2..f35bdd7ae62e58bb1ee15b7be439d48eb1e2c8f9 100644 (file)
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: LGPL-2.1+
 
 from mkosi.distributions import centos, join_mirror
-from mkosi.installer.dnf import RpmRepository, find_rpm_gpgkey
+from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
 from mkosi.state import MkosiState
 
 
index 1a23a118fc322758ba0731600931fc982f813c16..5a168b3f5822f42b3a0b1585f30f7ff435b5af8e 100644 (file)
@@ -12,7 +12,8 @@ from mkosi.distributions import (
     PackageType,
     join_mirror,
 )
-from mkosi.installer.dnf import RpmRepository, find_rpm_gpgkey, invoke_dnf, setup_dnf
+from mkosi.installer.dnf import invoke_dnf, setup_dnf
+from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
 from mkosi.log import complete_step, die
 from mkosi.state import MkosiState
 from mkosi.tree import rmtree
index 3ea860c545d61f5bbcbd08cb7581d93dbc15a60e..7e7502aad0a4ed14edb6f73a81fa46bc75ad9214 100644 (file)
@@ -9,7 +9,8 @@ from mkosi.distributions import (
     PackageType,
     join_mirror,
 )
-from mkosi.installer.dnf import RpmRepository, find_rpm_gpgkey, invoke_dnf, setup_dnf
+from mkosi.installer.dnf import invoke_dnf, setup_dnf
+from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
 from mkosi.log import die
 from mkosi.state import MkosiState
 
index c2a0c895efbe53991b8f6a9ea972746c87b3312e..39b5ac6236df5918e08d2ada67f943cdd7eda675 100644 (file)
@@ -10,7 +10,8 @@ from mkosi.distributions import (
     PackageType,
     join_mirror,
 )
-from mkosi.installer.dnf import RpmRepository, find_rpm_gpgkey, invoke_dnf, setup_dnf
+from mkosi.installer.dnf import invoke_dnf, setup_dnf
+from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
 from mkosi.log import die
 from mkosi.state import MkosiState
 
index a1ec839f2b2e7748e1237b4bb4314e262073aa5d..d47db247e6f19359de0948064cb457b8e47dd931 100644 (file)
@@ -10,7 +10,8 @@ from mkosi.distributions import (
     PackageType,
     join_mirror,
 )
-from mkosi.installer.dnf import RpmRepository, find_rpm_gpgkey, invoke_dnf, setup_dnf
+from mkosi.installer.dnf import invoke_dnf, setup_dnf
+from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
 from mkosi.log import die
 from mkosi.state import MkosiState
 
index 8bc84ce2b5702763dff7faf7a2babda79ee5ba37..cad67dc34a54c817ffe0d310f616e3def0a2727a 100644 (file)
@@ -7,7 +7,8 @@ from collections.abc import Sequence
 
 from mkosi.config import Architecture
 from mkosi.distributions import Distribution, DistributionInstaller, PackageType
-from mkosi.installer.dnf import RpmRepository, invoke_dnf, setup_dnf
+from mkosi.installer.dnf import invoke_dnf, setup_dnf
+from mkosi.installer.rpm import RpmRepository
 from mkosi.installer.zypper import invoke_zypper, setup_zypper
 from mkosi.log import die
 from mkosi.state import MkosiState
index 5964af4cab8723fc4b5126c4c6af0288621e04bd..290a9ac6b69a6601fc9284917e4a074fe52c7d8a 100644 (file)
@@ -5,7 +5,7 @@ from pathlib import Path
 from typing import Any, Optional
 
 from mkosi.distributions import centos, join_mirror
-from mkosi.installer.dnf import RpmRepository, find_rpm_gpgkey
+from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
 from mkosi.log import die
 from mkosi.state import MkosiState
 
index 54d1ba3942a290fc333d928f3420513f5b00d81f..f789cf006abf61edab9d6fe0143f9d6f31a23f6a 100644 (file)
@@ -3,7 +3,7 @@
 from collections.abc import Iterable
 
 from mkosi.distributions import centos, join_mirror
-from mkosi.installer.dnf import RpmRepository, find_rpm_gpgkey
+from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
 from mkosi.state import MkosiState
 
 
index bb8252e71ea546d1698fba751fae9149f35165eb..f35607e338762c721c41ce4ce63fea66154a7aaa 100644 (file)
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: LGPL-2.1+
 
 from mkosi.distributions import centos, join_mirror
-from mkosi.installer.dnf import RpmRepository, find_rpm_gpgkey
+from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
 from mkosi.state import MkosiState
 
 
index afaced1b55e4751859ab2b47bddbfa0b808e3586..e77f0425ee0a3f5ceff44711931eb3c840940257 100644 (file)
@@ -4,8 +4,9 @@ import os
 
 from mkosi.config import ConfigFeature
 from mkosi.installer.apt import apt_cmd
-from mkosi.installer.dnf import dnf_cmd, rpm_cmd
+from mkosi.installer.dnf import dnf_cmd
 from mkosi.installer.pacman import pacman_cmd
+from mkosi.installer.rpm import rpm_cmd
 from mkosi.installer.zypper import zypper_cmd
 from mkosi.run import apivfs_cmd
 from mkosi.state import MkosiState
index 69abc6a6ca8d29ed07f9957e476dfe48e39c07ce..72b3ecc5f25a59daa40d1b41569b8d8429869fae 100644 (file)
@@ -1,39 +1,15 @@
 # SPDX-License-Identifier: LGPL-2.1+
-import os
 import shutil
-import subprocess
 import textwrap
 from collections.abc import Iterable
-from pathlib import Path
-from typing import NamedTuple, Optional
 
-from mkosi.run import apivfs_cmd, bwrap, run
+from mkosi.installer.rpm import RpmRepository, fixup_rpmdb_location, setup_rpm
+from mkosi.run import apivfs_cmd, bwrap
 from mkosi.state import MkosiState
-from mkosi.tree import copy_tree, rmtree
 from mkosi.types import PathString
 from mkosi.util import sort_packages
 
 
-class RpmRepository(NamedTuple):
-    id: str
-    url: str
-    gpgurls: tuple[str, ...]
-    enabled: bool = True
-    sslcacert: Optional[Path] = None
-    sslclientkey: Optional[Path] = None
-    sslclientcert: Optional[Path] = None
-
-
-def find_rpm_gpgkey(state: MkosiState, key: str, url: str) -> str:
-    for gpgdir in ("usr/share/distribution-gpg-keys", "etc/pki/rpm-gpg"):
-        for root in (state.pkgmngr, state.root, Path("/")):
-            gpgpath = next((root / Path(gpgdir)).rglob(key), None)
-            if gpgpath:
-                return f"file://{gpgpath}"
-
-    return url
-
-
 def dnf_executable(state: MkosiState) -> str:
     # Allow the user to override autodetection with an environment variable
     dnf = state.config.environment.get("MKOSI_DNF")
@@ -86,13 +62,7 @@ def setup_dnf(state: MkosiState, repositories: Iterable[RpmRepository], filelist
 
                 f.write("\n")
 
-    macros = state.pkgmngr / "usr/lib/rpm/macros.d"
-    macros.mkdir(parents=True, exist_ok=True)
-    if not (macros / "macros.lang").exists() and state.config.locale:
-        (macros / "macros.lang").write_text(f"%_install_langs {state.config.locale}")
-
-    rpmconfigdir = Path(run(["rpm", "--eval", "%{_rpmconfigdir}"], stdout=subprocess.PIPE).stdout.strip())
-    copy_tree(rpmconfigdir, state.pkgmngr / "usr/lib/rpm", clobber=False, use_subvolumes=state.config.use_subvolumes)
+    setup_rpm(state)
 
 
 def dnf_cmd(state: MkosiState) -> list[PathString]:
@@ -151,24 +121,3 @@ def invoke_dnf(state: MkosiState, command: str, packages: Iterable[str], apivfs:
     for p in (state.root / "var/log").iterdir():
         if any(p.name.startswith(prefix) for prefix in ("dnf", "hawkey", "yum")):
             p.unlink()
-
-
-def fixup_rpmdb_location(root: Path) -> None:
-    # On Debian, rpm/dnf ship with a patch to store the rpmdb under ~/ so it needs to be copied back in the
-    # right location, otherwise the rpmdb will be broken. See: https://bugs.debian.org/1004863. We also
-    # replace it with a symlink so that any further rpm operations immediately use the correct location.
-    rpmdb_home = root / "root/.rpmdb"
-    if not rpmdb_home.exists() or rpmdb_home.is_symlink():
-        return
-
-    # Take into account the new location in F36
-    rpmdb = root / "usr/lib/sysimage/rpm"
-    if not rpmdb.exists():
-        rpmdb = root / "var/lib/rpm"
-    rmtree(rpmdb)
-    shutil.move(rpmdb_home, rpmdb)
-    rpmdb_home.symlink_to(os.path.relpath(rpmdb, start=rpmdb_home.parent))
-
-
-def rpm_cmd(state: MkosiState) -> list[PathString]:
-    return ["env", "HOME=/", f"RPM_CONFIGDIR={state.pkgmngr / 'usr/lib/rpm'}", "rpm", "--root", state.root]
diff --git a/mkosi/installer/rpm.py b/mkosi/installer/rpm.py
new file mode 100644 (file)
index 0000000..abdc3b8
--- /dev/null
@@ -0,0 +1,63 @@
+# SPDX-License-Identifier: LGPL-2.1+
+
+import os
+import shutil
+import subprocess
+from pathlib import Path
+from typing import NamedTuple, Optional
+
+from mkosi.run import run
+from mkosi.state import MkosiState
+from mkosi.tree import copy_tree, rmtree
+from mkosi.types import PathString
+
+
+class RpmRepository(NamedTuple):
+    id: str
+    url: str
+    gpgurls: tuple[str, ...]
+    enabled: bool = True
+    sslcacert: Optional[Path] = None
+    sslclientkey: Optional[Path] = None
+    sslclientcert: Optional[Path] = None
+
+
+def find_rpm_gpgkey(state: MkosiState, key: str, url: str) -> str:
+    for gpgdir in ("usr/share/distribution-gpg-keys", "etc/pki/rpm-gpg"):
+        for root in (state.pkgmngr, state.root, Path("/")):
+            gpgpath = next((root / Path(gpgdir)).rglob(key), None)
+            if gpgpath:
+                return f"file://{gpgpath}"
+
+    return url
+
+
+def setup_rpm(state: MkosiState) -> None:
+    macros = state.pkgmngr / "usr/lib/rpm/macros.d"
+    macros.mkdir(parents=True, exist_ok=True)
+    if not (macros / "macros.lang").exists() and state.config.locale:
+        (macros / "macros.lang").write_text(f"%_install_langs {state.config.locale}")
+
+    rpmconfigdir = Path(run(["rpm", "--eval", "%{_rpmconfigdir}"], stdout=subprocess.PIPE).stdout.strip())
+    copy_tree(rpmconfigdir, state.pkgmngr / "usr/lib/rpm", clobber=False, use_subvolumes=state.config.use_subvolumes)
+
+
+def fixup_rpmdb_location(root: Path) -> None:
+    # On Debian, rpm/dnf ship with a patch to store the rpmdb under ~/ so it needs to be copied back in the
+    # right location, otherwise the rpmdb will be broken. See: https://bugs.debian.org/1004863. We also
+    # replace it with a symlink so that any further rpm operations immediately use the correct location.
+    rpmdb_home = root / "root/.rpmdb"
+    if not rpmdb_home.exists() or rpmdb_home.is_symlink():
+        return
+
+    # Take into account the new location in F36
+    rpmdb = root / "usr/lib/sysimage/rpm"
+    if not rpmdb.exists():
+        rpmdb = root / "var/lib/rpm"
+    rmtree(rpmdb)
+    shutil.move(rpmdb_home, rpmdb)
+    rpmdb_home.symlink_to(os.path.relpath(rpmdb, start=rpmdb_home.parent))
+
+
+def rpm_cmd(state: MkosiState) -> list[PathString]:
+    return ["env", "HOME=/", f"RPM_CONFIGDIR={state.pkgmngr / 'usr/lib/rpm'}", "rpm", "--root", state.root]
index 6197aab93c63cc7c9036b12051113f5b11cea866..0c95fd5fa7e6a2d6ca0ddd161ddf306b6e644006 100644 (file)
@@ -3,7 +3,7 @@ import textwrap
 from collections.abc import Sequence
 
 from mkosi.config import yes_no
-from mkosi.installer.dnf import RpmRepository, fixup_rpmdb_location
+from mkosi.installer.rpm import RpmRepository, fixup_rpmdb_location, setup_rpm
 from mkosi.run import apivfs_cmd, bwrap
 from mkosi.state import MkosiState
 from mkosi.types import PathString
@@ -51,11 +51,14 @@ def setup_zypper(state: MkosiState, repos: Sequence[RpmRepository]) -> None:
                     f.write("gpgkey=" if i == 0 else len("gpgkey=") * " ")
                     f.write(f"{url}\n")
 
+    setup_rpm(state)
+
 
 def zypper_cmd(state: MkosiState) -> list[PathString]:
     return [
         "env",
         f"ZYPP_CONF={state.pkgmngr / 'etc/zypp/zypp.conf'}",
+        f"RPM_CONFIGDIR={state.pkgmngr / 'usr/lib/rpm'}",
         "zypper",
         f"--root={state.root}",
         f"--cache-dir={state.cache_dir / 'zypp'}",