Phase 5 — RPi Kiosk: - setup_kiosk.sh: full RPi OS Lite setup (X11, Chromium kiosk mode, auto-login, DPMS disabled, GPU memory split, screen rotation) - kiosk.service: systemd unit for reliable auto-start - update_kiosk.sh: reconfigure URL/rotation/resolution without re-setup - Handles both Bullseye and Bookworm RPi OS versions Phase 9 — Hardening + Deployment: - install.sh: full server setup (apt/pacman, vigilar user, venv, directories, permissions, mosquitto config, systemd units) - gen_cert.sh: TLS cert via mkcert or openssl fallback - gen_vapid_keys.sh: VAPID keys for Web Push notifications - setup_nut.sh: NUT configuration with USB UPS auto-detection - backup.sh: SQLite snapshot + config archive, cron-ready - uninstall.sh: clean removal with data preservation option - vigilar.service: hardened systemd unit (ProtectSystem, NoNewPrivileges, PrivateTmp, syscall filtering) - vigilar-mosquitto.conf: localhost-only MQTT broker config All scripts idempotent, bash -n validated, support Debian + Arch. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
197 lines
6.5 KiB
Bash
Executable File
197 lines
6.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Vigilar Kiosk — Update/reconfigure script
|
|
# Change the URL, rotation, or resolution without re-running full setup.
|
|
set -euo pipefail
|
|
|
|
KIOSK_USER="vigilar"
|
|
KIOSK_HOME="/home/${KIOSK_USER}"
|
|
CONFIG_FILE="${KIOSK_HOME}/kiosk_config.txt"
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Helpers
|
|
# ---------------------------------------------------------------------------
|
|
info() { printf '\n\033[1;34m>>> %s\033[0m\n' "$*"; }
|
|
warn() { printf '\033[1;33mWARN: %s\033[0m\n' "$*"; }
|
|
error() { printf '\033[1;31mERROR: %s\033[0m\n' "$*" >&2; exit 1; }
|
|
|
|
need_root() {
|
|
if [[ $EUID -ne 0 ]]; then
|
|
error "This script must be run as root (use sudo)."
|
|
fi
|
|
}
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Load current config
|
|
# ---------------------------------------------------------------------------
|
|
need_root
|
|
|
|
CURRENT_URL=""
|
|
CURRENT_ROTATION="0"
|
|
CURRENT_RESOLUTION="1920x1080"
|
|
|
|
if [[ -f "${CONFIG_FILE}" ]]; then
|
|
# shellcheck source=/dev/null
|
|
source "${CONFIG_FILE}"
|
|
CURRENT_URL="${VIGILAR_URL:-}"
|
|
CURRENT_ROTATION="${ROTATION:-0}"
|
|
CURRENT_RESOLUTION="${RESOLUTION:-1920x1080}"
|
|
fi
|
|
|
|
info "Vigilar Kiosk — Update Configuration"
|
|
echo ""
|
|
echo "Current settings:"
|
|
echo " URL: ${CURRENT_URL:-<not set>}"
|
|
echo " Rotation: ${CURRENT_ROTATION}"
|
|
echo " Resolution: ${CURRENT_RESOLUTION}"
|
|
echo ""
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Parse arguments or ask interactively
|
|
# ---------------------------------------------------------------------------
|
|
usage() {
|
|
echo "Usage: $0 [--url URL] [--rotation 0|90|180|270] [--resolution WxH]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --url URL Vigilar server URL"
|
|
echo " --rotation DEGREE Screen rotation (0, 90, 180, 270)"
|
|
echo " --resolution WxH Screen resolution (e.g. 1920x1080)"
|
|
echo " --restart Restart the kiosk service after update"
|
|
echo " -h, --help Show this help"
|
|
exit 0
|
|
}
|
|
|
|
NEW_URL=""
|
|
NEW_ROTATION=""
|
|
NEW_RESOLUTION=""
|
|
DO_RESTART=false
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--url) NEW_URL="$2"; shift 2 ;;
|
|
--rotation) NEW_ROTATION="$2"; shift 2 ;;
|
|
--resolution) NEW_RESOLUTION="$2"; shift 2 ;;
|
|
--restart) DO_RESTART=true; shift ;;
|
|
-h|--help) usage ;;
|
|
*) warn "Unknown option: $1"; shift ;;
|
|
esac
|
|
done
|
|
|
|
# If no arguments given, ask interactively
|
|
if [[ -z "${NEW_URL}" && -z "${NEW_ROTATION}" && -z "${NEW_RESOLUTION}" ]]; then
|
|
read -r -p "Vigilar URL [${CURRENT_URL}]: " NEW_URL
|
|
read -r -p "Rotation (0/90/180/270) [${CURRENT_ROTATION}]: " NEW_ROTATION
|
|
read -r -p "Resolution [${CURRENT_RESOLUTION}]: " NEW_RESOLUTION
|
|
fi
|
|
|
|
# Fall back to current values
|
|
VIGILAR_URL="${NEW_URL:-$CURRENT_URL}"
|
|
ROTATION="${NEW_ROTATION:-$CURRENT_ROTATION}"
|
|
RESOLUTION="${NEW_RESOLUTION:-$CURRENT_RESOLUTION}"
|
|
|
|
# Validate rotation
|
|
case "${ROTATION}" in
|
|
0|90|180|270) ;;
|
|
*) error "Invalid rotation: ${ROTATION}. Must be 0, 90, 180, or 270." ;;
|
|
esac
|
|
|
|
# Validate resolution format
|
|
if [[ ! "${RESOLUTION}" =~ ^[0-9]+x[0-9]+$ ]]; then
|
|
error "Invalid resolution format: ${RESOLUTION}. Expected WxH (e.g. 1920x1080)."
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Write config
|
|
# ---------------------------------------------------------------------------
|
|
info "Writing ${CONFIG_FILE}"
|
|
cat > "${CONFIG_FILE}" <<CFGEOF
|
|
VIGILAR_URL=${VIGILAR_URL}
|
|
ROTATION=${ROTATION}
|
|
RESOLUTION=${RESOLUTION}
|
|
CFGEOF
|
|
chown "${KIOSK_USER}:${KIOSK_USER}" "${CONFIG_FILE}"
|
|
|
|
echo ""
|
|
echo " URL: ${VIGILAR_URL}"
|
|
echo " Rotation: ${ROTATION}"
|
|
echo " Resolution: ${RESOLUTION}"
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Update boot config.txt if rotation or resolution changed
|
|
# ---------------------------------------------------------------------------
|
|
CONFIG_TXT="/boot/config.txt"
|
|
if [[ -f /boot/firmware/config.txt ]]; then
|
|
CONFIG_TXT="/boot/firmware/config.txt"
|
|
fi
|
|
|
|
BOOT_CHANGED=false
|
|
|
|
if [[ -f "${CONFIG_TXT}" ]]; then
|
|
# Rotation
|
|
if [[ "${ROTATION}" != "${CURRENT_ROTATION}" ]]; then
|
|
ROTATE_VAL=0
|
|
case "${ROTATION}" in
|
|
90) ROTATE_VAL=1 ;;
|
|
180) ROTATE_VAL=2 ;;
|
|
270) ROTATE_VAL=3 ;;
|
|
esac
|
|
if grep -q '^display_rotate=' "${CONFIG_TXT}"; then
|
|
sed -i "s/^display_rotate=.*/display_rotate=${ROTATE_VAL}/" "${CONFIG_TXT}"
|
|
else
|
|
echo "display_rotate=${ROTATE_VAL}" >> "${CONFIG_TXT}"
|
|
fi
|
|
BOOT_CHANGED=true
|
|
fi
|
|
|
|
# Resolution
|
|
if [[ "${RESOLUTION}" != "${CURRENT_RESOLUTION}" ]]; then
|
|
RES_W="${RESOLUTION%%x*}"
|
|
RES_H="${RESOLUTION##*x}"
|
|
HDMI_MODE=""
|
|
case "${RES_W}x${RES_H}" in
|
|
1920x1080) HDMI_MODE=16 ;;
|
|
1280x720) HDMI_MODE=4 ;;
|
|
1680x1050) HDMI_MODE=58 ;;
|
|
1280x1024) HDMI_MODE=35 ;;
|
|
*) warn "Unknown resolution ${RESOLUTION}, skipping hdmi_mode" ;;
|
|
esac
|
|
if [[ -n "${HDMI_MODE}" ]]; then
|
|
HDMI_GROUP=1
|
|
if [[ "${RES_W}x${RES_H}" == "1680x1050" ]] || [[ "${RES_W}x${RES_H}" == "1280x1024" ]]; then
|
|
HDMI_GROUP=2
|
|
fi
|
|
for KEY_VAL in "hdmi_group=${HDMI_GROUP}" "hdmi_mode=${HDMI_MODE}"; do
|
|
KEY="${KEY_VAL%%=*}"
|
|
if grep -q "^${KEY}=" "${CONFIG_TXT}"; then
|
|
sed -i "s/^${KEY}=.*/${KEY_VAL}/" "${CONFIG_TXT}"
|
|
else
|
|
echo "${KEY_VAL}" >> "${CONFIG_TXT}"
|
|
fi
|
|
done
|
|
BOOT_CHANGED=true
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Restart service if requested
|
|
# ---------------------------------------------------------------------------
|
|
if [[ "${DO_RESTART}" == true ]]; then
|
|
info "Restarting vigilar-kiosk service"
|
|
systemctl restart vigilar-kiosk.service
|
|
echo "Service restarted."
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Done
|
|
# ---------------------------------------------------------------------------
|
|
info "Configuration updated!"
|
|
if [[ "${BOOT_CHANGED}" == true ]]; then
|
|
echo ""
|
|
echo " Boot config was changed. A reboot is required for display changes."
|
|
echo " Run: sudo reboot"
|
|
elif [[ "${DO_RESTART}" != true ]]; then
|
|
echo ""
|
|
echo " To apply URL changes: sudo systemctl restart vigilar-kiosk"
|
|
echo " For display changes: sudo reboot"
|
|
fi
|