aboutsummaryrefslogtreecommitdiff
path: root/installer/lib/common.sh
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-04-27 13:00:26 -0500
committerCraig Jennings <c@cjennings.net>2026-04-27 13:00:26 -0500
commit26f3f823ac17940a1b0153619f6140f45d856e33 (patch)
treebdb02b6fc0c110ce6e59ffd379521068a446c45a /installer/lib/common.sh
parent8c69aaaff13da3b7d1d24ed34975e8c5b30409e6 (diff)
downloadarchangel-26f3f823ac17940a1b0153619f6140f45d856e33.tar.gz
archangel-26f3f823ac17940a1b0153619f6140f45d856e33.zip
refactor: verify GRUB_CMDLINE_LINUX seds via prepend_grub_cmdline_linux helper
Audited the ~10 silent sed -i sites in the installer against the verification-after pattern that landed for sshd_config last session. Triaged each by failure mode. The two GRUB_CMDLINE_LINUX seds in lib/btrfs.sh have a real silent-failure risk. If /etc/default/grub is missing or malformed and the sed pattern doesn't match, nothing happens. The kernel boots without cryptdevice=. The system can't unlock LUKS at boot. Added prepend_grub_cmdline_linux to lib/common.sh. Same shape as enable_sshd_root_login (sed, then grep, then error if the line wasn't modified). Replaced the two inline seds with helper calls. The HOOKS= seds in installer/archangel and lib/btrfs.sh (six total) don't need verification. A missing HOOKS= line makes mkinitcpio -P fail loudly downstream, so silent-replace failure can't reach a booted system. Added a one-line audit-rationale comment at each of the three locations so the next reader doesn't re-litigate the decision. The FILES= sed at lib/btrfs.sh:213 already self-heals via a sed-then-grep-then-append pattern, so no behavior change there. Filed a separate follow-up to lift that pattern into a named helper for clarity. Bats: 142 → 146. Four new tests in test_common.bats cover normal (empty cmdline, existing cmdline preserved, other lines preserved) and error (missing GRUB_CMDLINE_LINUX line). Lint clean.
Diffstat (limited to 'installer/lib/common.sh')
-rw-r--r--installer/lib/common.sh18
1 files changed, 18 insertions, 0 deletions
diff --git a/installer/lib/common.sh b/installer/lib/common.sh
index 3040799..dfeb245 100644
--- a/installer/lib/common.sh
+++ b/installer/lib/common.sh
@@ -302,3 +302,21 @@ enable_sshd_root_login() {
grep -q '^PermitRootLogin yes$' "$config_file" \
|| error "PermitRootLogin not set in $config_file (no matching line to replace)"
}
+
+#############################
+# GRUB Configuration
+#############################
+
+# Prepend a string just inside the GRUB_CMDLINE_LINUX="..." quotes in
+# /etc/default/grub. Errors if the line isn't present in the file.
+# Silently doing nothing here would leave the kernel without the
+# parameter — for cryptdevice= that means the system can't unlock the
+# root partition at boot, so we want a loud failure during install
+# rather than an unbootable system after first reboot.
+prepend_grub_cmdline_linux() {
+ local addition="$1"
+ local config_file="$2"
+ sed -i "s|^GRUB_CMDLINE_LINUX=\"|GRUB_CMDLINE_LINUX=\"${addition}|" "$config_file"
+ grep -qF "GRUB_CMDLINE_LINUX=\"${addition}" "$config_file" \
+ || error "GRUB_CMDLINE_LINUX not modified in $config_file (line missing or pattern unmatched)"
+}