Dotfiles/setup/modules/optional-Modules/apps/greetd-regreet.sh

107 lines
5.7 KiB
Bash

#!/bin/bash
# greetd-regreet.sh — greetd + ReGreet (cyberqueer-themed, Wayland-native greeter)
#
# The Wayland-native alternative to the lightdm module. lightdm-gtk-greeter is an
# Xorg client, which on this multi-monitor / HiDPI / Wayland box means: a monitor
# can come up blank, the greeter renders tiny, and the Xorg→Wayland VT handover
# can race so the Hyprland session starts with dead input. ReGreet runs on
# wlroots (inside a cage kiosk), so it drives every output natively and hands
# input straight to the Wayland session — none of those failure modes.
#
# The CyberQueer login look is a self-contained stylesheet (etc-greetd/regreet.css,
# loaded by ReGreet over an Adwaita-dark base). The greeter background tracks the
# wallpaper picker's choice, mirrored to a greeter-readable path by the
# lightdm-greeter-wallpaper.path unit (shared, greeter-agnostic despite the name).
#
# Mutually exclusive with the lightdm and ly greeter modules: enabling greetd
# here disables the others and the tty1 getty so exactly one greeter runs.
set -euo pipefail
source "$(dirname "${BASH_SOURCE[0]}")/../../lib/logging.sh"
# apps/ → optional-Modules → modules → setup → repo root (four levels up).
DOTFILES_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." && pwd)"
ETC_GREETD="$DOTFILES_DIR/etc-greetd"
ETC_LIGHTDM="$DOTFILES_DIR/etc-lightdm" # shared wallpaper-sync helper + units
log "Installing greetd + ReGreet + cage..."
sudo pacman -S --noconfirm --needed greetd greetd-regreet cage
# ── cyberqueer GTK theme (optional) ───────────────────────────────────────────
# The greeter's look is driven by regreet.css over an Adwaita base, so this is no
# longer required — but we still ship it so flipping regreet.toml's theme_name
# back to "cyberqueer" works, and so the theme exists on a greeter-only install.
GTK_THEME_SRC="$DOTFILES_DIR/gtk-themes/cyberqueer"
if [[ -d "$GTK_THEME_SRC" ]]; then
log "Installing cyberqueer GTK theme to /usr/share/themes..."
sudo cp -r "$GTK_THEME_SRC" /usr/share/themes/
else
warn "cyberqueer GTK theme not found at $GTK_THEME_SRC — greeter uses the default GTK theme."
fi
# ── Skull fallback background (used until a wallpaper is picked) ───────────────
SKULL_SRC="$DOTFILES_DIR/resources/bg-skull.svg"
SKULL_DST="/usr/share/backgrounds/cyberqueer-skull.png"
if [[ -f "$SKULL_SRC" ]]; then
command -v rsvg-convert &>/dev/null || sudo pacman -S --noconfirm --needed librsvg
TMP_BG="$(mktemp /tmp/greeter-skull.XXXXXX.png)"
trap 'rm -f "$TMP_BG"' EXIT
rsvg-convert -w 1920 "$SKULL_SRC" -o "$TMP_BG"
sudo install -Dm644 "$TMP_BG" "$SKULL_DST"
fi
# ── Deploy greetd + ReGreet configuration ─────────────────────────────────────
log "Deploying greetd config, ReGreet config, and session launcher..."
sudo install -Dm644 "$ETC_GREETD/config.toml" /etc/greetd/config.toml
sudo install -Dm644 "$ETC_GREETD/regreet.toml" /etc/greetd/regreet.toml
sudo install -Dm644 "$ETC_GREETD/regreet.css" /etc/greetd/regreet.css
sudo install -Dm755 "$ETC_GREETD/regreet-session.sh" /etc/greetd/regreet-session.sh
# ── PAM: password (system-login) + required FIDO/U2F touch ────────────────────
# Replace any pre-existing greetd stack (e.g. a tuigreet securetty+oath one that
# a graphical greeter cannot drive), keeping a timestamped backup.
U2F_HOST="$(hostnamectl --static hostname 2>/dev/null || hostname)"
if [[ -f "$ETC_GREETD/pam.d-greetd" ]]; then
[[ -f /etc/pam.d/greetd ]] && sudo cp -a /etc/pam.d/greetd "/etc/pam.d/greetd.bak-$(date +%s)"
log "Deploying /etc/pam.d/greetd (password + FIDO, origin pam://${U2F_HOST})..."
tmp="$(mktemp)"
sed "s|@HOST@|${U2F_HOST}|g" "$ETC_GREETD/pam.d-greetd" > "$tmp"
sudo install -Dm644 "$tmp" /etc/pam.d/greetd
rm -f "$tmp"
else
warn "PAM template not found — leaving /etc/pam.d/greetd as-is (FIDO may not work)."
fi
# ── Greeter background tracks the user's desktop wallpaper (shared units) ──────
TARGET_USER="${SUDO_USER:-$(id -un)}"
PREF_MON="${LIGHTDM_GREETER_MONITOR:-}"
WP_HELPER_SRC="$ETC_LIGHTDM/lightdm-greeter-wallpaper"
if [[ -f "$WP_HELPER_SRC" ]]; then
log "Installing greeter wallpaper-sync helper + units (user: $TARGET_USER)..."
sudo install -Dm755 "$WP_HELPER_SRC" /usr/local/bin/lightdm-greeter-wallpaper
for unit in lightdm-greeter-wallpaper.service lightdm-greeter-wallpaper.path; do
tmp="$(mktemp)"
sed -e "s|@USER@|${TARGET_USER}|g" -e "s|@PREFERRED_MONITOR@|${PREF_MON}|g" \
"$ETC_LIGHTDM/$unit" > "$tmp"
sudo install -Dm644 "$tmp" "/etc/systemd/system/$unit"
rm -f "$tmp"
done
sudo systemctl daemon-reload
enable_service lightdm-greeter-wallpaper.path
sudo PREFERRED_MONITOR="$PREF_MON" /usr/local/bin/lightdm-greeter-wallpaper "$TARGET_USER" || true
if [[ ! -f /usr/share/backgrounds/lightdm-greeter-bg.png && -f "$SKULL_DST" ]]; then
sudo install -Dm644 "$SKULL_DST" /usr/share/backgrounds/lightdm-greeter-bg.png
fi
else
warn "Wallpaper-sync helper not found — greeter background will not track the wallpaper."
[[ -f "$SKULL_DST" ]] && sudo install -Dm644 "$SKULL_DST" /usr/share/backgrounds/lightdm-greeter-bg.png
fi
# ── Make greetd the sole display manager ──────────────────────────────────────
sudo systemctl disable getty@tty1.service || true
disable_service lightdm.service
disable_service ly@tty1.service
enable_service greetd.service
log "greetd + ReGreet installed and enabled. The Wayland greeter starts on next boot."