#!/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" < "$LAUNCHER" <&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" </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 <