pmbootstrap-meow/pmb/chroot/other.py
Caleb Connolly cb6cd3bc4c
chroot: apk: safety net when chroot unitialized (MR 2252)
We recently changed how we manage chroots, requiring the user (of the
chroot) to initialize it before doing stuff like installing packages.

There are however still certain edgecases in pmbootstrap where this
doesn't get done (for example qemu/run.py would attempt to install the
kernel package for the device, but we don't initialize the rootfs chroot
in QEMU since that doesn't make sense to do). Check for and catch this
situation explicitly so we don't ruin someones day, but still be loud
about it so we can hopefully catch the remaining instances of this.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:42 +02:00

81 lines
2.9 KiB
Python

# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import os
from pmb.core.context import get_context
from pmb.helpers import logging
from pathlib import Path
import pmb.chroot.apk
from pmb.types import PmbArgs
import pmb.install
from pmb.core import Chroot
def kernel_flavor_installed(chroot: Chroot, autoinstall=True):
"""
Get installed kernel flavor. Optionally install the device's kernel
beforehand.
:param suffix: the chroot suffix, e.g. "native" or "rootfs_qemu-amd64"
:param autoinstall: install the device's kernel if it is not installed
:returns: * string with the installed kernel flavor,
e.g. ["postmarketos-qcom-sdm845"]
* None if no kernel is installed
"""
# Automatically install the selected kernel
if autoinstall:
if not chroot.is_mounted():
pmb.chroot.init(chroot)
config = get_context().config
packages = ([f"device-{config.device}"] +
pmb.install.get_kernel_package(config))
pmb.chroot.apk.install(packages, chroot)
glob_result = list((chroot / "usr/share/kernel").glob("*"))
# There should be only one directory here
return glob_result[0].name if glob_result else None
# FIXME: this function has ONE user, does it need to exist?
def tempfolder(path: Path, chroot: Chroot=Chroot.native()):
"""
Create a temporary folder inside the chroot that belongs to "user".
The folder gets deleted, if it already exists.
:param path: of the temporary folder inside the chroot
:returns: the path
"""
if chroot / path:
pmb.chroot.root(["rm", "-r", path])
pmb.chroot.user(["mkdir", "-p", path])
return path
def copy_xauthority(args: PmbArgs):
"""
Copy the host system's Xauthority file to the pmos user inside the chroot,
so we can start X11 applications from there.
"""
# Check $DISPLAY
logging.info("(native) copy host Xauthority")
if not os.environ.get("DISPLAY"):
raise RuntimeError("Your $DISPLAY variable is not set. If you have an"
" X11 server running as your current user, try"
" 'export DISPLAY=:0' and run your last"
" pmbootstrap command again.")
# Check $XAUTHORITY
original = os.environ.get("XAUTHORITY")
if not original:
original = os.path.join(os.environ['HOME'], '.Xauthority')
if not os.path.exists(original):
raise RuntimeError("Could not find your Xauthority file, try to export"
" your $XAUTHORITY correctly. Looked here: " +
original)
# Copy to chroot and chown
copy = Chroot.native() / "home/pmos/.Xauthority"
if os.path.exists(copy):
pmb.helpers.run.root(["rm", copy])
pmb.helpers.run.root(["cp", original, copy])
pmb.chroot.root(["chown", "pmos:pmos", "/home/pmos/.Xauthority"])