feat: initial commit — void-installer multi-profile (stable-cinnamon + mainline-niri)
This commit is contained in:
77
installer/lib/tui.sh
Executable file
77
installer/lib/tui.sh
Executable file
@@ -0,0 +1,77 @@
|
||||
#!/bin/bash
|
||||
# TUI disk selection. Uses `dialog` to show detected disks/partitions
|
||||
# and require explicit user confirmation before any destructive action.
|
||||
# Sets globals: TARGET_DISK, ROOT_PART, EFI_PART
|
||||
|
||||
# shellcheck source=common.sh
|
||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
||||
|
||||
tui_select_install_target() {
|
||||
step "Disk selection"
|
||||
|
||||
local default_root="${DEFAULT_ROOT_PART:-}"
|
||||
local default_efi="${DEFAULT_EFI_PART:-}"
|
||||
|
||||
# Build a human menu of partitions (skip loop/ram/zram, only TYPE=part).
|
||||
local menu_items=()
|
||||
local dev type fstype size label
|
||||
while read -r dev type fstype size label; do
|
||||
[[ "$type" == "part" ]] || continue
|
||||
[[ "$dev" =~ ^/dev/(sd|nvme|vd|mmcblk|hd|xvd) ]] || continue
|
||||
local marker=""
|
||||
[[ "$dev" == "$default_root" ]] && marker=" (DEFAULT ROOT)"
|
||||
[[ "$fstype" == "vfat" ]] && marker+=" [EFI?]"
|
||||
[[ "$fstype" == "ntfs" ]] && marker+=" [WINDOWS - DO NOT TOUCH]"
|
||||
menu_items+=("$dev" "${fstype:-?} ${size} '${label:-}'${marker}")
|
||||
done < <(lsblk -lnpo NAME,TYPE,FSTYPE,SIZE,LABEL 2>/dev/null || true)
|
||||
|
||||
if [[ ${#menu_items[@]} -eq 0 ]]; then
|
||||
log "lsblk output for diagnosis:"
|
||||
lsblk -lnpo NAME,TYPE,FSTYPE,SIZE,LABEL 2>&1 | while read -r l; do log " $l"; done
|
||||
die "no candidate partitions found"
|
||||
fi
|
||||
|
||||
local choice
|
||||
if [[ "${UNATTENDED:-0}" == "1" ]]; then
|
||||
choice="$default_root"
|
||||
log "[unattended] target root partition = $choice"
|
||||
else
|
||||
choice=$(dialog --stdout --title "Void Installer — SELECT ROOT PARTITION" \
|
||||
--backtitle "WARNING: the chosen partition will be WIPED. Windows partitions show [WINDOWS]." \
|
||||
--default-item "$default_root" \
|
||||
--menu "Choose the partition to install Void Linux onto.\nDefault highlights $default_root (current Linux Mint).\nAbsolutely DO NOT pick a partition labelled [WINDOWS]." \
|
||||
25 90 14 "${menu_items[@]}") \
|
||||
|| die "user cancelled disk selection"
|
||||
fi
|
||||
|
||||
[[ -b "$choice" ]] || die "selected device $choice is not a block device"
|
||||
local fstype
|
||||
fstype=$(lsblk -no FSTYPE "$choice" 2>/dev/null | head -1)
|
||||
if [[ "$fstype" == "ntfs" ]]; then
|
||||
die "REFUSING to wipe NTFS partition $choice (looks like Windows)"
|
||||
fi
|
||||
|
||||
ROOT_PART="$choice"
|
||||
EFI_PART="${default_efi}"
|
||||
# Resolve the parent block device robustly (works for nvme, mmcblk, sd*, vd*).
|
||||
TARGET_DISK="/dev/$(lsblk -no PKNAME "$choice" 2>/dev/null | head -1)"
|
||||
[[ "$TARGET_DISK" == "/dev/" ]] && TARGET_DISK="$DEFAULT_DISK"
|
||||
|
||||
# Confirmation step: must type the partition device name verbatim.
|
||||
if [[ "${UNATTENDED:-0}" != "1" ]]; then
|
||||
local typed
|
||||
typed=$(dialog --stdout --title "FINAL CONFIRMATION" \
|
||||
--backtitle "Type the device name to confirm WIPE" \
|
||||
--inputbox "About to:\n - WIPE : $ROOT_PART (will become btrfs)\n - SHARE : $EFI_PART (kept intact, only adds /EFI/Void)\n - LEAVE : everything else (Windows, recovery)\n\nType the FULL device path of the partition to wipe to continue:" \
|
||||
18 75) \
|
||||
|| die "user cancelled confirmation"
|
||||
[[ "$typed" == "$ROOT_PART" ]] \
|
||||
|| die "confirmation mismatch (typed '$typed' != '$ROOT_PART')"
|
||||
fi
|
||||
|
||||
ok "target root : $ROOT_PART"
|
||||
ok "shared EFI : $EFI_PART"
|
||||
ok "parent disk : $TARGET_DISK"
|
||||
|
||||
export TARGET_DISK ROOT_PART EFI_PART
|
||||
}
|
||||
Reference in New Issue
Block a user