Files
kiosk-display-setup/kiosk-display-setup.sh
T
2026-11-01 10:49:57 +00:00

182 lines
4.8 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
die() { echo "ERROR: $*" >&2; exit 1; }
warn() { echo "WARNING: $*" >&2; }
[[ "${EUID}" -ne 0 ]] || die "Run as your regular user, not sudo."
APP_DIR="$HOME/.local/bin"
AUTOSTART_DIR="$HOME/.config/autostart"
LAUNCHER="$APP_DIR/launch-kiosk.sh"
DESKTOP_FILE="$AUTOSTART_DIR/launch-kiosk.desktop"
CONFIG_FILE="$HOME/.config/kiosk-display.conf"
echo "1) Install or update kiosk"
echo "2) Uninstall kiosk"
read -r -p "Choose an option [1/2]: " ACTION
if [[ "$ACTION" == "2" ]]; then
echo "Removing kiosk launcher and user configuration..."
rm -f "$LAUNCHER" "$DESKTOP_FILE" "$CONFIG_FILE"
if command -v systemctl >/dev/null 2>&1; then
echo "Removing daily reboot timer..."
sudo systemctl disable --now kiosk-daily-reboot.timer 2>/dev/null || true
sudo rm -f \
/etc/systemd/system/kiosk-daily-reboot.timer \
/etc/systemd/system/kiosk-daily-reboot.service
sudo systemctl daemon-reload
sudo systemctl reset-failed
fi
echo "Uninstall complete. The system hostname was left unchanged."
exit 0
fi
[[ "$ACTION" == "1" ]] || die "Choose 1 to install or 2 to uninstall."
command -v firefox >/dev/null 2>&1 || die "Firefox is not installed or not in PATH."
command -v systemctl >/dev/null 2>&1 || die "systemctl is not available."
read -r -p "Enter the display location (e.g. Lobby): " LOCATION
LOCATION="$(
printf '%s' "$LOCATION" |
tr '[:lower:]' '[:upper:]' |
sed -E 's/[ _]+/-/g; s/[^A-Z0-9-]//g; s/-+/-/g; s/^-|-$//g'
)"
[[ -n "$LOCATION" ]] || die "Location can't be empty."
HOSTNAME="DISPLAY-NVR-$LOCATION"
[[ ${#HOSTNAME} -le 63 ]] || die "Hostname too long: $HOSTNAME"
read -r -p "Enter the server URL (default: http://192.168.25.249): " URL_INPUT
URL="${URL_INPUT:-http://192.168.25.249}"
[[ "$URL" =~ ^https?:// ]] || die "URL must start with http:// or https://"
read -r -p "Enter daily reboot time in HH:MM format (default: 06:00): " REBOOT_TIME
REBOOT_TIME="${REBOOT_TIME:-06:00}"
[[ "$REBOOT_TIME" =~ ^([01][0-9]|2[0-3]):[0-5][0-9]$ ]] || die "Invalid time format."
mkdir -p "$APP_DIR" "$AUTOSTART_DIR" "$HOME/.config"
cat > "$CONFIG_FILE" <<EOF
HOSTNAME=$HOSTNAME
URL=$URL
REBOOT_TIME=$REBOOT_TIME
SETUP_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ)
EOF
chmod 600 "$CONFIG_FILE"
# Quote the URL safely for use in the generated shell script.
printf -v URL_Q '%q' "$URL"
cat > "$LAUNCHER" <<EOF
#!/usr/bin/env bash
set -euo pipefail
URL=$URL_Q
cleanup() {
rc=\$?
if [[ \$rc -ne 0 ]]; then
echo "Firefox launcher exited with code \$rc" >&2
fi
}
trap cleanup EXIT
if ! command -v curl >/dev/null 2>&1; then
echo "ERROR: curl is required to check whether the kiosk URL is responding." >&2
exit 1
fi
echo "Waiting for \$URL to respond..."
until curl -fsSL --connect-timeout 5 --max-time 10 "\$URL" -o /dev/null; do
sleep 5
done
echo "Kiosk URL is responding; starting Firefox."
if command -v xset >/dev/null 2>&1 && [[ -n "\${DISPLAY:-}" ]]; then
xset s off || true
xset -dpms || true
xset s noblank || true
fi
exec firefox --kiosk "\$URL"
EOF
chmod 700 "$LAUNCHER"
cat > "$DESKTOP_FILE" <<EOF
[Desktop Entry]
Type=Application
Name=Launch Kiosk Display
Exec=$LAUNCHER
Terminal=false
X-GNOME-Autostart-enabled=true
X-MATE-Autostart-enabled=true
StartupNotify=false
NoDisplay=false
Comment=Automatically Launch Kiosk Display in kiosk mode
EOF
chmod 644 "$DESKTOP_FILE"
echo
echo "User-level setup complete:"
echo " Launcher: $LAUNCHER"
echo " Autostart: $DESKTOP_FILE"
echo " Config: $CONFIG_FILE"
echo
read -r -p "Continue with system-level changes (hostname, reboot timer)? [y/N] " -n 1 CONFIRM
echo
[[ "$CONFIRM" =~ ^[Yy]$ ]] || exit 0
echo "Setting hostname to: $HOSTNAME"
sudo hostnamectl set-hostname "$HOSTNAME" || warn "Failed to set hostname."
echo "Installing daily reboot timer for $REBOOT_TIME..."
sudo tee /etc/systemd/system/kiosk-daily-reboot.service >/dev/null <<'EOF'
[Unit]
Description=Reboot kiosk display computer
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl reboot
EOF
sudo tee /etc/systemd/system/kiosk-daily-reboot.timer >/dev/null <<EOF
[Unit]
Description=Reboot kiosk display computer daily at $REBOOT_TIME
[Timer]
OnCalendar=*-*-* $REBOOT_TIME:00
Persistent=true
Unit=kiosk-daily-reboot.service
AccuracySec=1s
[Install]
WantedBy=timers.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now kiosk-daily-reboot.timer || warn "Failed to enable reboot timer."
if sudo systemctl is-active --quiet kiosk-daily-reboot.timer; then
echo "Reboot timer is active."
else
warn "Reboot timer may not be active."
fi
echo
echo "=== Setup Complete ==="
echo "Hostname: $HOSTNAME"
echo "NVR URL: $URL"
echo "Daily reboot: $REBOOT_TIME"
echo
echo "Next steps:"
echo "1. Reboot to test autostart: sudo reboot"
echo "2. Verify Firefox opens in kiosk mode"
echo "3. Check timer: systemctl list-timers kiosk-daily-reboot.timer"
echo "4. View logs: journalctl -u kiosk-daily-reboot.service -f"