aboutsummaryrefslogtreecommitdiff
path: root/src/property/grub.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'src/property/grub.lisp')
-rw-r--r--src/property/grub.lisp46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/property/grub.lisp b/src/property/grub.lisp
new file mode 100644
index 0000000..45b19cd
--- /dev/null
+++ b/src/property/grub.lisp
@@ -0,0 +1,46 @@
+;;; Consfigurator -- Lisp declarative configuration management system
+
+;;; Copyright (C) 2021 Sean Whitton <spwhitton@spwhitton.name>
+
+;;; This file is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3, or (at your option)
+;;; any later version.
+
+;;; This file is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+(in-package :consfigurator.property.grub)
+(named-readtables:in-readtable :consfigurator)
+
+(defmethod install-bootloader
+ ((type (eql 'grub)) (volume opened-volume) running-on-target
+ &key (target "i386-pc") force-extra-removable)
+ (mrun :inform "update-initramfs" "-u")
+ (let ((os-prober (and (not running-on-target)
+ (remote-exists-p "/etc/grub.d/30_os-prober"))))
+ ;; work around Debian bug #802717
+ (when os-prober (file:has-mode "/etc/grub.d/30_os-prober" #o644))
+ (mrun :inform "update-grub")
+ (when os-prober (file:has-mode "/etc/grub.d/30_os-prober" #o755)))
+ (mrun :inform "grub-install" (strcat "--target=" target)
+ (and (string-suffix-p target "-efi") (not running-on-target)
+ "--no-nvram")
+ (and force-extra-removable "--force-extra-removable")
+ (device-file volume))
+ (mrun "sync"))
+
+(defmethod install-bootloader-binaries
+ ((type (eql 'grub)) volume &key (target "i386-pc") &allow-other-keys)
+ `(os:etypecase
+ (debianlike
+ (apt:installed
+ "initramfs-tools"
+ ,(eswitch (target :test #'string=)
+ ("i386-pc" "grub-pc")
+ ("x86_64-efi" "grub-efi-amd64"))))))