diff --git a/Readme.md b/Readme.md index d9cfe56..dbe9e81 100644 --- a/Readme.md +++ b/Readme.md @@ -1255,7 +1255,7 @@ terminal menu and the web UI, so they can't drift apart). Settings): the last of the "destructive trio." Composed from every addon's own `*_do_uninstall` helper instead of re-implementing removal a second time — see "Recent Updates (v2.12.0)" below. -- `menus/fleet_profile.sh` — **Fleet Profile** (Advanced): export/apply +- `menus/clone_settings.sh` — **Clone Settings** (Advanced): export/apply the portable parts of `config.json` across several kiosks that should share the same settings. New, not a legacy port — deliberately never copies machine-bound credentials (Authelia, WireGuard, Asterisk @@ -1279,7 +1279,7 @@ Audio — none of that has moved yet; Complete Uninstall *is* now migrated, but Upgrade and Full Reinstall are staying put — both are coupled to this file's own heredoc self-extraction of main.js/ preload.js/etc, which has no modular equivalent). The legacy Export/ -Import Settings is also staying as-is; Fleet Profile is a new, +Import Settings is also staying as-is; Clone Settings is a new, narrower feature alongside it, not a replacement for it — see "Recent Updates (v2.13.0)" below for why they're not the same thing. Both copies coexist deliberately: the old ones stay until enough of @@ -1316,7 +1316,7 @@ full migration pass. **Current Version:** 2.13.0 **Recent Updates (v2.13.0):** -- **New: Fleet Profile** (Advanced → Fleet Profile) — not a port of the legacy Export/Import Settings, a narrower MVP for the "set up one kiosk, then stamp out a dozen more like it" use case. Exports the portable parts of `config.json` (sites, display/touch/navigation, lockout, password protection) to a JSON file; applies that file to any other already-installed kiosk. +- **New: Clone Settings** (Advanced → Clone Settings) — not a port of the legacy Export/Import Settings, a narrower MVP for the "set up one kiosk, then stamp out a dozen more like it" use case. Exports the portable parts of `config.json` (sites, display/touch/navigation, lockout, password protection) to a JSON file; applies that file to any other already-installed kiosk. - **Deliberately does not copy machine-bound credentials**, because copying them would be actively wrong: Authelia's encrypted password is keyed off `/etc/machine-id` and decrypts to garbage on another machine; a WireGuard private key is a device identity, and reusing one across machines is a peer conflict, not a saving; most Asterisk PBXes reject two simultaneous registrations to the same extension. Applying a profile prints these as an explicit "needs a human" checklist instead of silently skipping or cloning them. - Records which addons were present at export time and reports which are/aren't present on the target — doesn't install anything itself. Non-interactive addon installation (so applying a profile needs zero prompts — scriptable over SSH to a whole fleet) is a deliberate follow-up, not bundled into this MVP. diff --git a/install.sh b/install.sh index 2d40946..279673b 100755 --- a/install.sh +++ b/install.sh @@ -30,8 +30,8 @@ # manual update, fix blank screen), Factory Reset # (menus/advanced_factory_reset.sh), Virtual Consoles # (menus/advanced_virtual_consoles.sh), Emergency Hotspot -# (menus/advanced_emergency_hotspot.sh), Fleet Profile -# (menus/fleet_profile.sh - export/apply portable settings across +# (menus/advanced_emergency_hotspot.sh), Clone Settings +# (menus/clone_settings.sh - export/apply portable settings across # several kiosks; deliberately excludes machine-bound credentials # like Authelia/WireGuard/Asterisk Intercom - see the file header). # @@ -87,9 +87,9 @@ source "$SCRIPT_DIR/menus/advanced_emergency_hotspot.sh" # Sourced last: composes the *_do_uninstall/*_do_remove_all/*_do_disable # helpers defined in every file above it. source "$SCRIPT_DIR/menus/complete_uninstall.sh" -# shellcheck source=menus/fleet_profile.sh +# shellcheck source=menus/clone_settings.sh # Also composes detection helpers (*_is_installed) from every addon above. -source "$SCRIPT_DIR/menus/fleet_profile.sh" +source "$SCRIPT_DIR/menus/clone_settings.sh" ################################################################################ # Preflight @@ -164,8 +164,8 @@ addons_menu() { } advanced_menu_builder() { - MENU_LABELS=("Diagnostics" "Electron Maintenance" "Factory Reset" "Virtual Consoles" "Emergency Hotspot" "Fleet Profile") - MENU_HANDLERS=(diagnostics_menu advanced_electron_menu advanced_factory_reset_menu advanced_virtual_consoles_menu advanced_emergency_hotspot_menu fleet_profile_menu) + MENU_LABELS=("Diagnostics" "Electron Maintenance" "Factory Reset" "Virtual Consoles" "Emergency Hotspot" "Clone Settings") + MENU_HANDLERS=(diagnostics_menu advanced_electron_menu advanced_factory_reset_menu advanced_virtual_consoles_menu advanced_emergency_hotspot_menu clone_settings_menu) } advanced_menu() { diff --git a/menus/fleet_profile.sh b/menus/clone_settings.sh similarity index 93% rename from menus/fleet_profile.sh rename to menus/clone_settings.sh index 776000c..b61c0b1 100644 --- a/menus/fleet_profile.sh +++ b/menus/clone_settings.sh @@ -1,6 +1,6 @@ #!/bin/bash ################################################################################ -# menus/fleet_profile.sh - "Fleet Profile" (Advanced): export the portable +# menus/clone_settings.sh - "Clone Settings" (Advanced): export the portable # parts of this kiosk's configuration to a JSON file, and apply that file # to other already-installed kiosks - for standing up several kiosks that # should share the same sites/settings. @@ -32,20 +32,20 @@ # being sourced first (for the *_is_installed detection helpers). ################################################################################ -fleet_profile_status() { +clone_settings_status() { echo "Exports/applies sites, display, navigation, and lockout settings" echo "between already-installed kiosks. Addon credentials that are" echo "bound to one machine (Authelia, WireGuard, Asterisk Intercom)" echo "are never copied - see the checklist after applying a profile." } -fleet_profile_menu_builder() { - MENU_LABELS=("Export fleet profile" "Apply fleet profile") - MENU_HANDLERS=(action_export_fleet_profile action_apply_fleet_profile) +clone_settings_menu_builder() { + MENU_LABELS=("Export settings" "Apply settings (clone)") + MENU_HANDLERS=(action_export_clone_settings action_apply_clone_settings) } -fleet_profile_menu() { - run_menu "FLEET PROFILE" fleet_profile_menu_builder fleet_profile_status +clone_settings_menu() { + run_menu "CLONE SETTINGS" clone_settings_menu_builder clone_settings_status } ################################################################################ @@ -53,7 +53,7 @@ fleet_profile_menu() { ################################################################################ # JSON array of addon identifiers currently present on this machine. -fleet_detect_addons() { +clone_detect_addons() { local addons=() cups_is_installed 2>/dev/null && addons+=("cups") @@ -82,7 +82,7 @@ fleet_detect_addons() { # Actions ################################################################################ -action_export_fleet_profile() { +action_export_clone_settings() { echo if ! sudo -u "$KIOSK_USER" test -f "$CONFIG_PATH" 2>/dev/null; then log_error "config.json not found at $CONFIG_PATH - configure sites/settings first" @@ -91,7 +91,7 @@ action_export_fleet_profile() { fi local out_path - out_path=$(ask_text "Export profile to" "$HOME/kiosk-fleet-profile.json") + out_path=$(ask_text "Export profile to" "$HOME/kiosk-clone-settings.json") local raw_config raw_config=$(sudo -u "$KIOSK_USER" cat "$CONFIG_PATH" 2>/dev/null) @@ -105,7 +105,7 @@ action_export_fleet_profile() { settings=$(echo "$raw_config" | jq 'del(.autheliaURL, .autheliaUsername, .autheliaEncryptedPassword)') local addons_present - addons_present=$(fleet_detect_addons) + addons_present=$(clone_detect_addons) jq -n \ --argjson settings "$settings" \ @@ -114,7 +114,7 @@ action_export_fleet_profile() { '{profile_version: 1, script_version: $script_version, settings: $settings, addons_present: $addons}' \ > "$out_path" - log_success "Fleet profile exported to $out_path" + log_success "Settings exported to $out_path" echo echo "Included: sites, display/touch/navigation settings, lockout," echo "password protection (SHA-256 hash only)." @@ -127,7 +127,7 @@ action_export_fleet_profile() { pause } -action_apply_fleet_profile() { +action_apply_clone_settings() { echo local in_path in_path=$(ask_text "Profile file to apply" "") diff --git a/ubuntu-based-kiosk.sh b/ubuntu-based-kiosk.sh index 59e6c13..9ebae3a 100644 --- a/ubuntu-based-kiosk.sh +++ b/ubuntu-based-kiosk.sh @@ -3,10 +3,10 @@ ### Ubuntu Based Kiosk v2.13.0 ### ################################################################################ # -# RELEASE v2.13.0 - Fleet Profile: New MVP for Standing Up Several +# RELEASE v2.13.0 - Clone Settings: New MVP for Standing Up Several # Kiosks with the Same Settings -# - New in ./install.sh's Advanced menu: Fleet Profile -# (menus/fleet_profile.sh). Not a port of the legacy Export/Import +# - New in ./install.sh's Advanced menu: Clone Settings +# (menus/clone_settings.sh). Not a port of the legacy Export/Import # Settings - a narrower, deliberately-scoped feature for the "set up # one kiosk, then stamp out a dozen more like it" use case: export the # portable parts of config.json (sites, display/touch/navigation,