#!/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."