From: Daan De Meyer Date: Wed, 26 Jul 2023 13:13:28 +0000 (+0200) Subject: Introduce pacman.py for pacman related logic X-Git-Tag: v15~55^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=466de6bbb3a8cb5c49e727f7c371878ae5c8539e;p=thirdparty%2Fmkosi.git Introduce pacman.py for pacman related logic --- diff --git a/mkosi/distributions/arch.py b/mkosi/distributions/arch.py index 7625659b1..e2e107235 100644 --- a/mkosi/distributions/arch.py +++ b/mkosi/distributions/arch.py @@ -1,17 +1,12 @@ # SPDX-License-Identifier: LGPL-2.1+ from collections.abc import Sequence -from pathlib import Path -from textwrap import dedent from mkosi.architecture import Architecture -from mkosi.config import ConfigFeature from mkosi.distributions import DistributionInstaller +from mkosi.installer.pacman import invoke_pacman, setup_pacman from mkosi.log import die -from mkosi.run import bwrap from mkosi.state import MkosiState -from mkosi.types import PathString -from mkosi.util import sort_packages class ArchInstaller(DistributionInstaller): @@ -40,103 +35,3 @@ class ArchInstaller(DistributionInstaller): return a - -def setup_pacman(state: MkosiState) -> None: - assert state.config.mirror - - if state.config.local_mirror: - server = f"Server = {state.config.local_mirror}" - else: - if state.config.architecture == Architecture.arm64: - server = f"Server = {state.config.mirror}/$arch/$repo" - else: - server = f"Server = {state.config.mirror}/$repo/os/$arch" - - if state.config.repository_key_check: - sig_level = "Required DatabaseOptional" - else: - # If we are using a single local mirror built on the fly there - # will be no signatures - sig_level = "Never" - - # Create base layout for pacman and pacman-key - state.root.joinpath("var/lib/pacman").mkdir(mode=0o755, exist_ok=True, parents=True) - - config = state.pkgmngr / "etc/pacman.conf" - if config.exists(): - return - - config.parent.mkdir(mode=0o755, exist_ok=True, parents=True) - - repos = [] - - # Testing repositories have to go before regular ones to to take precedence. - if not state.config.local_mirror: - for repo in ("core-testing", "extra-testing"): - if repo in state.config.repositories: - repos += [repo] - - repos += ["core"] - if not state.config.local_mirror: - repos += ["extra"] - - with config.open("w") as f: - f.write( - dedent( - f"""\ - [options] - SigLevel = {sig_level} - ParallelDownloads = 5 - """ - ) - ) - - for repo in repos: - f.write( - dedent( - f"""\ - - [{repo}] - {server} - """ - ) - ) - - if any(state.pkgmngr.joinpath("etc/pacman.d/").glob("*.conf")): - f.write( - dedent( - f"""\ - - Include = {state.pkgmngr}/etc/pacman.d/*.conf - """ - ) - ) - - -def invoke_pacman(state: MkosiState, packages: Sequence[str], apivfs: bool = True) -> None: - gpgdir = state.pkgmngr / "etc/pacman.d/gnupg/" - gpgdir = gpgdir if gpgdir.exists() else Path("/etc/pacman.d/gnupg/") - - cmdline: list[PathString] = [ - "pacman", - "--config", state.pkgmngr / "etc/pacman.conf", - "--root", state.root, - "--logfile", "/dev/null", - "--cachedir", state.cache_dir, - "--gpgdir", gpgdir, - "--hookdir", state.root / "etc/pacman.d/hooks", - "--arch", state.installer.architecture(state.config.architecture), - "--color", "auto", - "--noconfirm", - "--needed", - "-Sy", *sort_packages(packages), - ] - - # If we're generating a bootable image, we'll do so with a prebuilt initramfs, so no need for an - # initramfs generator. - if state.config.bootable != ConfigFeature.disabled: - cmdline += ["--assume-installed", "initramfs"] - - bwrap(cmdline, - apivfs=state.root if apivfs else None, - env=dict(KERNEL_INSTALL_BYPASS="1") | state.config.environment) diff --git a/mkosi/installer/pacman.py b/mkosi/installer/pacman.py new file mode 100644 index 000000000..5dda1d4d2 --- /dev/null +++ b/mkosi/installer/pacman.py @@ -0,0 +1,111 @@ +# SPDX-License-Identifier: LGPL-2.1+ +import textwrap +from collections.abc import Sequence +from pathlib import Path + +from mkosi.architecture import Architecture +from mkosi.config import ConfigFeature +from mkosi.run import bwrap +from mkosi.state import MkosiState +from mkosi.util import sort_packages + + +def setup_pacman(state: MkosiState) -> None: + assert state.config.mirror + + if state.config.local_mirror: + server = f"Server = {state.config.local_mirror}" + else: + if state.config.architecture == Architecture.arm64: + server = f"Server = {state.config.mirror}/$arch/$repo" + else: + server = f"Server = {state.config.mirror}/$repo/os/$arch" + + if state.config.repository_key_check: + sig_level = "Required DatabaseOptional" + else: + # If we are using a single local mirror built on the fly there + # will be no signatures + sig_level = "Never" + + # Create base layout for pacman and pacman-key + state.root.joinpath("var/lib/pacman").mkdir(mode=0o755, exist_ok=True, parents=True) + + config = state.pkgmngr / "etc/pacman.conf" + if config.exists(): + return + + config.parent.mkdir(mode=0o755, exist_ok=True, parents=True) + + repos = [] + + # Testing repositories have to go before regular ones to to take precedence. + if not state.config.local_mirror: + for repo in ("core-testing", "extra-testing"): + if repo in state.config.repositories: + repos += [repo] + + repos += ["core"] + if not state.config.local_mirror: + repos += ["extra"] + + with config.open("w") as f: + f.write( + textwrap.dedent( + f"""\ + [options] + SigLevel = {sig_level} + ParallelDownloads = 5 + """ + ) + ) + + for repo in repos: + f.write( + textwrap.dedent( + f"""\ + + [{repo}] + {server} + """ + ) + ) + + if any(state.pkgmngr.joinpath("etc/pacman.d/").glob("*.conf")): + f.write( + textwrap.dedent( + f"""\ + + Include = {state.pkgmngr}/etc/pacman.d/*.conf + """ + ) + ) + + +def invoke_pacman(state: MkosiState, packages: Sequence[str], apivfs: bool = True) -> None: + gpgdir = state.pkgmngr / "etc/pacman.d/gnupg/" + gpgdir = gpgdir if gpgdir.exists() else Path("/etc/pacman.d/gnupg/") + + cmdline = [ + "pacman", + f"--config={state.pkgmngr / 'etc/pacman.conf'}", + f"--root={state.root}", + "--logfile=/dev/null", + f"--cachedir={state.cache_dir}", + f"--gpgdir={gpgdir}", + f"--hookdir={state.root / 'etc/pacman.d/hooks'}", + f"--arch={state.installer.architecture(state.config.architecture)}", + "--color", "auto", + "--noconfirm", + "--needed", + "-Sy", *sort_packages(packages), + ] + + # If we're generating a bootable image, we'll do so with a prebuilt initramfs, so no need for an + # initramfs generator. + if state.config.bootable != ConfigFeature.disabled: + cmdline += ["--assume-installed", "initramfs"] + + bwrap(cmdline, + apivfs=state.root if apivfs else None, + env=dict(KERNEL_INSTALL_BYPASS="1") | state.config.environment)