Files
Your Name 7c7c60e969
All checks were successful
Test and Publish Templates / test-and-publish (push) Successful in 45s
docs: Add 2, update 5 and remove 1 files
2025-09-11 20:53:06 +12:00

263 lines
10 KiB
Bash
Executable File

#!/bin/sh
# This script runs inside the Alpine container to configure the host system
set -e
echo "Starting Squash Display kiosk setup..."
# Function to run commands on the host
host_exec() {
nsenter -t 1 -m -u -i -n -p -- "$@"
}
# Get environment variables (passed from Docker)
KIOSK_URL="${KIOSK_URL:-https://squash.kiwi/court/otog}"
KIOSK_USER="${KIOSK_USER:-squash}"
DISPLAY_WIDTH="${DISPLAY_WIDTH:-1920}"
DISPLAY_HEIGHT="${DISPLAY_HEIGHT:-1080}"
DISPLAY_REFRESH="${DISPLAY_REFRESH:-60}"
GPU_MEM="${GPU_MEM:-256}"
ENABLE_WATCHDOG="${ENABLE_WATCHDOG:-true}"
ENABLE_AUTO_LOGIN="${ENABLE_AUTO_LOGIN:-true}"
ENABLE_HDMI_KEEP_ALIVE="${ENABLE_HDMI_KEEP_ALIVE:-true}"
SYSTEM_TYPE="${SYSTEM_TYPE:-rpi}"
echo "Configuration:"
echo " System: ${SYSTEM_TYPE}"
echo " URL: ${KIOSK_URL}"
echo " User: ${KIOSK_USER}"
echo " Display: ${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}@${DISPLAY_REFRESH}Hz"
# Install required packages
echo "Installing required packages..."
host_exec apt-get update
if [ "${SYSTEM_TYPE}" = "ubuntu" ]; then
# Ubuntu packages - try multiple browser options
host_exec apt-get install -y xorg xinit x11-xserver-utils unclutter
host_exec apt-get install -y chromium-browser || \
host_exec apt-get install -y chromium || \
host_exec sh -c "wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' > /etc/apt/sources.list.d/google-chrome.list && \
apt-get update && \
apt-get install -y google-chrome-stable" || \
echo "Warning: Could not install Chrome/Chromium"
else
# Raspberry Pi packages
host_exec apt-get install -y chromium-browser xorg xinit x11-xserver-utils unclutter || \
host_exec apt-get install -y chromium xorg xinit x11-xserver-utils unclutter
fi
# Create kiosk user if it doesn't exist
if ! host_exec id -u ${KIOSK_USER} >/dev/null 2>&1; then
echo "Creating user ${KIOSK_USER}..."
host_exec useradd -m -s /bin/bash ${KIOSK_USER}
host_exec usermod -aG video,audio ${KIOSK_USER}
fi
# Setup auto-login if enabled
if [ "${ENABLE_AUTO_LOGIN}" = "true" ]; then
echo "Configuring auto-login for ${KIOSK_USER}..."
host_exec mkdir -p /etc/systemd/system/getty@tty1.service.d
# Create auto-login configuration
echo "[Service]" > /tmp/autologin.conf
echo "ExecStart=" >> /tmp/autologin.conf
echo "ExecStart=-/sbin/agetty --autologin ${KIOSK_USER} --noclear %I \$TERM" >> /tmp/autologin.conf
host_exec cp /tmp/autologin.conf /etc/systemd/system/getty@tty1.service.d/autologin.conf
host_exec systemctl daemon-reload
fi
# Create kiosk script
echo "Setting up kiosk script..."
cat > /tmp/kiosk.sh << 'KIOSKSCRIPT'
#!/bin/bash
# Disable screen blanking and power management
xset s noblank
xset s off
xset -dpms
# Hide cursor after 1 second of inactivity
unclutter -idle 1 &
# Force display resolution
if [ "SYSTEM_TYPE_PLACEHOLDER" = "ubuntu" ]; then
# Ubuntu/Mac Mini typically uses DisplayPort or HDMI
xrandr --output DP-1 --mode DISPLAY_WIDTH_PLACEHOLDERxDISPLAY_HEIGHT_PLACEHOLDER --rate DISPLAY_REFRESH_PLACEHOLDER 2>/dev/null || \
xrandr --output DP-2 --mode DISPLAY_WIDTH_PLACEHOLDERxDISPLAY_HEIGHT_PLACEHOLDER --rate DISPLAY_REFRESH_PLACEHOLDER 2>/dev/null || \
xrandr --output HDMI-1 --mode DISPLAY_WIDTH_PLACEHOLDERxDISPLAY_HEIGHT_PLACEHOLDER --rate DISPLAY_REFRESH_PLACEHOLDER 2>/dev/null || \
xrandr --output HDMI-2 --mode DISPLAY_WIDTH_PLACEHOLDERxDISPLAY_HEIGHT_PLACEHOLDER --rate DISPLAY_REFRESH_PLACEHOLDER 2>/dev/null || \
xrandr --output eDP-1 --mode DISPLAY_WIDTH_PLACEHOLDERxDISPLAY_HEIGHT_PLACEHOLDER --rate DISPLAY_REFRESH_PLACEHOLDER 2>/dev/null || \
xrandr --output default --mode DISPLAY_WIDTH_PLACEHOLDERxDISPLAY_HEIGHT_PLACEHOLDER --rate DISPLAY_REFRESH_PLACEHOLDER 2>/dev/null || true
else
# Raspberry Pi typically uses HDMI
xrandr --output HDMI-1 --mode DISPLAY_WIDTH_PLACEHOLDERxDISPLAY_HEIGHT_PLACEHOLDER --rate DISPLAY_REFRESH_PLACEHOLDER 2>/dev/null || \
xrandr --output HDMI-2 --mode DISPLAY_WIDTH_PLACEHOLDERxDISPLAY_HEIGHT_PLACEHOLDER --rate DISPLAY_REFRESH_PLACEHOLDER 2>/dev/null || \
xrandr --output default --mode DISPLAY_WIDTH_PLACEHOLDERxDISPLAY_HEIGHT_PLACEHOLDER --rate DISPLAY_REFRESH_PLACEHOLDER 2>/dev/null || true
fi
# Start Chromium in kiosk mode
# Try to find available browser
if command -v chromium-browser >/dev/null 2>&1; then
BROWSER="chromium-browser"
elif command -v chromium >/dev/null 2>&1; then
BROWSER="chromium"
elif command -v google-chrome >/dev/null 2>&1; then
BROWSER="google-chrome"
else
echo "No Chromium-based browser found!"
exit 1
fi
$BROWSER \
--window-size=DISPLAY_WIDTH_PLACEHOLDER,DISPLAY_HEIGHT_PLACEHOLDER \
--window-position=0,0 \
--noerrdialogs \
--disable-infobars \
--disable-features=TranslateUI \
--disable-extensions \
--disable-plugins \
--disable-web-security \
--disable-features=VizDisplayCompositor \
--start-fullscreen \
--kiosk \
--incognito \
--no-first-run \
--fast \
--fast-start \
--disable-default-apps \
--disable-translate \
--disable-background-timer-throttling \
--disable-renderer-backgrounding \
--disable-backgrounding-occluded-windows \
--disable-component-extensions-with-background-pages \
--autoplay-policy=no-user-gesture-required \
"KIOSK_URL_PLACEHOLDER"
KIOSKSCRIPT
# Replace placeholders
sed -i "s|DISPLAY_WIDTH_PLACEHOLDER|${DISPLAY_WIDTH}|g" /tmp/kiosk.sh
sed -i "s|DISPLAY_HEIGHT_PLACEHOLDER|${DISPLAY_HEIGHT}|g" /tmp/kiosk.sh
sed -i "s|DISPLAY_REFRESH_PLACEHOLDER|${DISPLAY_REFRESH}|g" /tmp/kiosk.sh
sed -i "s|KIOSK_URL_PLACEHOLDER|${KIOSK_URL}|g" /tmp/kiosk.sh
sed -i "s|SYSTEM_TYPE_PLACEHOLDER|${SYSTEM_TYPE}|g" /tmp/kiosk.sh
host_exec cp /tmp/kiosk.sh /home/${KIOSK_USER}/kiosk.sh
host_exec chmod +x /home/${KIOSK_USER}/kiosk.sh
host_exec chown ${KIOSK_USER}:${KIOSK_USER} /home/${KIOSK_USER}/kiosk.sh
# Setup watchdog if enabled
if [ "${ENABLE_WATCHDOG}" = "true" ]; then
echo "Setting up watchdog script..."
cat > /tmp/watchdog.sh << 'WATCHDOG'
#!/bin/bash
while true; do
if ! pgrep chromium > /dev/null; then
echo "$(date): Chromium not running, restarting..." >> /home/KIOSK_USER_PLACEHOLDER/watchdog.log
DISPLAY=:0 /home/KIOSK_USER_PLACEHOLDER/kiosk.sh &
fi
sleep 30
done
WATCHDOG
sed -i "s|KIOSK_USER_PLACEHOLDER|${KIOSK_USER}|g" /tmp/watchdog.sh
host_exec cp /tmp/watchdog.sh /home/${KIOSK_USER}/watchdog.sh
host_exec chmod +x /home/${KIOSK_USER}/watchdog.sh
host_exec chown ${KIOSK_USER}:${KIOSK_USER} /home/${KIOSK_USER}/watchdog.sh
fi
# Configure .bashrc for auto-start
echo "Configuring auto-start..."
if ! host_exec grep -q "Auto-start X server" /home/${KIOSK_USER}/.bashrc 2>/dev/null; then
cat > /tmp/bashrc_append << 'BASHRC'
# Auto-start X server and kiosk on login
if [ -z "$DISPLAY" ] && [ "$XDG_VTNR" = 1 ]; then
exec startx ~/kiosk.sh
fi
BASHRC
if [ "${ENABLE_WATCHDOG}" = "true" ]; then
echo '~/watchdog.sh &' >> /tmp/bashrc_append
fi
host_exec sh -c "cat /tmp/bashrc_append >> /home/${KIOSK_USER}/.bashrc"
fi
# Disable automatic updates (RPi only, keep updates on Ubuntu)
if [ "${SYSTEM_TYPE}" = "rpi" ]; then
echo "Disabling automatic updates..."
host_exec systemctl disable apt-daily.service 2>/dev/null || true
host_exec systemctl disable apt-daily.timer 2>/dev/null || true
host_exec systemctl disable apt-daily-upgrade.timer 2>/dev/null || true
host_exec systemctl disable apt-daily-upgrade.service 2>/dev/null || true
fi
# Configure GPU memory split (Raspberry Pi specific)
if [ "${SYSTEM_TYPE}" = "rpi" ]; then
if host_exec test -f /boot/firmware/config.txt || host_exec test -f /boot/config.txt; then
echo "Configuring GPU memory split..."
CONFIG_FILE="/boot/firmware/config.txt"
host_exec test -f /boot/config.txt && CONFIG_FILE="/boot/config.txt"
if ! host_exec grep -q "^gpu_mem=" ${CONFIG_FILE}; then
echo "gpu_mem=${GPU_MEM}" > /tmp/gpu_mem
host_exec sh -c "cat /tmp/gpu_mem >> ${CONFIG_FILE}"
else
host_exec sed -i "s/^gpu_mem=.*/gpu_mem=${GPU_MEM}/" ${CONFIG_FILE}
fi
fi
fi
# Configure Intel GPU optimizations (Ubuntu/Mac Mini specific)
if [ "${SYSTEM_TYPE}" = "ubuntu" ]; then
if host_exec test -f /etc/default/grub; then
echo "Checking GPU optimizations..."
if ! host_exec grep -q "i915.enable_guc=2" /etc/default/grub; then
echo "Adding Intel GPU optimizations..."
host_exec cp /etc/default/grub /etc/default/grub.backup
CURRENT_CMDLINE=$(host_exec grep "^GRUB_CMDLINE_LINUX_DEFAULT=" /etc/default/grub | cut -d'"' -f2)
NEW_CMDLINE="${CURRENT_CMDLINE} i915.enable_guc=2 i915.enable_fbc=1"
host_exec sed -i "s/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"${NEW_CMDLINE}\"/" /etc/default/grub
echo "Note: Run 'sudo update-grub' after reboot to apply GPU optimizations"
fi
fi
fi
# Setup HDMI keep-alive service if enabled
if [ "${ENABLE_HDMI_KEEP_ALIVE}" = "true" ]; then
echo "Setting up HDMI keep-alive service..."
cat > /tmp/hdmi-keep-alive.service << 'HDMISERVICE'
[Unit]
Description=Keep HDMI active
After=graphical.target
[Service]
Type=simple
ExecStart=/bin/sh -c 'while true; do tvservice -p 2>/dev/null || true; sleep 60; done'
Restart=always
RestartSec=10
[Install]
WantedBy=graphical.target
HDMISERVICE
host_exec cp /tmp/hdmi-keep-alive.service /etc/systemd/system/hdmi-keep-alive.service
host_exec systemctl daemon-reload
host_exec systemctl enable hdmi-keep-alive.service 2>/dev/null || true
fi
echo ""
echo "Squash Display kiosk setup complete!"
echo ""
echo "Configuration applied:"
echo " URL: ${KIOSK_URL}"
echo " User: ${KIOSK_USER}"
echo " Display: ${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}@${DISPLAY_REFRESH}Hz"
echo " Watchdog: ${ENABLE_WATCHDOG}"
echo " Auto-login: ${ENABLE_AUTO_LOGIN}"
echo ""
echo "Please reboot the system for all changes to take effect."