Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
00c89f23f0
|
@@ -74,7 +74,7 @@ The airootfs overlay ships it as `/usr/local/bin/alvin-install` (mode `0755` for
|
|||||||
locale, login manager, sshd, summary) then a fixed order of `install_*` steps
|
locale, login manager, sshd, summary) then a fixed order of `install_*` steps
|
||||||
(partition → LUKS → format/mount → pacstrap → fstab → repos → timezone → locale →
|
(partition → LUKS → format/mount → pacstrap → fstab → repos → timezone → locale →
|
||||||
hostname → network → sshd → user → git/SSH → end-4 dots → mkinitcpio → bootloader →
|
hostname → network → sshd → user → git/SSH → end-4 dots → mkinitcpio → bootloader →
|
||||||
TPM/unl0kr → login manager → autologin → update (reflector + keyrings + `pacman -Syu`, warn-only) → cleanup). Screens and install steps are
|
TPM/unl0kr → login manager (none if unl0kr succeeded; with unl0kr selected the login screen only asks for a fallback) → autologin → update (reflector + keyrings + `pacman -Syu`, warn-only) → cleanup). Screens and install steps are
|
||||||
independent — edit one without
|
independent — edit one without
|
||||||
touching the other. An `EXIT` trap unmounts `$TARGET` and closes `cryptroot` on any exit.
|
touching the other. An `EXIT` trap unmounts `$TARGET` and closes `cryptroot` on any exit.
|
||||||
- **Package list**: `install_pacstrap` builds the *installed* system's list from the medium's
|
- **Package list**: `install_pacstrap` builds the *installed* system's list from the medium's
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ GH_USERNAME=""
|
|||||||
UNL0KR="false"
|
UNL0KR="false"
|
||||||
TPM_STATUS=""
|
TPM_STATUS=""
|
||||||
LOGIN_MANAGER="none"
|
LOGIN_MANAGER="none"
|
||||||
|
# true when unl0kr was picked: no login manager is installed if unl0kr
|
||||||
|
# succeeds, and LOGIN_MANAGER only holds the fallback for when it doesn't.
|
||||||
|
LOGIN_MANAGER_SKIP="false"
|
||||||
AUTOLOGIN=""
|
AUTOLOGIN=""
|
||||||
# SSHD is the choice made on the sshd screen; SSHD_APPLIED is only flipped once
|
# SSHD is the choice made on the sshd screen; SSHD_APPLIED is only flipped once
|
||||||
# the target's sshd.service has actually been enabled, so the final banner can
|
# the target's sshd.service has actually been enabled, so the final banner can
|
||||||
@@ -527,6 +530,11 @@ screen_locale() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
screen_login_manager() {
|
screen_login_manager() {
|
||||||
|
if [[ "$LUKS" == "true" && "$UNL0KR" == "true" ]]; then
|
||||||
|
screen_unl0kr_login
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
LOGIN_MANAGER_SKIP="false"
|
||||||
clear
|
clear
|
||||||
header "Login Manager"
|
header "Login Manager"
|
||||||
echo ""
|
echo ""
|
||||||
@@ -543,6 +551,33 @@ screen_login_manager() {
|
|||||||
log "Login manager: $LOGIN_MANAGER"
|
log "Login manager: $LOGIN_MANAGER"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# unl0kr already asks for the passphrase on screen at boot, so a login
|
||||||
|
# manager on top would be a second prompt. Skip it, but collect a fallback
|
||||||
|
# now: install_unl0kr can still fall back to the systemd initramfs, and the
|
||||||
|
# installer must not stop to ask mid-install.
|
||||||
|
screen_unl0kr_login() {
|
||||||
|
LOGIN_MANAGER_SKIP="true"
|
||||||
|
clear
|
||||||
|
header "Login Manager (unl0kr)"
|
||||||
|
echo ""
|
||||||
|
gum style --foreground 15 \
|
||||||
|
"unl0kr is selected, so no login manager will be installed:" \
|
||||||
|
"after the LUKS passphrase is entered with unl0kr, the system logs in on" \
|
||||||
|
"tty1 and Hyprland starts automatically (autologin is asked during install)." \
|
||||||
|
"" \
|
||||||
|
"If unl0kr fails to install, the installer falls back to the standard" \
|
||||||
|
"passphrase prompt. Pick the login manager to use in that case:" \
|
||||||
|
"" \
|
||||||
|
" none - plain tty login, Hyprland starts automatically" \
|
||||||
|
" greetd - lightweight TUI greeter (tuigreet)" \
|
||||||
|
" sddm - Qt display manager (already installed)" \
|
||||||
|
" gdm - GNOME display manager (large download)"
|
||||||
|
echo ""
|
||||||
|
LOGIN_MANAGER=$(gum choose --header "+ Fallback login manager (Enter = none)" \
|
||||||
|
"none" "greetd" "sddm" "gdm") || die "No fallback login manager selected."
|
||||||
|
log "Login manager: skipped for unl0kr (fallback: $LOGIN_MANAGER)"
|
||||||
|
}
|
||||||
|
|
||||||
screen_sshd() {
|
screen_sshd() {
|
||||||
clear
|
clear
|
||||||
header "SSH Server"
|
header "SSH Server"
|
||||||
@@ -592,6 +627,11 @@ screen_summary() {
|
|||||||
ssh_line="gh:${GH_USERNAME}"
|
ssh_line="gh:${GH_USERNAME}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
local login_line="${LOGIN_MANAGER}"
|
||||||
|
if [[ "$LOGIN_MANAGER_SKIP" == "true" ]]; then
|
||||||
|
login_line="none - unl0kr (fallback: ${LOGIN_MANAGER})"
|
||||||
|
fi
|
||||||
|
|
||||||
gum style --foreground 15 --border normal --border-foreground 8 \
|
gum style --foreground 15 --border normal --border-foreground 8 \
|
||||||
--padding "0 2" --width 60 \
|
--padding "0 2" --width 60 \
|
||||||
"Disk: ${DISK}" \
|
"Disk: ${DISK}" \
|
||||||
@@ -603,7 +643,7 @@ screen_summary() {
|
|||||||
"Keymap: ${KEYMAP}" \
|
"Keymap: ${KEYMAP}" \
|
||||||
"Locale: ${LOCALE}" \
|
"Locale: ${LOCALE}" \
|
||||||
"Timezone: ${TIMEZONE}" \
|
"Timezone: ${TIMEZONE}" \
|
||||||
"Login mgr: ${LOGIN_MANAGER}" \
|
"Login mgr: ${login_line}" \
|
||||||
"SSH server: $([[ "$SSHD" == "true" ]] && echo enabled || echo skipped)" \
|
"SSH server: $([[ "$SSHD" == "true" ]] && echo enabled || echo skipped)" \
|
||||||
"SSH keys: ${ssh_line}" \
|
"SSH keys: ${ssh_line}" \
|
||||||
"Git: ${git_line}"
|
"Git: ${git_line}"
|
||||||
@@ -1715,6 +1755,34 @@ install_unl0kr() {
|
|||||||
page_log_tail "unl0kr hook file output (q to quit)" 40 || true
|
page_log_tail "unl0kr hook file output (q to quit)" 40 || true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# unl0kr parses /usr/share/unl0kr/unl0kr.conf first; the package doesn't
|
||||||
|
# ship it, so inih fails to open it and unl0kr prints "Ignoring invalid
|
||||||
|
# config file" on every boot. An empty file parses cleanly - FILES+= puts
|
||||||
|
# it in the image (the hook only adds /etc/unl0kr.conf). Our own
|
||||||
|
# /etc/unl0kr.conf pins the dark theme instead of trusting the PKGBUILD's
|
||||||
|
# sed on the upstream (light) default.
|
||||||
|
mkdir -p "${TARGET}/usr/share/unl0kr"
|
||||||
|
: >"${TARGET}/usr/share/unl0kr/unl0kr.conf"
|
||||||
|
cat >"${TARGET}/etc/unl0kr.conf" <<'UNL0KR'
|
||||||
|
[general]
|
||||||
|
animations=true
|
||||||
|
|
||||||
|
[keyboard]
|
||||||
|
autohide=false
|
||||||
|
layout=us
|
||||||
|
popovers=true
|
||||||
|
|
||||||
|
[textarea]
|
||||||
|
obscured=true
|
||||||
|
|
||||||
|
[theme]
|
||||||
|
default=breezy-dark
|
||||||
|
alternate=breezy-light
|
||||||
|
UNL0KR
|
||||||
|
echo 'FILES+=(/usr/share/unl0kr/unl0kr.conf)' \
|
||||||
|
>>"${TARGET}/etc/mkinitcpio.conf.d/alvin.conf"
|
||||||
|
log "unl0kr: wrote /etc/unl0kr.conf (breezy-dark) + empty /usr/share/unl0kr/unl0kr.conf"
|
||||||
|
|
||||||
# Touchscreen/input stack for the initramfs: mkinitcpio fails the build
|
# Touchscreen/input stack for the initramfs: mkinitcpio fails the build
|
||||||
# on a MODULES entry it cannot resolve, and -P applies the list to every
|
# on a MODULES entry it cannot resolve, and -P applies the list to every
|
||||||
# preset - so a module may enter MODULES only if EVERY installed kernel
|
# preset - so a module may enter MODULES only if EVERY installed kernel
|
||||||
@@ -1904,6 +1972,21 @@ FISH
|
|||||||
log "tty profile: ${profile} (exec Hyprland on VT1)"
|
log "tty profile: ${profile} (exec Hyprland on VT1)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Runs after install_unl0kr, which resets UNL0KR to false when it falls
|
||||||
|
# back to the systemd initramfs - so UNL0KR still being true here means
|
||||||
|
# unl0kr really is in the image and no login manager is wanted.
|
||||||
|
resolve_login_manager() {
|
||||||
|
[[ "$LOGIN_MANAGER_SKIP" == "true" ]] || return 0
|
||||||
|
if [[ "$UNL0KR" == "true" ]]; then
|
||||||
|
LOGIN_MANAGER="none"
|
||||||
|
info "unl0kr is installed - skipping the login manager (tty1 + Hyprland)."
|
||||||
|
log "Login manager: none (unl0kr installed)"
|
||||||
|
else
|
||||||
|
warn "unl0kr fell back - using the fallback login manager: ${LOGIN_MANAGER}."
|
||||||
|
log "Login manager: fallback ${LOGIN_MANAGER} (unl0kr not installed)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
install_login_manager() {
|
install_login_manager() {
|
||||||
info "Configuring login manager: ${LOGIN_MANAGER}..."
|
info "Configuring login manager: ${LOGIN_MANAGER}..."
|
||||||
|
|
||||||
@@ -2009,6 +2092,19 @@ TOML
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
ensure_hyprland_session
|
ensure_hyprland_session
|
||||||
|
# gdm (autologin included) starts the session stored in the user's
|
||||||
|
# AccountsService record; without one it picks gnome.desktop, which
|
||||||
|
# the gdm install drags in. Pin Hyprland.
|
||||||
|
local as_dir="${TARGET}/var/lib/AccountsService/users"
|
||||||
|
mkdir -p "$as_dir"
|
||||||
|
cat >"${as_dir}/${USERNAME}" <<'ACCOUNT'
|
||||||
|
[User]
|
||||||
|
Session=hyprland
|
||||||
|
SessionType=wayland
|
||||||
|
SystemAccount=false
|
||||||
|
ACCOUNT
|
||||||
|
chmod 600 "${as_dir}/${USERNAME}"
|
||||||
|
log "gdm: AccountsService session pinned to hyprland"
|
||||||
if run_logged "Could not enable gdm.service" \
|
if run_logged "Could not enable gdm.service" \
|
||||||
arch-chroot "$TARGET" systemctl enable gdm.service; then
|
arch-chroot "$TARGET" systemctl enable gdm.service; then
|
||||||
run_logged "Could not disable getty@tty1.service" \
|
run_logged "Could not disable getty@tty1.service" \
|
||||||
@@ -2286,6 +2382,7 @@ main() {
|
|||||||
install_bootloader
|
install_bootloader
|
||||||
install_tpm
|
install_tpm
|
||||||
install_unl0kr
|
install_unl0kr
|
||||||
|
resolve_login_manager
|
||||||
install_login_manager
|
install_login_manager
|
||||||
install_autologin
|
install_autologin
|
||||||
install_update
|
install_update
|
||||||
|
|||||||
Reference in New Issue
Block a user