with complete_step(
f"Installing extra packages for {context.config.distribution.installer.pretty_name()}"
):
- context.config.distribution.installer.package_manager(context.config).install(context, packages)
+ context.config.distribution.installer.install_packages(context, packages)
else:
if context.config.overlay or context.config.output_format.is_extension_image():
if packages:
(context.root / "boot/loader/entries.srel").write_text("type1\n")
if packages:
- context.config.distribution.installer.package_manager(context.config).install(
- context, packages
- )
+ context.config.distribution.installer.install_packages(context, packages)
for f in (
"var/lib/systemd/random-seed",
),
setup_build_overlay(context),
):
- context.config.distribution.installer.package_manager(context.config).install(
- context, context.config.build_packages
- )
+ context.config.distribution.installer.install_packages(context, context.config.build_packages)
def install_volatile_packages(context: Context) -> None:
with complete_step(
f"Installing volatile packages for {context.config.distribution.installer.pretty_name()}"
):
- context.config.distribution.installer.package_manager(context.config).install(
+ context.config.distribution.installer.install_packages(
context, context.config.volatile_packages, allow_downgrade=True
)
import enum
import importlib
import urllib.parse
+from collections.abc import Sequence
from pathlib import Path
from typing import TYPE_CHECKING, Optional
def install(cls, context: "Context") -> None:
raise NotImplementedError
+ @classmethod
+ def install_packages(
+ cls,
+ context: "Context",
+ packages: Sequence[str],
+ *,
+ apivfs: bool = True,
+ allow_downgrade: bool = False,
+ ) -> None:
+ return cls.package_manager(context.config).install(
+ context,
+ packages,
+ apivfs=apivfs,
+ allow_downgrade=allow_downgrade,
+ )
+
@classmethod
def filesystem(cls) -> str:
return "ext4"
@classmethod
def install(cls, context: Context) -> None:
- Pacman.install(context, ["filesystem"], apivfs=False)
+ cls.install_packages(context, ["filesystem"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[PacmanRepository]:
@classmethod
def install(cls, context: Context) -> None:
- Dnf.install(context, ["filesystem", "azurelinux-release"], apivfs=False)
+ cls.install_packages(context, ["filesystem", "azurelinux-release"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[RpmRepository]:
@classmethod
def install(cls, context: Context) -> None:
- Dnf.install(context, ["basesystem"], apivfs=False)
+ cls.install_packages(context, ["basesystem"], apivfs=False)
@classmethod
def architecture(cls, arch: Architecture) -> str:
# SPDX-License-Identifier: LGPL-2.1-or-later
-import itertools
import json
import tempfile
-from collections.abc import Iterable
+from collections.abc import Iterable, Sequence
from pathlib import Path
from typing import cast
return Apt
@classmethod
- def repositories(cls, context: Context, local: bool = True) -> Iterable[AptRepository]:
+ def repositories(cls, context: Context, for_image: bool = False) -> Iterable[AptRepository]:
types = ("deb", "deb-src")
components = ("main", *context.config.repositories)
+ mirror = None if for_image else context.config.mirror
+ snapshot = None if for_image else context.config.snapshot
- if context.config.local_mirror and local:
+ if context.config.local_mirror and not for_image:
yield AptRepository(
types=("deb",),
url=context.config.local_mirror,
)
return
- if context.config.mirror:
- mirror = context.config.mirror
- elif context.config.snapshot:
+ if mirror:
+ pass
+ elif snapshot:
mirror = "https://snapshot.debian.org"
else:
mirror = "http://deb.debian.org"
- if context.config.snapshot:
- url = join_mirror(mirror, f"archive/debian/{context.config.snapshot}")
+ if snapshot:
+ url = join_mirror(mirror, f"archive/debian/{snapshot}")
else:
url = join_mirror(mirror, "debian")
)
# Debug repos are typically not mirrored.
- if context.config.snapshot:
- url = join_mirror(mirror, f"archive/debian-debug/{context.config.snapshot}")
+ if snapshot:
+ url = join_mirror(mirror, f"archive/debian-debug/{snapshot}")
else:
url = join_mirror(mirror, "debian-debug")
if context.config.release in ("unstable", "sid"):
return
- if not context.config.snapshot:
+ if not snapshot:
yield AptRepository(
types=types,
url=join_mirror(mirror, "debian"),
)
# Security updates repos are never mirrored.
- if context.config.snapshot:
- url = join_mirror(mirror, f"archive/debian-security/{context.config.snapshot}")
+ if snapshot:
+ url = join_mirror(mirror, f"archive/debian-security/{snapshot}")
else:
url = join_mirror(mirror, "debian-security")
# Finally, run apt to properly install packages in the chroot without having to worry that maintainer
# scripts won't find basic tools that they depend on.
- Apt.install(context, [Path(deb).name.partition("_")[0].removesuffix(".deb") for deb in essential])
+ cls.install_packages(
+ context, [Path(deb).name.partition("_")[0].removesuffix(".deb") for deb in essential]
+ )
fixup_os_release(context)
- if (
- "apt" in itertools.chain(context.config.packages, context.config.volatile_packages)
- or (context.root / "usr/bin/apt").exists()
- ):
- install_apt_sources(context, cls.repositories(context, local=False))
+ @classmethod
+ def install_packages(
+ cls,
+ context: Context,
+ packages: Sequence[str],
+ *,
+ apivfs: bool = True,
+ allow_downgrade: bool = False,
+ ) -> None:
+ super().install_packages(context, packages, apivfs=apivfs, allow_downgrade=allow_downgrade)
+
+ if "apt" in packages:
+ install_apt_sources(context, cls.repositories(context, for_image=True))
@classmethod
def architecture(cls, arch: Architecture) -> str:
@classmethod
def install(cls, context: Context) -> None:
- Dnf.install(context, ["basesystem"], apivfs=False)
+ cls.install_packages(context, ["basesystem"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[RpmRepository]:
return Distribution.kali
@classmethod
- def repositories(cls, context: Context, local: bool = True) -> Iterable[AptRepository]:
- if context.config.snapshot:
+ def repositories(cls, context: Context, for_image: bool = False) -> Iterable[AptRepository]:
+ mirror = None if for_image else context.config.mirror
+ if not mirror:
+ mirror = "http://http.kali.org/kali"
+
+ if context.config.snapshot and not for_image:
die(f"Snapshot= is not supported for {cls.pretty_name()}")
- if context.config.local_mirror and local:
+ if context.config.local_mirror and not for_image:
yield AptRepository(
types=("deb",),
url=context.config.local_mirror,
yield AptRepository(
types=("deb", "deb-src"),
- url=context.config.mirror or "http://http.kali.org/kali",
+ url=mirror,
suite=context.config.release,
components=("main", *context.config.repositories),
signedby=Path("/usr/share/keyrings/kali-archive-keyring.gpg"),
from mkosi.config import Architecture
from mkosi.context import Context
from mkosi.distribution import Distribution, fedora, join_mirror
-from mkosi.installer.dnf import Dnf
from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
from mkosi.log import die
@classmethod
def install(cls, context: Context) -> None:
- Dnf.install(context, ["filesystem"], apivfs=False)
+ cls.install_packages(context, ["filesystem"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[RpmRepository]:
from mkosi.config import Architecture
from mkosi.context import Context
from mkosi.distribution import Distribution, fedora, join_mirror
-from mkosi.installer.dnf import Dnf
from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
from mkosi.log import die
@classmethod
def install(cls, context: Context) -> None:
- Dnf.install(context, ["filesystem"], apivfs=False)
+ cls.install_packages(context, ["filesystem"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[RpmRepository]:
if not any(p.endswith("-release") for p in context.config.packages):
packages += ["openSUSE-release"]
- cls.package_manager(context.config).install(context, packages, apivfs=False)
+ cls.install_packages(context, packages, apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[RpmRepository]:
(context.root / "usr" / dir).mkdir(parents=True, exist_ok=True)
(context.root / dir).symlink_to(f"usr/{dir}")
- Apk.install(context, ["postmarketos-baselayout", "postmarketos-release"], apivfs=False)
+ cls.install_packages(context, ["postmarketos-baselayout", "postmarketos-release"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[ApkRepository]:
return Distribution.debian
@classmethod
- def repositories(cls, context: Context, local: bool = True) -> Iterable[AptRepository]:
+ def repositories(cls, context: Context, for_image: bool = False) -> Iterable[AptRepository]:
types = ("deb", "deb-src")
+ mirror = None if for_image else context.config.mirror
+ snapshot = None if for_image else context.config.snapshot
components = (
"main",
*context.config.repositories,
)
- if context.config.local_mirror and local:
+ if context.config.local_mirror and not for_image:
yield AptRepository(
types=("deb",),
url=context.config.local_mirror,
)
return
- if context.config.architecture.is_x86_variant():
- mirror = context.config.mirror or "http://archive.ubuntu.com/ubuntu"
+ if mirror:
+ pass
+ elif context.config.architecture.is_x86_variant():
+ mirror = "http://archive.ubuntu.com/ubuntu"
else:
- mirror = context.config.mirror or "http://ports.ubuntu.com"
+ mirror = "http://ports.ubuntu.com"
signedby = Path("/usr/share/keyrings/ubuntu-archive-keyring.gpg")
suite=context.config.release,
components=components,
signedby=signedby,
- snapshot=context.config.snapshot,
+ snapshot=snapshot,
)
yield AptRepository(
suite=f"{context.config.release}-updates",
components=components,
signedby=signedby,
- snapshot=context.config.snapshot,
+ snapshot=snapshot,
)
# Security updates repos are never mirrored. But !x86 are on the ports server.
suite=f"{context.config.release}-security",
components=components,
signedby=signedby,
- snapshot=context.config.snapshot,
+ snapshot=snapshot,
)
@classmethod