forked from Mirror/pmbootstrap
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>
81 lines
2.9 KiB
Python
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"])
|