From 53f844361df57d480480b5e0ab0f35d2788ebf6a Mon Sep 17 00:00:00 2001
From: Andrew Ammerlaan <andrewammerl...@gentoo.org>
Date: Tue, 25 Jun 2024 15:08:49 +0200
Subject: [PATCH] mount-boot.eclass: check for ESP as well as /boot, split
 eclass

This eclass is used by when the dist-kernel has to re-installed.

Depending on the configuration of sys-kernel/installkernel, the files may be
installed to /boot or to the EFI System partition. Therefore, extend this eclass
to check if the ESP is mounted read-write as well on UEFI platforms.

Split off the main functions into a separate "inherit-safe" eclass so we can
safely use it in dist-kernel-utils.eclass and linux-mod-r1.eclass.

Signed-off-by: Andrew Ammerlaan <andrewammerl...@gentoo.org>
---
 eclass/mount-boot-utils.eclass | 109 +++++++++++++++++++++++++++++++++
 eclass/mount-boot.eclass       |  81 +++---------------------
 2 files changed, 118 insertions(+), 72 deletions(-)
 create mode 100644 eclass/mount-boot-utils.eclass

diff --git a/eclass/mount-boot-utils.eclass b/eclass/mount-boot-utils.eclass
new file mode 100644
index 0000000000000..06ea2254b0013
--- /dev/null
+++ b/eclass/mount-boot-utils.eclass
@@ -0,0 +1,109 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+# @ECLASS: mount-boot-utils.eclass
+# @MAINTAINER:
+# base-sys...@gentoo.org
+# @SUPPORTED_EAPIS: 6 7 8
+# @BLURB: functions for packages that install files into /boot
+# @DESCRIPTION:
+# This eclass is really only useful for bootloaders and kernel installation.
+#
+# If the live system has a separate /boot partition or ESP configured, then this +# function tries to ensure that it's mounted in rw mode, exiting with an error +# if it can't. It does nothing if /boot and ESP isn't a separate partition.
+#
+# This eclass provides the functions used by mount-boot.eclass in an "inherit- +# safe" way. This allows these functions to be used in other eclasses cleanly.
+
+case ${EAPI} in
+       6|7|8) ;;
+       *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
+esac
+
+# @FUNCTION: mount-boot_is_disabled
+# @INTERNAL
+# @DESCRIPTION:
+# Detect whether the current environment/build settings are such that we do not
+# want to mess with any mounts.
+mount-boot_is_disabled() {
+ # Since this eclass only deals with /boot, skip things when EROOT is active.
+       if [[ ${EROOT:-/} != / ]] ; then
+               return 0
+       fi
+
+       # If we're only building a package, then there's no need to check 
things.
+       if [[ ${MERGE_TYPE} == buildonly ]] ; then
+               return 0
+       fi
+
+       # The user wants us to leave things be.
+       if [[ -n ${DONT_MOUNT_BOOT} ]] ; then
+               return 0
+       fi
+
+       # OK, we want to handle things ourselves.
+       return 1
+}
+
+# @FUNCTION: mount-boot_check_status
+# @INTERNAL
+# @DESCRIPTION:
+# Check if /boot and ESP is sane, i.e., mounted as read-write if on a separate
+# partition.  Die if conditions are not fulfilled.  If nonfatal is used,
+# the function will return a non-zero status instead.
+mount-boot_check_status() {
+       # Get out fast if possible.
+       mount-boot_is_disabled && return 0
+
+       local partition=
+       local part_is_not_mounted=
+       local part_is_read_only=
+       local candidates=( /boot )
+
+       # If system is booted with UEFI, check for ESP as well
+       if [[ -d /sys/firmware/efi ]]; then
+               # Use same candidates for ESP as installkernel and eclean-kernel
+               candidates+=( /efi /boot/efi /boot/EFI )
+       fi
+
+       for partition in ${candidates[@]}; do
+               # note that /dev/BOOT is in the Gentoo default /etc/fstab file
+ local fstabstate=$(awk "!/^[[:blank:]]*#|^\/dev\/BOOT/ && \$2 == \"${partition}\" \
+                       { print 1; exit }" /etc/fstab || die "awk failed")
+
+               if [[ -z ${fstabstate} ]] ; then
+                       einfo "Assuming you do not have a separate ${partition} 
partition."
+               else
+                       local procstate=$(awk "\$2 == \"${partition}\" { split(\$4, a, 
\",\"); \
+                               for (i in a) if (a[i] ~ /^r[ow]\$/) { print a[i]; 
break }; exit }" \
+                               /proc/mounts || die "awk failed")
+
+                       if [[ -z ${procstate} ]] ; then
+                               eerror "Your ${partition} partition is not 
mounted"
+                               eerror "Please mount it and retry."
+                               die -n "${partition} not mounted"
+                               part_is_not_mounted=1
+                       else
+                               if [[ ${procstate} == ro ]] ; then
+                                       eerror "Your ${partition} partition, was 
detected as being mounted," \
+                                               "but is mounted read-only."
+                                       eerror "Please remount it as read-write and 
retry."
+                                       die -n "${partition} mounted read-only"
+                                       part_is_read_only=1
+                               else
+                                       einfo "Your ${partition} partition was 
detected as being mounted."
+                                       einfo "Files will be installed there for 
${PN} to function correctly."
+                               fi
+                       fi
+               fi
+       done
+
+       if [[ -n ${part_is_not_mounted} ]]; then
+               return 1
+       elif [[ -n ${part_is_read_only} ]]; then
+               return 2
+       else
+               return 0
+       fi
+}
diff --git a/eclass/mount-boot.eclass b/eclass/mount-boot.eclass
index 73beb9adea670..f4626ccb97a9c 100644
--- a/eclass/mount-boot.eclass
+++ b/eclass/mount-boot.eclass
@@ -1,4 +1,4 @@
-# Copyright 1999-2023 Gentoo Authors
+# Copyright 1999-2024 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2

 # @ECLASS: mount-boot.eclass
@@ -7,84 +7,21 @@
 # @SUPPORTED_EAPIS: 6 7 8
 # @BLURB: functions for packages that install files into /boot
 # @DESCRIPTION:
-# This eclass is really only useful for bootloaders.
+# This eclass is really only useful for bootloaders and kernel installation.
 #
-# If the live system has a separate /boot partition configured, then this
-# function tries to ensure that it's mounted in rw mode, exiting with an
-# error if it can't.  It does nothing if /boot isn't a separate partition.
+# If the live system has a separate /boot partition or ESP configured, then this +# function tries to ensure that it's mounted in rw mode, exiting with an error +# if it can't. It does nothing if /boot and ESP isn't a separate partition.
+#
+# This eclass exports the functions provided by mount-boot-utils.eclass to
+# the pkg_pretend and pkg_{pre,post}{inst,rm} phases.

 case ${EAPI} in
        6|7|8) ;;
        *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
 esac

-# @FUNCTION: mount-boot_is_disabled
-# @INTERNAL
-# @DESCRIPTION:
-# Detect whether the current environment/build settings are such that we do not
-# want to mess with any mounts.
-mount-boot_is_disabled() {
- # Since this eclass only deals with /boot, skip things when EROOT is active.
-       if [[ ${EROOT:-/} != / ]] ; then
-               return 0
-       fi
-
-       # If we're only building a package, then there's no need to check 
things.
-       if [[ ${MERGE_TYPE} == buildonly ]] ; then
-               return 0
-       fi
-
-       # The user wants us to leave things be.
-       if [[ -n ${DONT_MOUNT_BOOT} ]] ; then
-               return 0
-       fi
-
-       # OK, we want to handle things ourselves.
-       return 1
-}
-
-# @FUNCTION: mount-boot_check_status
-# @INTERNAL
-# @DESCRIPTION:
-# Check if /boot is sane, i.e., mounted as read-write if on a separate
-# partition.  Die if conditions are not fulfilled.  If nonfatal is used,
-# the function will return a non-zero status instead.
-mount-boot_check_status() {
-       # Get out fast if possible.
-       mount-boot_is_disabled && return 0
-
-       # note that /dev/BOOT is in the Gentoo default /etc/fstab file
-       local fstabstate=$(awk '!/^[[:blank:]]*#|^\/dev\/BOOT/ && $2 == "/boot" 
\
-               { print 1; exit }' /etc/fstab || die "awk failed")
-
-       if [[ -z ${fstabstate} ]] ; then
-               einfo "Assuming you do not have a separate /boot partition."
-               return 0
-       fi
-
-       local procstate=$(awk '$2 == "/boot" { split($4, a, ","); \
-               for (i in a) if (a[i] ~ /^r[ow]$/) { print a[i]; break }; exit 
}' \
-               /proc/mounts || die "awk failed")
-
-       if [[ -z ${procstate} ]] ; then
-               eerror "Your boot partition is not mounted at /boot."
-               eerror "Please mount it and retry."
-               die -n "/boot not mounted"
-               return 1
-       fi
-
-       if [[ ${procstate} == ro ]] ; then
-               eerror "Your boot partition, detected as being mounted at 
/boot," \
-                       "is read-only."
-               eerror "Please remount it as read-write and retry."
-               die -n "/boot mounted read-only"
-               return 2
-       fi
-
-       einfo "Your boot partition was detected as being mounted at /boot."
-       einfo "Files will be installed there for ${PN} to function correctly."
-       return 0
-}
+inherit mount-boot-utils

 mount-boot_pkg_pretend() {
        mount-boot_check_status

Reply via email to