Add setup script for Alpine Linux signage kiosk configuration

This commit is contained in:
FallingLights 2025-04-28 14:36:02 +02:00
parent 9a0c80c5f5
commit cd54c009d6

287
setup-signage.sh Normal file
View file

@ -0,0 +1,287 @@
#!/bin/sh
# Exit immediately if a command exits with a non-zero status.
# We disable this ('+e') temporarily during the nomodeset check.
set -u
# --- Configuration ---
# Set the URL you want the signage to display
KIOSK_URL="https://example.com"
# Set the user account to run the signage under
SIGNAGE_USER="signage"
# --- End Configuration ---
echo "Starting Alpine Linux Signage Setup (Using greetd)..."
echo "Target URL: $KIOSK_URL"
echo "Signage User: $SIGNAGE_USER"
echo "-------------------------------------"
# 1. Check if running as root
if [ "$(id -u)" -ne 0 ]; then
echo "ERROR: This script must be run as root" 1>&2
exit 1
fi
# 2. Update repositories
echo "[Step 3/11] Updating package repositories..."
apk update
echo "-------------------------------------"
# 3. Setup base Wayland environment (includes enabling community repo)
echo "[Step 4/11] Setting up base Wayland environment (elogind, eudev)..."
apk add --no-cache alpine-conf
setup-wayland-base
echo "-------------------------------------"
# 4. Install necessary packages (Add greetd)
echo "[Step 5/11] Installing Weston, Chromium, Mesa, D-Bus, Fonts, Firmware, Greetd..."
apk add \
weston \
weston-backend-drm \
weston-shell-desktop \
chromium \
mesa-dri-gallium \
mesa-va-gallium \
dbus \
font-dejavu \
ttf-freefont \
util-linux \
linux-firmware \
greetd \
greetd-agreety # Console greeter
echo "-------------------------------------"
# 5. Enable & Start D-Bus service (elogind/polkit handled by setup-wayland-base)
echo "[Step 6/11] Enabling and starting D-Bus service..."
if ! rc-service dbus status > /dev/null 2>&1; then
rc-update add dbus default
rc-service dbus start
else
echo "D-Bus service already running or enabled."
fi
echo "-------------------------------------"
# 6. Create the signage user
echo "[Step 7/11] Creating signage user '$SIGNAGE_USER'..."
if ! id -u "$SIGNAGE_USER" >/dev/null 2>&1; then
echo "Creating group '$SIGNAGE_USER'..."
addgroup "$SIGNAGE_USER"
echo "Creating user '$SIGNAGE_USER' with shell /bin/sh..."
# Use /bin/sh shell for better compatibility with login/profile execution
adduser -D -G "$SIGNAGE_USER" -s /bin/sh -h "/home/$SIGNAGE_USER" "$SIGNAGE_USER"
echo "User '$SIGNAGE_USER' created."
else
echo "User '$SIGNAGE_USER' already exists. Ensuring shell is /bin/sh..."
usermod -s /bin/sh "$SIGNAGE_USER"
if ! getent group "$SIGNAGE_USER" >/dev/null 2>&1; then
echo "Group '$SIGNAGE_USER' not found, creating it."
addgroup "$SIGNAGE_USER"
adduser "$SIGNAGE_USER" "$SIGNAGE_USER" # Ensure user is in their group
fi
fi
SIGNAGE_HOME="/home/$SIGNAGE_USER"
if [ ! -d "$SIGNAGE_HOME" ]; then
echo "Creating home directory '$SIGNAGE_HOME'..."
mkdir -p "$SIGNAGE_HOME"
fi
chown "$SIGNAGE_USER:$SIGNAGE_USER" "$SIGNAGE_HOME"
chmod 750 "$SIGNAGE_HOME" # Slightly more secure default
echo "-------------------------------------"
# 7. Configure Weston
echo "[Step 8/11] Configuring Weston..."
SIGNAGE_CONFIG_DIR="$SIGNAGE_HOME/.config"
SIGNAGE_WESTON_CONFIG="$SIGNAGE_CONFIG_DIR/weston.ini"
WESTON_LOG_DIR="$SIGNAGE_HOME/.local/share/weston"
echo "Creating configuration directories..."
mkdir -p "$SIGNAGE_CONFIG_DIR"
mkdir -p "$WESTON_LOG_DIR"
# Attempt chown, ignore errors if run multiple times
chown -R "$SIGNAGE_USER:$SIGNAGE_USER" "$SIGNAGE_HOME/.config" || true
chown -R "$SIGNAGE_USER:$SIGNAGE_USER" "$SIGNAGE_HOME/.local" || true
echo "Creating $SIGNAGE_WESTON_CONFIG..."
cat > "$SIGNAGE_WESTON_CONFIG" << EOF
[core]
# Use drm backend explicitly if needed, usually auto-detected.
# Default backend is drm-backend.so when run outside another compositor
# backend=drm-backend.so
# idle-time=0 prevents screen blanking/DPMS
idle-time=0
[shell]
# locking=false disables the screen lock/shield
locking=false
# Set the background to black (optional)
# background-color=0xff000000
# Start Chromium in kiosk mode as the main client
# Use --no-sandbox as it's often needed in minimal/containerized envs
# Explicitly tell Chromium to use Wayland backend
client=/usr/bin/chromium --enable-features=UseOzonePlatform --ozone-platform=wayland --kiosk --no-first-run --disable-infobars --disable-session-crashed-bubble --disable-component-update --disable-pinch --app=$KIOSK_URL --no-sandbox
# --- Optional Output Configuration ---
# Find your output name (e.g., HDMI-A-1, DP-1) via weston log or 'weston --scan-outputs'
# Then uncomment and configure the [output] section if needed.
#[output]
#name=HDMI-A-1
#mode=1920x1080@60
#transform=rotate-90 # Options: normal, 90, 180, 270, flipped, flipped-90, etc.
EOF
chown "$SIGNAGE_USER:$SIGNAGE_USER" "$SIGNAGE_WESTON_CONFIG"
chmod 600 "$SIGNAGE_WESTON_CONFIG"
echo "-------------------------------------"
# 8. Configure greetd for Autologin and Weston Session
echo "[Step 9/11] Configuring greetd..."
GREETD_CONFIG_DIR="/etc/greetd"
GREETD_CONFIG_FILE="$GREETD_CONFIG_DIR/config.toml"
mkdir -p "$GREETD_CONFIG_DIR"
# Create greetd config for autologin with agreety launching weston
cat > "$GREETD_CONFIG_FILE" << EOF
# Greetd configuration for signage kiosk
[terminal]
# Use agreety on the specified TTY. Switch VT if desired.
vt = 1
# command line REMOVED from here - specified in default_session
[default_session]
# Automatically log in the specified user.
user = "$SIGNAGE_USER"
# The command to run for the default session user.
# Launch weston directly. elogind grants permissions via PAM integration with greetd.
command = "/usr/bin/weston --log=/home/$SIGNAGE_USER/.local/share/weston/weston.log"
EOF
chmod 644 "$GREETD_CONFIG_FILE"
echo "greetd config written to $GREETD_CONFIG_FILE"
echo "-------------------------------------"
# 9. Configure inittab to start greetd
echo "[Step 10/11] Configuring autologin via greetd in /etc/inittab..."
if [ -f "/etc/inittab" ]; then
# Backup original inittab first only if it exists
cp /etc/inittab /etc/inittab.bak.$(date +%s)
# Disable getty on other TTYs (optional, saves resources)
echo "Commenting out ttys 2-6 in /etc/inittab..."
sed -i -e '/^tty[2-6]:/s/^/#/' /etc/inittab
# Configure tty1 to start greetd
echo "Modifying tty1 entry in /etc/inittab to start greetd..."
GREETD_INITTAB_LINE="tty1::respawn:/usr/sbin/greetd"
# Check if the line already exists to prevent duplicates
if ! grep -Fxq "$GREETD_INITTAB_LINE" /etc/inittab; then
# Replace the default getty/agetty/login line with the greetd line
sed -i "s|^tty1::respawn:.*|$GREETD_INITTAB_LINE|" /etc/inittab
else
echo "greetd line already seems to be present in /etc/inittab."
fi
else
echo "Warning: /etc/inittab not found. Cannot configure greetd startup."
fi
echo "-------------------------------------"
# 10. Attempt to Enable elogind PAM module for session management
echo "[Step 11/11] Attempting to configure PAM for elogind session..."
PAM_GREETD_FILE="/etc/pam.d/greetd"
PAM_SYSTEM_AUTH="/etc/pam.d/system-auth"
PAM_TARGET_FILE=""
PAM_MODULE="pam_elogind.so"
# Prefer greetd's specific PAM file if it exists
if [ -f "$PAM_GREETD_FILE" ]; then
PAM_TARGET_FILE="$PAM_GREETD_FILE"
echo "Using $PAM_TARGET_FILE for PAM configuration."
elif [ -f "$PAM_SYSTEM_AUTH" ]; then
PAM_TARGET_FILE="$PAM_SYSTEM_AUTH"
echo "Using $PAM_SYSTEM_AUTH for PAM configuration (greetd PAM file not found)."
else
echo "Warning: Neither $PAM_GREETD_FILE nor $PAM_SYSTEM_AUTH found!"
fi
if [ -n "$PAM_TARGET_FILE" ]; then
# Check if the module is already present
if ! grep -q "$PAM_MODULE" "$PAM_TARGET_FILE"; then
echo "Adding '$PAM_MODULE' to $PAM_TARGET_FILE..."
# Use awk to insert after the first line starting with 'session'
# Create backup before modifying
cp "$PAM_TARGET_FILE" "$PAM_TARGET_FILE.bak.$(date +%s)"
awk '/^session/{if(!p++) print; print "session optional pam_elogind.so"; next} 1' "$PAM_TARGET_FILE" > "$PAM_TARGET_FILE.tmp" && mv "$PAM_TARGET_FILE.tmp" "$PAM_TARGET_FILE"
echo "PAM module added."
else
echo "'$PAM_MODULE' already present in $PAM_TARGET_FILE."
fi
else
echo "Warning: Could not find suitable PAM file to modify."
echo " System relies on default PAM includes for elogind session setup."
echo " XDG_RUNTIME_DIR creation might fail if not handled by defaults."
fi
echo "-------------------------------------"
# 11. Check for 'nomodeset' kernel parameter
# Temporarily disable exit-on-error ('+e') for the check
set +e
KERNEL_CMDLINE=$(cat /proc/cmdline)
echo "[Step 2/11] Checking kernel command line for 'nomodeset'..."
echo "Command line: $KERNEL_CMDLINE"
if echo "$KERNEL_CMDLINE" | grep -q -w 'nomodeset'; then
echo ""
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo "!! WARNING: Kernel parameter 'nomodeset' detected in /proc/cmdline!"
echo "!! This PREVENTS Weston's DRM backend from working correctly."
echo "!! You MUST remove 'nomodeset' from your bootloader configuration"
echo "!! (e.g., /etc/default/grub or /boot/extlinux.conf) and update/reboot"
echo "!! for the graphical kiosk to function."
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo ""
# Allow script to continue, but it will fail graphically later
else
echo "'nomodeset' not found. Proceeding..."
fi
# Re-enable exit-on-error
set -e
echo "-------------------------------------"
echo "-----------------------------------------------------"
echo " Alpine Linux Signage Setup Script Finished!"
echo "-----------------------------------------------------"
echo " SUMMARY:"
echo " * Packages installed (Weston, Chromium, elogind, greetd, etc.)."
echo " * User '$SIGNAGE_USER' created/configured with shell /bin/sh."
echo " * Weston configured in $SIGNAGE_WESTON_CONFIG."
echo " * Autologin configured via greetd ($GREETD_CONFIG_FILE)."
echo " * /etc/inittab modified to launch greetd on tty1."
echo " * Attempted to configure PAM for elogind."
echo ""
echo " !!! IMPORTANT !!!"
echo " If you saw a WARNING about 'nomodeset' earlier, the graphical kiosk"
echo " WILL NOT WORK until you remove 'nomodeset' from your bootloader config"
echo " (e.g., /etc/default/grub or /boot/extlinux.conf) and reboot."
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo ""
echo " Please REBOOT the system for changes to take effect."
echo " Command: reboot"
echo ""
echo " TROUBLESHOOTING AFTER REBOOT (if it doesn't work):"
echo " 1. Log in as root on another TTY (Alt+F2) or via SSH."
echo " 2. Check greetd status/logs:"
echo " * cat /var/log/messages | grep greetd"
echo " * Check greetd config: cat $GREETD_CONFIG_FILE"
echo " 3. Check the Weston log: cat $WESTON_LOG_DIR/weston.log"
echo " 4. Check XDG_RUNTIME_DIR: ls -ld /run/user/\$(id -u $SIGNAGE_USER)"
echo " (Should be created by elogind via PAM)."
echo " 5. Check service status: rc-service elogind status && rc-service dbus status"
echo " 6. Check /etc/inittab for the tty1 line: grep ^tty1 /etc/inittab (should show greetd)"
echo " 7. Check system messages for graphics/DRM errors: dmesg | tail -n 50"
echo " 8. Verify Chromium Wayland flags in: cat $SIGNAGE_WESTON_CONFIG"
echo "-----------------------------------------------------"
exit 0