From: Daan De Meyer Date: Wed, 20 Mar 2024 08:13:16 +0000 (+0100) Subject: Only set some environment variables when invoking package managers X-Git-Tag: v23~70 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c5b50cda476e444344f81c0e9071502f259ffabf;p=thirdparty%2Fmkosi.git Only set some environment variables when invoking package managers We really only want to set KERNEL_INSTALL_BYPASS and SYSTEMD_HWDB_UPDATE_BYPASS when we're invoking package managers so let's make sure those are only set when invoking package managers. Let's also allow users to override both all of these and let's not set them when Bootable=no so distros can do whatever they want if mkosi's bootable image logic is not being used. --- diff --git a/mkosi/config.py b/mkosi/config.py index c80d507d3..d100dd346 100644 --- a/mkosi/config.py +++ b/mkosi/config.py @@ -3484,8 +3484,6 @@ def load_kernel_command_line_extra(args: argparse.Namespace) -> list[str]: def load_environment(args: argparse.Namespace) -> dict[str, str]: env = { "SYSTEMD_TMPFILES_FORCE_SUBVOL": "0", - "KERNEL_INSTALL_BYPASS": "1", - "SYSTEMD_HWDB_UPDATE_BYPASS": "1", "TERM": finalize_term(), } diff --git a/mkosi/installer/__init__.py b/mkosi/installer/__init__.py index 04340b427..10906108b 100644 --- a/mkosi/installer/__init__.py +++ b/mkosi/installer/__init__.py @@ -28,6 +28,23 @@ class PackageManager: def scripts(cls, context: Context) -> dict[str, list[PathString]]: return {} + @classmethod + def finalize_environment(cls, context: Context) -> dict[str, str]: + env = { + "HOME": "/", # Make sure rpm doesn't pick up ~/.rpmmacros and ~/.rpmrc. + } + + if "SYSTEMD_HWDB_UPDATE_BYPASS" not in context.config.environment: + env["SYSTEMD_HWDB_UPDATE_BYPASS"] = "1" + + if ( + "KERNEL_INSTALL_BYPASS" not in context.config.environment and + context.config.bootable != ConfigFeature.disabled + ): + env["KERNEL_INSTALL_BYPASS"] = "1" + + return env + @classmethod def mounts(cls, context: Context) -> list[Mount]: mounts = [ diff --git a/mkosi/installer/apt.py b/mkosi/installer/apt.py index fab81a8ec..c8c007857 100644 --- a/mkosi/installer/apt.py +++ b/mkosi/installer/apt.py @@ -5,7 +5,7 @@ from collections.abc import Iterable, Sequence from pathlib import Path from typing import NamedTuple, Optional -from mkosi.config import Config +from mkosi.config import Config, ConfigFeature from mkosi.context import Context from mkosi.installer import PackageManager from mkosi.log import die @@ -110,16 +110,26 @@ class Apt(PackageManager): for repo in repos: f.write(str(repo)) + @classmethod + def finalize_environment(cls, context: Context) -> dict[str, str]: + env = { + "APT_CONFIG": "/etc/apt.conf", + "DEBIAN_FRONTEND" : "noninteractive", + "DEBCONF_INTERACTIVE_SEEN": "true", + } + + if "INITRD" not in context.config.environment and context.config.bootable != ConfigFeature.disabled: + env["INITRD"] = "No" + + return super().finalize_environment(context) | env + @classmethod def cmd(cls, context: Context, command: str) -> list[PathString]: debarch = context.config.distribution.architecture(context.config.architecture) cmdline: list[PathString] = [ "env", - "APT_CONFIG=/etc/apt.conf", - "DEBIAN_FRONTEND=noninteractive", - "DEBCONF_INTERACTIVE_SEEN=true", - "INITRD=No", + *([f"{k}={v}" for k, v in cls.finalize_environment(context).items()]), command, "-o", f"APT::Architecture={debarch}", "-o", f"APT::Architectures={debarch}", diff --git a/mkosi/installer/dnf.py b/mkosi/installer/dnf.py index 2344ec926..0c17e8776 100644 --- a/mkosi/installer/dnf.py +++ b/mkosi/installer/dnf.py @@ -100,7 +100,7 @@ class Dnf(PackageManager): cmdline: list[PathString] = [ "env", - "HOME=/", # Make sure rpm doesn't pick up ~/.rpmmacros and ~/.rpmrc. + *([f"{k}={v}" for k, v in cls.finalize_environment(context).items()]), dnf, "--assumeyes", "--best", diff --git a/mkosi/installer/pacman.py b/mkosi/installer/pacman.py index e700cd8f6..58a2b99d4 100644 --- a/mkosi/installer/pacman.py +++ b/mkosi/installer/pacman.py @@ -127,6 +127,8 @@ class Pacman(PackageManager): @classmethod def cmd(cls, context: Context) -> list[PathString]: return [ + "env", + *([f"{k}={v}" for k, v in cls.finalize_environment(context).items()]), "pacman", "--root=/buildroot", "--logfile=/dev/null", diff --git a/mkosi/installer/zypper.py b/mkosi/installer/zypper.py index 329059b9e..eb707d244 100644 --- a/mkosi/installer/zypper.py +++ b/mkosi/installer/zypper.py @@ -98,12 +98,15 @@ class Zypper(PackageManager): f.write("\n") + @classmethod + def finalize_environment(cls, context: Context) -> dict[str, str]: + return super().finalize_environment(context) | {"ZYPP_CONF": "/etc/zypp/zypp.conf"} + @classmethod def cmd(cls, context: Context) -> list[PathString]: return [ "env", - "ZYPP_CONF=/etc/zypp/zypp.conf", - "HOME=/", + *([f"{k}={v}" for k, v in cls.finalize_environment(context).items()]), "zypper", "--installroot=/buildroot", "--cache-dir=/var/cache/zypp",