
All checks were successful
Test and Publish Templates / test-and-publish (push) Successful in 34s
243 lines
8.0 KiB
Bash
Executable File
243 lines
8.0 KiB
Bash
Executable File
#!/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 <<EOF | host_exec tee /etc/systemd/system/getty@tty1.service.d/autologin.conf
|
|
[Service]
|
|
ExecStart=
|
|
ExecStart=-/sbin/agetty --autologin '"${KIOSK_USER}"' --noclear %I \$TERM
|
|
EOF
|
|
host_exec systemctl daemon-reload
|
|
fi
|
|
|
|
# Create kiosk script
|
|
echo "Setting up kiosk script..."
|
|
cat <<'"'"'KIOSKSCRIPT'"'"' | host_exec tee /home/'"${KIOSK_USER}"'/kiosk.sh
|
|
#!/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
|
|
xrandr --output HDMI-1 --mode '"${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}"' --rate '"${DISPLAY_REFRESH}"' 2>/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}" |