#!/bin/bash # shellcheck disable=SC1091 source "${AGENT_PATH}/common.sh" _check_required_env_vars "CONTAINER_NAME" "IMAGE_REGISTRY" "IMAGE_REPO" "IMAGE_TAG" echo "Starting Squash Display setup container..." # Create the setup script as a heredoc that will be executed in the container SETUP_SCRIPT='#!/bin/sh 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 -- "$@" } # Install required packages echo "Installing required packages..." host_exec apt-get update 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 # Create kiosk user if it does not 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 cat </dev/null || \ xrandr --output HDMI-2 --mode '"${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}"' --rate '"${DISPLAY_REFRESH}"' 2>/dev/null || \ xrandr --output default --mode '"${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}"' --rate '"${DISPLAY_REFRESH}"' 2>/dev/null || true # Start Chromium in kiosk mode chromium-browser \ --window-size='"${DISPLAY_WIDTH},${DISPLAY_HEIGHT}"' \ --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}"'" KIOSKSCRIPT 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 <<'"'"'WATCHDOG'"'"' | host_exec tee /home/'"${KIOSK_USER}"'/watchdog.sh #!/bin/bash while true; do if ! pgrep chromium > /dev/null; then echo "$(date): Chromium not running, restarting..." >> /home/'"${KIOSK_USER}"'/watchdog.log DISPLAY=:0 /home/'"${KIOSK_USER}"'/kiosk.sh & fi sleep 30 done WATCHDOG 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 <<'"'"'BASHRC'"'"' | host_exec tee -a /home/'"${KIOSK_USER}"'/.bashrc # Auto-start X server and kiosk on login if [ -z "$DISPLAY" ] && [ "$XDG_VTNR" = 1 ]; then exec startx ~/kiosk.sh fi # Start watchdog in background if [ "'"${ENABLE_WATCHDOG}"'" = "true" ]; then ~/watchdog.sh & fi BASHRC fi # Disable automatic updates 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 # Configure GPU memory split (Raspberry Pi specific) 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}"'" | host_exec tee -a ${CONFIG_FILE} else host_exec sed -i "s/^gpu_mem=.*/gpu_mem='"${GPU_MEM}"'/" ${CONFIG_FILE} fi fi # Setup HDMI keep-alive service if enabled if [ "'"${ENABLE_HDMI_KEEP_ALIVE}"'" = "true" ]; then echo "Setting up HDMI keep-alive service..." cat <<'"'"'HDMISERVICE'"'"' | host_exec tee /etc/systemd/system/hdmi-keep-alive.service [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 systemctl daemon-reload host_exec systemctl enable hdmi-keep-alive.service 2>/dev/null || true fi echo "Squash Display kiosk setup complete!" echo "" echo "Configuration:" 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." ' # Build the docker run command - needs privileged access to configure host DOCKER_RUN_CMD="docker run -d \ --restart no \ --name ${CONTAINER_NAME} \ --privileged \ --pid=host \ --network=host \ -v /:/host \ ${IMAGE_REGISTRY}/${IMAGE_REPO}:${IMAGE_TAG} \ sh -c 'echo \"${SETUP_SCRIPT}\" | sh'" # Create and start the container if ! _create_and_start_container "$DOCKER_RUN_CMD" "$CONTAINER_NAME"; then _die "Failed to start Squash Display setup container" fi # Wait for setup to complete echo "Running kiosk setup..." echo "This may take several minutes as packages are installed..." echo "" # Check if running interactively if [ -t 0 ]; then echo "Following setup progress (this may take 5-10 minutes)..." echo "You can also check progress with: docker logs -f ${CONTAINER_NAME}" echo "" # Follow the container logs until it exits docker logs -f ${CONTAINER_NAME} 2>&1 # Check if setup completed successfully EXIT_CODE=$(docker inspect ${CONTAINER_NAME} --format='{{.State.ExitCode}}') if [ "$EXIT_CODE" != "0" ]; then echo "Setup failed with exit code: $EXIT_CODE" echo "Check logs for details: docker logs ${CONTAINER_NAME}" exit 1 fi else echo "Setup running in background..." echo "Check progress with: docker logs -f ${CONTAINER_NAME}" echo "" # In non-interactive mode, just wait a moment for container to start sleep 5 # Check if container started successfully if ! _is_container_running "$CONTAINER_NAME"; then # Container already exited, check exit code EXIT_CODE=$(docker inspect ${CONTAINER_NAME} --format='{{.State.ExitCode}}' 2>/dev/null || echo "1") if [ "$EXIT_CODE" = "0" ]; then echo "Setup completed successfully!" else echo "Setup may have failed. Check status with: ./status.sh" echo "View logs with: docker logs ${CONTAINER_NAME}" fi else echo "Setup is running. Monitor with: docker logs -f ${CONTAINER_NAME}" echo "Check status with: ./status.sh" fi fi echo "" echo "Squash Display setup completed successfully!" echo "Container: ${CONTAINER_NAME}"