#!/usr/bin/env bash set -euo pipefail info() { printf '\n==> %s\n' "$1" } warn() { printf 'WARN: %s\n' "$1" >&2 } append_if_missing() { local line="$1" local file="$2" touch "$file" grep -qxF "$line" "$file" || echo "$line" >>"$file" } command_exists() { command -v "$1" >/dev/null 2>&1 } prompt_yes_no() { local prompt="$1" local default="${2:-Y}" local reply="" while true; do if [[ "$default" == "Y" ]]; then read -r -p "$prompt [Y/n] " reply reply="${reply:-Y}" else read -r -p "$prompt [y/N] " reply reply="${reply:-N}" fi case "${reply,,}" in y|yes) return 0 ;; n|no) return 1 ;; esac done } prompt_value() { local prompt="$1" local default="${2:-}" local reply="" if [[ -n "$default" ]]; then read -r -p "$prompt [$default] " reply printf '%s' "${reply:-$default}" else read -r -p "$prompt " reply printf '%s' "$reply" fi } prompt_required_value() { local prompt="$1" local default="${2:-}" local value="" while true; do value="$(prompt_value "$prompt" "$default")" if [[ -n "$value" ]]; then printf '%s' "$value" return 0 fi done } prompt_passphrase() { local pass1="" local pass2="" while true; do IFS= read -r -s -p "Enter SSH key passphrase: " pass1 printf '\n' IFS= read -r -s -p "Confirm SSH key passphrase: " pass2 printf '\n' if [[ "$pass1" == "$pass2" ]]; then printf '%s' "$pass1" return 0 fi warn "Passphrases did not match. Try again." done } sanitize_slug() { local value="$1" value="${value,,}" value="${value// /-}" value="$(printf '%s' "$value" | tr -cd 'a-z0-9_-')" printf '%s' "$value" } extract_host_from_git_url() { local url="$1" if [[ "$url" =~ ^ssh://([^/@]+@)?([^/:]+) ]]; then printf '%s' "${BASH_REMATCH[2]}" return 0 fi if [[ "$url" =~ ^([^/@]+@)?([^:]+): ]]; then printf '%s' "${BASH_REMATCH[2]}" return 0 fi if [[ "$url" =~ ^https?://([^/]+) ]]; then printf '%s' "${BASH_REMATCH[1]}" return 0 fi return 1 } add_host_to_known_hosts() { local host="$1" if [[ -z "$host" ]]; then return 1 fi if ! command_exists ssh-keyscan; then warn "ssh-keyscan is not installed; skipping known_hosts update for $host" return 1 fi mkdir -p "$HOME_DIR/.ssh" touch "$HOME_DIR/.ssh/known_hosts" if ssh-keygen -F "$host" -f "$HOME_DIR/.ssh/known_hosts" >/dev/null 2>&1; then return 0 fi ssh-keyscan -H "$host" >>"$HOME_DIR/.ssh/known_hosts" 2>/dev/null || true } install_pacman_package() { local package="$1" sudo pacman -S --needed --noconfirm "$package" } install_yay() { if command_exists yay; then info "yay already installed" return 0 fi info "Installing yay" git clone https://aur.archlinux.org/yay.git "$TMP_DIR/yay" ( cd "$TMP_DIR/yay" makepkg -si --noconfirm ) } write_element_desktop_entry() { local desktop_file="$1" local display_name="$2" local exec_line="$3" mkdir -p "$HOME_DIR/.local/share/applications" cat >"$desktop_file" </dev/null 2>&1 || true fi if prompt_yes_no "Enable the sshd system service?" "Y"; then info "Enabling sshd" sudo systemctl enable --now sshd.service fi if prompt_yes_no "Configure SDDM autologin?" "N"; then info "Configuring SDDM autologin" autologin_user="$(prompt_required_value "Autologin user:")" autologin_session="$(prompt_required_value "Autologin session:" "hyprland-uwsm")" sudo mkdir -p /etc/sddm.conf.d sudo tee /etc/sddm.conf.d/autologin.conf >/dev/null <