Rename Fleet Profile to Clone Settings per feedback

menus/fleet_profile.sh -> menus/clone_settings.sh. Same functionality
(export/apply portable config.json settings between kiosks); renamed
the file, every function, the menu label, and the on-disk default
profile filename to match. No behavior change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VfsFSoRqfbRG7XAg5RoE7e
This commit is contained in:
Claude
2026-08-19 04:29:13 +00:00
parent 5d56c667da
commit 1c9447bc5d
4 changed files with 25 additions and 25 deletions
+3 -3
View File
@@ -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 Settings): the last of the "destructive trio." Composed from every
addon's own `*_do_uninstall` helper instead of re-implementing addon's own `*_do_uninstall` helper instead of re-implementing
removal a second time — see "Recent Updates (v2.12.0)" below. 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 the portable parts of `config.json` across several kiosks that should
share the same settings. New, not a legacy port — deliberately never share the same settings. New, not a legacy port — deliberately never
copies machine-bound credentials (Authelia, WireGuard, Asterisk 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 migrated, but Upgrade and Full Reinstall are staying put — both are
coupled to this file's own heredoc self-extraction of main.js/ coupled to this file's own heredoc self-extraction of main.js/
preload.js/etc, which has no modular equivalent). The legacy Export/ 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 narrower feature alongside it, not a replacement for it — see "Recent
Updates (v2.13.0)" below for why they're not the same thing. Updates (v2.13.0)" below for why they're not the same thing.
Both copies coexist deliberately: the old ones stay until enough of Both copies coexist deliberately: the old ones stay until enough of
@@ -1316,7 +1316,7 @@ full migration pass.
**Current Version:** 2.13.0 **Current Version:** 2.13.0
**Recent Updates (v2.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. - **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. - 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.
+6 -6
View File
@@ -30,8 +30,8 @@
# manual update, fix blank screen), Factory Reset # manual update, fix blank screen), Factory Reset
# (menus/advanced_factory_reset.sh), Virtual Consoles # (menus/advanced_factory_reset.sh), Virtual Consoles
# (menus/advanced_virtual_consoles.sh), Emergency Hotspot # (menus/advanced_virtual_consoles.sh), Emergency Hotspot
# (menus/advanced_emergency_hotspot.sh), Fleet Profile # (menus/advanced_emergency_hotspot.sh), Clone Settings
# (menus/fleet_profile.sh - export/apply portable settings across # (menus/clone_settings.sh - export/apply portable settings across
# several kiosks; deliberately excludes machine-bound credentials # several kiosks; deliberately excludes machine-bound credentials
# like Authelia/WireGuard/Asterisk Intercom - see the file header). # 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 # Sourced last: composes the *_do_uninstall/*_do_remove_all/*_do_disable
# helpers defined in every file above it. # helpers defined in every file above it.
source "$SCRIPT_DIR/menus/complete_uninstall.sh" 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. # 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 # Preflight
@@ -164,8 +164,8 @@ addons_menu() {
} }
advanced_menu_builder() { advanced_menu_builder() {
MENU_LABELS=("Diagnostics" "Electron Maintenance" "Factory Reset" "Virtual Consoles" "Emergency Hotspot" "Fleet Profile") 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 fleet_profile_menu) MENU_HANDLERS=(diagnostics_menu advanced_electron_menu advanced_factory_reset_menu advanced_virtual_consoles_menu advanced_emergency_hotspot_menu clone_settings_menu)
} }
advanced_menu() { advanced_menu() {
@@ -1,6 +1,6 @@
#!/bin/bash #!/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 # 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 # to other already-installed kiosks - for standing up several kiosks that
# should share the same sites/settings. # should share the same sites/settings.
@@ -32,20 +32,20 @@
# being sourced first (for the *_is_installed detection helpers). # 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 "Exports/applies sites, display, navigation, and lockout settings"
echo "between already-installed kiosks. Addon credentials that are" echo "between already-installed kiosks. Addon credentials that are"
echo "bound to one machine (Authelia, WireGuard, Asterisk Intercom)" echo "bound to one machine (Authelia, WireGuard, Asterisk Intercom)"
echo "are never copied - see the checklist after applying a profile." echo "are never copied - see the checklist after applying a profile."
} }
fleet_profile_menu_builder() { clone_settings_menu_builder() {
MENU_LABELS=("Export fleet profile" "Apply fleet profile") MENU_LABELS=("Export settings" "Apply settings (clone)")
MENU_HANDLERS=(action_export_fleet_profile action_apply_fleet_profile) MENU_HANDLERS=(action_export_clone_settings action_apply_clone_settings)
} }
fleet_profile_menu() { clone_settings_menu() {
run_menu "FLEET PROFILE" fleet_profile_menu_builder fleet_profile_status 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. # JSON array of addon identifiers currently present on this machine.
fleet_detect_addons() { clone_detect_addons() {
local addons=() local addons=()
cups_is_installed 2>/dev/null && addons+=("cups") cups_is_installed 2>/dev/null && addons+=("cups")
@@ -82,7 +82,7 @@ fleet_detect_addons() {
# Actions # Actions
################################################################################ ################################################################################
action_export_fleet_profile() { action_export_clone_settings() {
echo echo
if ! sudo -u "$KIOSK_USER" test -f "$CONFIG_PATH" 2>/dev/null; then 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" log_error "config.json not found at $CONFIG_PATH - configure sites/settings first"
@@ -91,7 +91,7 @@ action_export_fleet_profile() {
fi fi
local out_path 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 local raw_config
raw_config=$(sudo -u "$KIOSK_USER" cat "$CONFIG_PATH" 2>/dev/null) 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)') settings=$(echo "$raw_config" | jq 'del(.autheliaURL, .autheliaUsername, .autheliaEncryptedPassword)')
local addons_present local addons_present
addons_present=$(fleet_detect_addons) addons_present=$(clone_detect_addons)
jq -n \ jq -n \
--argjson settings "$settings" \ --argjson settings "$settings" \
@@ -114,7 +114,7 @@ action_export_fleet_profile() {
'{profile_version: 1, script_version: $script_version, settings: $settings, addons_present: $addons}' \ '{profile_version: 1, script_version: $script_version, settings: $settings, addons_present: $addons}' \
> "$out_path" > "$out_path"
log_success "Fleet profile exported to $out_path" log_success "Settings exported to $out_path"
echo echo
echo "Included: sites, display/touch/navigation settings, lockout," echo "Included: sites, display/touch/navigation settings, lockout,"
echo "password protection (SHA-256 hash only)." echo "password protection (SHA-256 hash only)."
@@ -127,7 +127,7 @@ action_export_fleet_profile() {
pause pause
} }
action_apply_fleet_profile() { action_apply_clone_settings() {
echo echo
local in_path local in_path
in_path=$(ask_text "Profile file to apply" "") in_path=$(ask_text "Profile file to apply" "")
+3 -3
View File
@@ -3,10 +3,10 @@
### Ubuntu Based Kiosk v2.13.0 ### ### 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 # Kiosks with the Same Settings
# - New in ./install.sh's Advanced menu: Fleet Profile # - New in ./install.sh's Advanced menu: Clone Settings
# (menus/fleet_profile.sh). Not a port of the legacy Export/Import # (menus/clone_settings.sh). Not a port of the legacy Export/Import
# Settings - a narrower, deliberately-scoped feature for the "set up # Settings - a narrower, deliberately-scoped feature for the "set up
# one kiosk, then stamp out a dozen more like it" use case: export the # one kiosk, then stamp out a dozen more like it" use case: export the
# portable parts of config.json (sites, display/touch/navigation, # portable parts of config.json (sites, display/touch/navigation,