#!/bin/bash # Arch Linux MATE Xscreensaver full-replace & configuration script # Version 0.1 Author: Ben @ LostGeek.NET # Description: Run as your regular user; uses sudo/doas internally # (must have one of these installed & configured for that user) # set -euo pipefail ### CONFIG PACMAN_CONF="/etc/pacman.conf" AUTOSTART_FILE="$HOME/.config/autostart/xscreensaver.desktop" USER_NAME="$USER" USER_HOME="$HOME" # Detect available privilege escalation command if command -v sudo &> /dev/null; then ELEVATE="sudo" elif command -v doas &> /dev/null; then ELEVATE="doas" else echo "❌ Error: Neither 'sudo' nor 'doas' is installed. Please install one to proceed... Configure it, add yourself to 'wheel' or 'sudo'..." exit 1 fi echo "==> Running xscreensaver setup for MATE on Arch (user: $USER_NAME)" ### Step 1: Ask once about sonar SUID read -p "Enable sonar hack with ping SUID capability? [y/N]: " ENABLE_SONAR ### Step 2: System-level tasks (via sudo/doas) # 2.1 Remove mate-screensaver if installed if pacman -Qs mate-screensaver &> /dev/null; then echo "==> Removing mate-screensaver..." $ELEVATE pacman -Rns --noconfirm mate-screensaver else echo "✓ mate-screensaver already removed" fi # 2.2 Add IgnorePkg to pacman.conf if $ELEVATE grep -q '^IgnorePkg.*mate-screensaver' "$PACMAN_CONF"; then echo "✓ mate-screensaver already pinned in $PACMAN_CONF" else echo "==> Pinning mate-screensaver in $PACMAN_CONF" $ELEVATE sed -i '/^\[options\]/a IgnorePkg = mate-screensaver' "$PACMAN_CONF" fi # 2.3 Install xscreensaver if missing if pacman -Q xscreensaver &> /dev/null; then echo "✓ xscreensaver already installed" else echo "==> Installing xscreensaver..." $ELEVATE pacman -Sy --noconfirm xscreensaver fi # 2.4 Symlinks for lock compatibility declare -A SYMLINKS=( [/usr/local/bin/gnome-screensaver-command]=/usr/bin/xscreensaver-command [/usr/local/bin/mate-screensaver-command]=/usr/bin/xscreensaver-command ) for LINK in "${!SYMLINKS[@]}"; do TARGET="${SYMLINKS[$LINK]}" if $ELEVATE test -L "$LINK" && [[ "$($ELEVATE readlink "$LINK")" == "$TARGET" ]]; then echo "✓ $LINK already symlinked to $TARGET" else echo "==> Creating symlink: $LINK -> $TARGET" $ELEVATE ln -sf "$TARGET" "$LINK" fi done # 2.5 SUID on ping for sonar if [[ "$ENABLE_SONAR" =~ ^[Yy]$ ]]; then if [[ -u /usr/bin/ping ]]; then echo "✓ /usr/bin/ping already has setuid bit" else echo "==> Enabling setuid on /usr/bin/ping" $ELEVATE chmod u+s /usr/bin/ping fi else echo "✓ Skipping sonar SUID setup" fi ### Step 3: User-level tasks # 3.1 Create autostart entry mkdir -p "$(dirname "$AUTOSTART_FILE")" AUTOSTART_CONTENT="[Desktop Entry] Name=XScreenSaver Exec=xscreensaver -nosplash StartupNotify=false Terminal=false Type=Application X-GNOME-Autostart-enabled=true" if [[ -f "$AUTOSTART_FILE" ]] && grep -q "Exec=xscreensaver -nosplash" "$AUTOSTART_FILE"; then echo "✓ Autostart already configured" else echo "==> Creating xscreensaver autostart entry" echo "$AUTOSTART_CONTENT" > "$AUTOSTART_FILE" fi # 3.2 Set MATE lock command via dconf if command -v dconf &> /dev/null; then CURRENT_CMD=$(dconf read /org/mate/desktop/screensaver/lock-command 2>/dev/null || echo "") if [[ "$CURRENT_CMD" == "'xscreensaver-command -lock'" ]]; then echo "✓ MATE lock command already set to xscreensaver" else echo "==> Setting MATE lock command to xscreensaver" dconf write /org/mate/desktop/screensaver/lock-enabled true dconf write /org/mate/desktop/screensaver/lock-command "'xscreensaver-command -lock'" fi else echo "⚠ dconf not found — skipping MATE lock command config" fi echo "Complete." echo "Log out & back in, XSS will auto-start."