[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#73202] [PATCH v3 11/14] gnu: build: bootloader: Add efi-bootnums pr
From: |
Herman Rimm |
Subject: |
[bug#73202] [PATCH v3 11/14] gnu: build: bootloader: Add efi-bootnums procedure. |
Date: |
Thu, 26 Sep 2024 12:09:08 +0200 |
From: Lilah Tascheter <lilah@lunabee.space>
* gnu/build/bootloader.scm (atomic-copy, efi-bootnums): Add procedures.
(in-temporary-directory): Add macro.
Change-Id: I3654d160f7306bb45a78b82ea6b249ff4281f739
---
gnu/build/bootloader.scm | 48 +++++++++++++++++++++++++++++++++++++++-
1 file changed, 47 insertions(+), 1 deletion(-)
diff --git a/gnu/build/bootloader.scm b/gnu/build/bootloader.scm
index af6063a884..3934e03aee 100644
--- a/gnu/build/bootloader.scm
+++ b/gnu/build/bootloader.scm
@@ -3,6 +3,7 @@
;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
;;; Copyright © 2022 Timothy Sample <samplet@ngyro.com>
+;;; Copyright © 2024 Lilah Tascheter <lilah@lunabee.space>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -20,13 +21,25 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (gnu build bootloader)
+ #:autoload (guix build syscalls) (free-disk-space)
#:use-module (guix build utils)
#:use-module (guix utils)
#:use-module (ice-9 binary-ports)
+ #:use-module (guix diagnostics)
+ #:use-module (guix i18n)
#:use-module (ice-9 format)
+ #:use-module (ice-9 match)
+ #:use-module (ice-9 popen)
+ #:use-module (ice-9 receive)
+ #:use-module (ice-9 regex)
#:use-module (rnrs io ports)
#:use-module (rnrs io simple)
- #:export (write-file-on-device
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-26)
+ #:use-module (srfi srfi-35)
+ #:export (atomic-copy
+ in-temporary-directory
+ write-file-on-device
install-efi-loader))
@@ -34,6 +47,21 @@ (define-module (gnu build bootloader)
;;; Writing utils.
;;;
+(define (atomic-copy from to)
+ (let ((pivot (string-append to ".new")))
+ (copy-file from pivot)
+ (rename-file pivot to)))
+
+(define-syntax-rule (in-temporary-directory blocks ...)
+ "Run BLOCKS while chdir'd into a temporary directory."
+ ;; Under POSIX.1-2008, mkdtemp must make the dir with 700 perms.
+ (let* ((tmp (or (getenv "TMPDIR") "/tmp"))
+ (dir (mkdtemp (string-append tmp "/guix-bootloader.XXXXXX")))
+ (cwd (getcwd)))
+ (dynamic-wind (lambda () (chdir dir))
+ (lambda () blocks ...)
+ (lambda () (chdir cwd) (delete-file-recursively dir)))))
+
(define (write-file-on-device file size device offset)
"Write SIZE bytes from FILE to DEVICE starting at OFFSET."
(call-with-input-file file
@@ -56,6 +84,24 @@ (define (write-file-on-device file size device offset)
;;; EFI bootloader.
;;;
+;; XXX: Parsing efibootmgr output may be kinda jank. A better way may exist.
+(define (efi-bootnums efibootmgr)
+ "Returns '(path . bootnum) pairs for each EFI boot entry. bootnum is
+a string, and path is backslash-deliminated and relative to the ESP."
+ (let* ((pipe (open-pipe* OPEN_READ efibootmgr))
+ (text (get-string-all pipe))
+ (status (status:exit-val (close-pipe pipe)))
+ (bootnum-pattern
+ "^Boot([0-9a-fA-F]+).*[^A-Za-z]File\\(([^)]+)\\)$"))
+ (unless (zero? status)
+ (raise-exception
+ (formatted-message (G_ "efibootmgr exited with error code ~a")
status)))
+ (fold-matches (make-regexp bootnum-pattern regexp/newline) text '()
+ (lambda (match acc)
+ (let* ((path (match:substring match 2))
+ (bootnum (match:substring match 1)))
+ (cons (cons path bootnum) acc))))))
+
(define* (install-efi grub grub-config esp #:key targets)
"Write a self-contained GRUB EFI loader to the mounted ESP using
GRUB-CONFIG.
--
2.45.2
- [bug#73202] [PATCH v2 14/15] gnu: system: boot: Add procedure., (continued)
- [bug#73202] [PATCH v2 00/15] Preparation for bootloader rewrite., Herman Rimm, 2024/09/21
- [bug#73202] [PATCH v3 01/14] gnu: bootloader: Remove deprecated bootloader-configuration field., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 02/14] gnu: system: Remove useless boot parameters., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 03/14] gnu: tests: reconfigure: Remove bootloader install test., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 08/14] gnu: bootloader: Add bootloader-target record and infastructure., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 09/14] gnu: bootloader: Add bootloader-configurations->gexp., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 06/14] guix: utils: Add flatten and flat-map from haunt., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 07/14] guix: records: Add wrap-element procedure., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 11/14] gnu: build: bootloader: Add efi-bootnums procedure.,
Herman Rimm <=
- [bug#73202] [PATCH v3 13/14] gnu: bootloader: Match records outside the module., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 10/14] gnu: bootloader: Add device-subvol field to menu-entry record., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 05/14] guix: scripts: Rewrite reinstall-bootloader to use provenance data., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 04/14] guix: scripts: Remove unused code., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 14/14] teams: Add bootloading team., Herman Rimm, 2024/09/26
- [bug#73202] [PATCH v3 12/14] gnu: bootloader: Install any bootloader to ESP., Herman Rimm, 2024/09/26