New Addons -> Web UI: a small Node/Express app (webui/) installed as a systemd service running as $KIOSK_USER, giving a browser-based editor for Sites & Page Timing, Display & Interaction, and Password Protection & Lockout - the three Core Settings menus that are pure config.json read/write with no privileged system mutation involved. Runs with no sudo at all, since config.json is already owned by $KIOSK_USER. webui/lib/config.js re-implements lib/config.sh's exact schema and merge-on-save contract in JS (kiosk-app/main.js already reads the same config.json directly in JS, so this isn't a new pattern), so it can never silently clobber fields it doesn't track - the same bug previously fixed in lib/config.sh's own history. No login of its own by design: Authelia runs elsewhere, and the expectation is a reverse proxy (e.g. Caddy) with Authelia forward-auth in front of it, the same way other self-hosted apps get protected - Authelia integration is explicitly out of scope for this repo. Deliberately narrow scope for this first pass: WiFi, Timezone, Power/Display/Quiet Hours, Complete Uninstall, every other addon, and everything in Advanced remain terminal-only, since a network-facing process shouldn't be handed sudo-level system mutation without a lot more thought than this pass gives it. Wired into Complete Uninstall (webui_do_uninstall) and Clone Settings (addon-presence detection) the same way every other addon is. This is the single-kiosk piece of the web-based GUI this repo's "Modular Management" notes have mentioned for a while - a central multi-kiosk fleet dashboard is an intentional follow-up. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VfsFSoRqfbRG7XAg5RoE7e
155 lines
5.7 KiB
Bash
155 lines
5.7 KiB
Bash
#!/bin/bash
|
|
################################################################################
|
|
# menus/complete_uninstall.sh - "Complete Uninstall" (Core Settings): full
|
|
# teardown, returning the machine to its pre-kiosk state.
|
|
#
|
|
# Composed from every other addon's own silent uninstall helper
|
|
# (cups_do_uninstall, vnc_do_uninstall, wireguard_do_uninstall,
|
|
# tailscale_do_uninstall, netbird_do_uninstall, lms_do_uninstall,
|
|
# squeezelite_do_uninstall, asterisk_intercom_do_uninstall,
|
|
# webui_do_uninstall, power_schedule_do_remove_all,
|
|
# emergency_hotspot_do_disable) instead of
|
|
# re-implementing removal logic for each addon a second time here - if an
|
|
# addon's uninstall logic changes, this picks it up automatically. Only
|
|
# the pieces no single addon owns - the kiosk user/files, Node.js/
|
|
# LightDM/Openbox, polkit rules, leftover systemd units - are handled
|
|
# directly below, same as the legacy script.
|
|
#
|
|
# Ordering matters: every addon teardown runs before the kiosk user is
|
|
# removed, because asterisk_intercom_do_uninstall still needs
|
|
# `id -u "$KIOSK_USER"` to resolve that user's systemd --user session.
|
|
#
|
|
# After this runs, the kiosk user (and therefore is_kiosk_installed) is
|
|
# gone - install.sh itself will refuse to start against this machine
|
|
# again until a fresh install re-provisions it. That's intentional:
|
|
# there is nothing left here for this tool to manage.
|
|
#
|
|
# Depends on: lib/menu.sh, lib/config.sh, and every menus/addon_*.sh /
|
|
# menus/power_schedule.sh / menus/advanced_emergency_hotspot.sh being
|
|
# sourced first (for the *_do_uninstall helpers above).
|
|
################################################################################
|
|
|
|
complete_uninstall_status() {
|
|
echo "⚠ Removes the kiosk user, every addon, and returns this machine"
|
|
echo " to its pre-kiosk state. Cannot be undone."
|
|
}
|
|
|
|
complete_uninstall_menu_builder() {
|
|
MENU_LABELS=("Completely uninstall the kiosk")
|
|
MENU_HANDLERS=(action_complete_uninstall)
|
|
}
|
|
|
|
complete_uninstall_menu() {
|
|
run_menu "COMPLETE UNINSTALL" complete_uninstall_menu_builder complete_uninstall_status
|
|
}
|
|
|
|
################################################################################
|
|
# Actions
|
|
################################################################################
|
|
|
|
action_complete_uninstall() {
|
|
echo
|
|
echo "⚠️ This will COMPLETELY REMOVE:"
|
|
echo " • Kiosk user and all data"
|
|
echo " • All kiosk configuration and sites"
|
|
echo " • All Electron/Node.js installations"
|
|
echo " • All browser caches and data"
|
|
echo " • CUPS printer system"
|
|
echo " • Squeezelite and LMS (Lyrion Music Server)"
|
|
echo " • Remote access (VNC, WireGuard, Tailscale, Netbird)"
|
|
echo " • Asterisk Intercom (Baresip)"
|
|
echo " • Web UI"
|
|
echo " • LightDM and Openbox"
|
|
echo " • All kiosk schedules and services"
|
|
echo " • Emergency hotspot configuration"
|
|
echo
|
|
echo "⚠️ This CANNOT be undone!"
|
|
echo
|
|
local confirm
|
|
confirm=$(ask_text "Type UNINSTALL to confirm" "")
|
|
if [[ "$confirm" != "UNINSTALL" ]]; then
|
|
echo "Cancelled"
|
|
pause
|
|
return
|
|
fi
|
|
|
|
echo
|
|
echo "Beginning complete uninstall..."
|
|
|
|
echo "[1/12] Stopping kiosk display..."
|
|
sudo systemctl stop lightdm 2>/dev/null || true
|
|
|
|
echo "[2/12] Removing addons..."
|
|
cups_do_uninstall
|
|
vnc_do_uninstall
|
|
wireguard_do_uninstall
|
|
tailscale_do_uninstall
|
|
netbird_do_uninstall
|
|
lms_do_uninstall purge
|
|
squeezelite_do_uninstall
|
|
asterisk_intercom_do_uninstall purge
|
|
webui_do_uninstall
|
|
|
|
echo "[3/12] Removing schedules and emergency hotspot..."
|
|
power_schedule_do_remove_all
|
|
emergency_hotspot_do_disable
|
|
|
|
# Must come after every addon teardown above - Asterisk Intercom's
|
|
# helper still needs this user to resolve its systemd --user session.
|
|
echo "[4/12] Removing kiosk user..."
|
|
if id "$KIOSK_USER" &>/dev/null; then
|
|
sudo pkill -u "$KIOSK_USER" 2>/dev/null || true
|
|
sudo userdel -r "$KIOSK_USER" 2>/dev/null || true
|
|
log_success "Kiosk user removed"
|
|
fi
|
|
|
|
echo "[5/12] Removing kiosk files..."
|
|
sudo rm -rf "$KIOSK_DIR"
|
|
sudo rm -rf "$KIOSK_HOME"
|
|
|
|
echo "[6/12] Removing remaining systemd units..."
|
|
sudo rm -f "$SYSTEMD_DIR"/kiosk-*.service
|
|
sudo rm -f "$SYSTEMD_DIR"/kiosk-*.timer
|
|
sudo systemctl daemon-reload 2>/dev/null || true
|
|
|
|
echo "[7/12] Removing remaining scripts..."
|
|
sudo rm -f "$BIN_DIR"/kiosk-*
|
|
sudo rm -f /etc/udev/rules.d/99-kiosk-hotplug.rules
|
|
sudo udevadm control --reload-rules 2>/dev/null || true
|
|
|
|
echo "[8/12] Removing Node.js..."
|
|
sudo apt-get purge -y nodejs npm 2>/dev/null || true
|
|
sudo rm -rf /usr/local/lib/node_modules
|
|
sudo rm -rf /usr/local/bin/node
|
|
sudo rm -rf /usr/local/bin/npm
|
|
|
|
echo "[9/12] Removing LightDM and Openbox..."
|
|
sudo systemctl disable lightdm 2>/dev/null || true
|
|
sudo apt-get purge -y lightdm openbox 2>/dev/null || true
|
|
|
|
echo "[10/12] Removing polkit rules..."
|
|
sudo rm -f "$POLKIT_DIR/kiosk-power.pkla"
|
|
sudo rm -f "$POLKIT_DIR/kiosk-printing.pkla"
|
|
|
|
echo "[11/12] Re-enabling virtual consoles..."
|
|
for i in {1..8}; do
|
|
sudo systemctl unmask "getty@tty${i}.service" 2>/dev/null || true
|
|
done
|
|
sudo systemctl daemon-reload 2>/dev/null || true
|
|
|
|
echo "[12/12] Cleaning up packages..."
|
|
sudo apt-get autoremove -y 2>/dev/null || true
|
|
sudo apt-get autoclean 2>/dev/null || true
|
|
|
|
echo
|
|
log_success "Kiosk completely uninstalled"
|
|
echo "The system has been returned to its pre-kiosk state."
|
|
echo "You may want to reboot to ensure all changes take effect."
|
|
echo
|
|
if ask_yes_no "Reboot now?" "n"; then
|
|
echo "Rebooting in 3 seconds..."
|
|
sleep 3
|
|
sudo reboot
|
|
fi
|
|
}
|