107 lines
5.7 KiB
Bash
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."
|