librelad 853b489caa refactor(gluetun): move the network-routing feature into gluetun's folder
If it's gluetun code, it lives with gluetun. Both functions in
scripts/config/tags/processors/tags_processor_network_mode.sh manipulate gluetun
markers / gluetun's compose, so move them into containers/gluetun/scripts/
gluetun_network.sh and rename to the per-app-hook convention:

  tagsProcessorNetworkMode             -> appNetworkApplyMode_gluetun
  tagsProcessorGluetunForwardedPorts   -> appNetworkRegisterPorts_gluetun

Central call sites are now provider-agnostic — no "gluetun" literal anywhere:

- docker_config_setup_data.sh: an app routing via CFG_<APP>_NETWORK=<provider>
  triggers `appNetworkApplyMode_<provider>` + `appNetworkRegisterPorts_<provider>`
  via declare -F, so any future gateway provider plugs in with no engine edits.
- uninstall_app.sh: loops every `appNetworkRegisterPorts_*` hook (each self-skips
  when its provider isn't installed), so removing a routed app refreshes the
  right provider with no provider name in central code.

Delete tags_processor_network_mode.sh; regenerate arrays. Verified with stubs:
default mode no-ops, gluetun-routed app fires both hooks, gluetun itself is
skipped, unknown provider is silently no-op, uninstall loop calls registerPorts.

Drive-by cleanup: 9 stale "${X_scripts[@]}" array references in app_files.sh /
cli_files.sh (gluetun + headscale from this session's moves, plus 7 pre-existing:
command/ssl/swapfile/ufw/ufwd/user — all from older refactors that left them
behind). Each expanded to nothing at runtime (harmless), but they're dead
misleading refs. Cleaned both files; every remaining array ref now points to a
real files_*.sh.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Signed-off-by: librelad <librelad@digitalangels.vip>
2026-05-26 10:43:49 +01:00

127 lines
4.8 KiB
Bash
Executable File

#!/bin/bash
dockerUninstallApp()
{
local app_name="$1"
# Optional: delete the app's docker images too. Default false so a
# plain `libreportal app uninstall <app>` keeps cached images for a
# quick reinstall. The WebUI's Uninstall modal exposes this as the
# "Also delete docker image" checkbox.
local delete_images="${2:-false}"
local delete_tasks="${3:-false}"
local stored_app_name=$app_name
if [[ "$stored_app_name" == "" ]]; then
isError "No app_name provided, unable to continue..."
else
isHeader "Uninstalling $stored_app_name"
initializeAppVariables $stored_app_name;
((menu_number++))
echo ""
echo "---- $menu_number. Removing app where docker compose is installed"
echo ""
dockerComposeDownRemove $stored_app_name;
# App-specific uninstall hook. Host-installed apps (and any app needing
# teardown beyond the generic docker/DB cleanup) define an uninstall<App>
# function — it runs the app-specific bits (apt purge, systemd units,
# cscli state, ...) while the shared compose/data/DB/WebUI teardown below
# stays generic. The CLI and menu both route uninstalls through here, so
# this is the single point every uninstall passes through.
local app_name_ucfirst="$(tr '[:lower:]' '[:upper:]' <<< ${stored_app_name:0:1})${stored_app_name:1}"
local uninstallFuncName="uninstall${app_name_ucfirst}"
if declare -f "$uninstallFuncName" >/dev/null 2>&1; then
((menu_number++))
echo ""
echo "---- $menu_number. Running $stored_app_name-specific uninstall steps"
echo ""
"$uninstallFuncName"
fi
((menu_number++))
echo ""
if [[ "$delete_images" == "true" ]]; then
echo "---- $menu_number. Removing Docker images for the app"
echo ""
dockerRemoveAppImages $stored_app_name;
else
echo "---- $menu_number. Keeping Docker images (pass --delete-images to remove)"
echo ""
isNotice "Docker images for '$stored_app_name' left in place. A reinstall will reuse them."
fi
((menu_number++))
echo ""
echo "---- $menu_number. Deleting all app data from docker folder"
echo ""
dockerDeleteData $stored_app_name;
((menu_number++))
echo ""
echo "---- $menu_number. Removing unused Docker networks."
echo ""
dockerPruneAppNetworks $stored_app_name;
((menu_number++))
echo ""
echo "---- $menu_number. Removing app from the database"
echo ""
ipRemoveFromDatabase $stored_app_name;
portsRemoveFromDatabase $stored_app_name;
databaseUninstallApp $stored_app_name;
((menu_number++))
echo ""
echo "---- $menu_number. Updating the WebUI config file."
echo ""
webuiContainerSetup $stored_app_name uninstall;
# A removed app may have been routed through a network gateway (e.g.
# gluetun); let each provider refresh its forwarded-port registration.
# Each hook self-skips when its provider isn't installed.
local _np_fn
for _np_fn in $(compgen -A function 2>/dev/null | grep '^appNetworkRegisterPorts_'); do
"$_np_fn"
done
if [[ "$delete_tasks" == "true" ]]; then
((menu_number++))
echo ""
echo "---- $menu_number. Removing related task history"
echo ""
local _tasks_dir="${containers_dir}libreportal/frontend/data/tasks"
local _removed=0
if [[ -d "$_tasks_dir" ]]; then
for _tf in "$_tasks_dir"/task_*.json; do
[[ ! -f "$_tf" ]] && continue
# Skip in-flight tasks — that includes the uninstall task
# we're currently inside, plus anything queued or running.
if runFileOp grep -qE "\"status\"[[:space:]]*:[[:space:]]*\"(running|queued|pending)\"" "$_tf" 2>/dev/null; then
continue
fi
if runFileOp grep -q "\"app\"[[:space:]]*:[[:space:]]*\"${stored_app_name}\"" "$_tf" 2>/dev/null; then
local _id=$(basename "$_tf" .json)
runFileOp rm -f "$_tf" "$_tasks_dir/${_id}.log" "$_tasks_dir/${_id}.cancel" 2>/dev/null
_removed=$((_removed + 1))
fi
done
fi
isSuccessful "Removed $_removed task record(s) for $stored_app_name (in-flight task left for the WebUI to clean up after completion)."
fi
((menu_number++))
echo ""
isSuccessful "$stored_app_name has been removed from your system!"
echo ""
menu_number=0
cd
fi
}