Verb,
)
from mkosi.install import add_dropin_config_from_resource
+from mkosi.installer import clean_package_manager_metadata
from mkosi.log import Style, color_error, complete_step, die, log_step
from mkosi.manifest import Manifest
from mkosi.mounts import mount_overlay, mount_passwd, mount_tools, scandir_recursive
from mkosi.state import MkosiState
from mkosi.tree import copy_tree, move_tree, rmtree
from mkosi.types import PathString
-from mkosi.util import (
- InvokingUser,
- flatten,
- format_bytes,
- format_rlimit,
- scopedenv,
- try_import,
-)
+from mkosi.util import InvokingUser, format_bytes, format_rlimit, scopedenv, try_import
@contextlib.contextmanager
yield
-def clean_paths(
- root: Path,
- globs: Sequence[str],
- tool: str,
- always: bool) -> None:
- """Remove globs under root if always or if tool is not found under root."""
-
- toolp = root / tool.lstrip('/')
- cond = always or not os.access(toolp, os.F_OK, follow_symlinks=False)
-
- paths = flatten(root.glob(glob.lstrip('/')) for glob in globs)
-
- if not cond or not paths:
- return
-
- with complete_step(f"Cleaning {toolp.name} metadata…"):
- for path in paths:
- rmtree(path)
-
-
-def clean_dnf_metadata(root: Path, always: bool) -> None:
- """Remove dnf metadata if /bin/dnf is not present in the image
-
- If dnf is not installed, there doesn't seem to be much use in keeping the
- dnf metadata, since it's not usable from within the image anyway.
- """
- paths = [
- "/var/lib/dnf",
- "/var/log/dnf.*",
- "/var/log/hawkey.*",
- "/var/cache/dnf",
- ]
-
- clean_paths(root, paths, tool='/bin/dnf', always=always)
-
-
-def clean_yum_metadata(root: Path, always: bool) -> None:
- """Remove yum metadata if /bin/yum is not present in the image"""
- paths = [
- "/var/lib/yum",
- "/var/log/yum.*",
- "/var/cache/yum",
- ]
-
- clean_paths(root, paths, tool='/bin/yum', always=always)
-
-
-def clean_rpm_metadata(root: Path, always: bool) -> None:
- """Remove rpm metadata if /bin/rpm is not present in the image"""
- paths = [
- "/var/lib/rpm",
- "/usr/lib/sysimage/rpm",
- ]
-
- clean_paths(root, paths, tool='/bin/rpm', always=always)
-
-
-def clean_apt_metadata(root: Path, always: bool) -> None:
- """Remove apt metadata if /usr/bin/apt is not present in the image"""
- paths = [
- "/var/lib/apt",
- "/var/log/apt",
- "/var/cache/apt",
- ]
-
- clean_paths(root, paths, tool='/usr/bin/apt', always=always)
-
-
-def clean_dpkg_metadata(root: Path, always: bool) -> None:
- """Remove dpkg metadata if /usr/bin/dpkg is not present in the image"""
- paths = [
- "/var/lib/dpkg",
- "/var/log/dpkg.log",
- ]
-
- clean_paths(root, paths, tool='/usr/bin/dpkg', always=always)
-
-
-def clean_pacman_metadata(root: Path, always: bool) -> None:
- """Remove pacman metadata if /usr/bin/pacman is not present in the image"""
- paths = [
- "/var/lib/pacman",
- "/var/cache/pacman",
- "/var/log/pacman.log"
- ]
-
- clean_paths(root, paths, tool='/usr/bin/pacman', always=always)
-
-
-def clean_package_manager_metadata(state: MkosiState) -> None:
- """Remove package manager metadata
-
- Try them all regardless of the distro: metadata is only removed if the
- package manager is present in the image.
- """
-
- if state.config.clean_package_metadata == ConfigFeature.disabled:
- return
-
- # we try then all: metadata will only be touched if any of them are in the
- # final image
- always = state.config.clean_package_metadata == ConfigFeature.enabled
- clean_dnf_metadata(state.root, always=always)
- clean_yum_metadata(state.root, always=always)
- clean_rpm_metadata(state.root, always=always)
- clean_apt_metadata(state.root, always=always)
- clean_dpkg_metadata(state.root, always=always)
- clean_pacman_metadata(state.root, always=always)
-
-
def remove_files(state: MkosiState) -> None:
"""Remove files based on user-specified patterns"""
# SPDX-License-Identifier: LGPL-2.1+
+
+import os
+
+from mkosi.config import ConfigFeature
+from mkosi.state import MkosiState
+from mkosi.tree import rmtree
+
+
+def clean_package_manager_metadata(state: MkosiState) -> None:
+ """
+ Remove package manager metadata
+
+ Try them all regardless of the distro: metadata is only removed if
+ the package manager is not present in the image.
+ """
+
+ if state.config.clean_package_metadata == ConfigFeature.disabled:
+ return
+
+ always = state.config.clean_package_metadata == ConfigFeature.enabled
+
+ for tool, paths in (("rpm", ["var/lib/rpm", "usr/lib/sysimage/rpm"]),
+ ("dpkg", ["var/lib/dpkg"]),
+ ("pacman", ["var/lib/pacman"])):
+ for bin in ("bin", "sbin"):
+ if not always and os.access(state.root / "usr" / bin / tool, mode=os.F_OK, follow_symlinks=False):
+ break
+ else:
+ for p in paths:
+ rmtree(state.root / p)