From 8c69aaaff13da3b7d1d24ed34975e8c5b30409e6 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Mon, 27 Apr 2026 12:45:48 -0500 Subject: refactor: consolidate installer defaults and FILESYSTEM validation into config.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The installer had three sites touching FILESYSTEM: a top-level default in the monolith, a re-default block in gather_input, and a runtime validation block also in gather_input. The same scattering existed for LOCALE, KEYMAP, ENABLE_SSH, and NO_ENCRYPT. A future contributor changing one site wouldn't have known the other two existed. Move all five defaults into the lib/config.sh declarations so config.sh is the single source of truth. Add validate_filesystem() in lib/config.sh and call it from main() between check_config and gather_input, so a typo in a config file's FILESYSTEM= fails fast before any install action runs. The behavior change is stricter. An empty FILESYSTEM in a config file used to be silently defaulted to zfs, now it errors. Interactive mode is unaffected. select_filesystem still controls the value and already errored on cancellation. Bats: 140 → 142. Five tests added in test_config.bats for the defaults pinning and validate_filesystem coverage. Three removed from test_archangel.bats for behavior that moved out of gather_input. Lint clean. --- installer/lib/config.sh | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'installer/lib') diff --git a/installer/lib/config.sh b/installer/lib/config.sh index fefc838..65703d0 100644 --- a/installer/lib/config.sh +++ b/installer/lib/config.sh @@ -9,12 +9,18 @@ CONFIG_FILE="" UNATTENDED=false -# These get populated by config file or interactive prompts -FILESYSTEM="" # "zfs" or "btrfs" +# These get populated by config file or interactive prompts. +# Optional fields carry their default value here so config.sh is the +# single source of truth — gather_input trusts what's loaded. +FILESYSTEM="zfs" # "zfs" or "btrfs" +LOCALE="en_US.UTF-8" +KEYMAP="us" +ENABLE_SSH="yes" # SSH with root login (default yes for headless) +NO_ENCRYPT="no" # Skip filesystem encryption (testing only) + +# Required fields — installer errors out if any are still empty at install time. HOSTNAME="" TIMEZONE="" -LOCALE="" -KEYMAP="" SELECTED_DISKS=() RAID_LEVEL="" WIFI_SSID="" @@ -134,3 +140,12 @@ validate_config() { fi info "Config validation passed" } + +# Catches a typo in FILESYSTEM= from a config file before the install +# starts. Called from main() after check_config so a bad value never +# reaches gather_input or filesystem_preflight. +validate_filesystem() { + if [[ "$FILESYSTEM" != "zfs" && "$FILESYSTEM" != "btrfs" ]]; then + error "Invalid FILESYSTEM: $FILESYSTEM (must be 'zfs' or 'btrfs')" + fi +} -- cgit v1.2.3