dockerInstallApp built the installer name by upper-casing only the first letter of the slug (libreportal -> installLibreportal), which can't match camelCase installers like installLibrePortal. After the EasyDocker -> LibrePortal rename this broke `libreportal` installs with "installLibreportal: command not found". If the naive name isn't a defined function, resolve it case-insensitively against the function table (compgen -A function), and fail with a clear message if nothing matches. Works for any compound brand/app name. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Signed-off-by: librelad <librelad@digitalangels.vip>
66 lines
2.6 KiB
Bash
Executable File
66 lines
2.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
dockerInstallApp()
|
|
{
|
|
local app_name="$1"
|
|
local config_variables="$2"
|
|
local reset_network="$3"
|
|
|
|
local app_name_ucfirst="$(tr '[:lower:]' '[:upper:]' <<< ${app_name:0:1})${app_name:1}"
|
|
local installFuncName="install${app_name_ucfirst}"
|
|
|
|
# App slugs are lowercase (e.g. "libreportal"), but installer functions keep
|
|
# their own internal capitalisation (e.g. installLibrePortal) — capitalising
|
|
# only the first letter can't reproduce that camelCase. If the naive name
|
|
# isn't a defined function, resolve it case-insensitively against the real
|
|
# function table so any compound brand/app name (LibrePortal, …) just works.
|
|
if ! declare -F "$installFuncName" >/dev/null 2>&1; then
|
|
local _resolved
|
|
_resolved="$(compgen -A function | grep -ixF "install${app_name}" | head -n1)"
|
|
[[ -n "$_resolved" ]] && installFuncName="$_resolved"
|
|
fi
|
|
|
|
if ! declare -F "$installFuncName" >/dev/null 2>&1; then
|
|
isError "No installer function found for app '${app_name}' (looked for ${installFuncName})."
|
|
return 1
|
|
fi
|
|
|
|
if [[ "$reset_network" == "true" ]]; then
|
|
export LIBREPORTAL_RESET_NETWORK=1
|
|
if declare -f ipRemoveFromDatabase >/dev/null 2>&1; then
|
|
ipRemoveFromDatabase "$app_name"
|
|
fi
|
|
if declare -f portsRemoveFromDatabase >/dev/null 2>&1; then
|
|
portsRemoveFromDatabase "$app_name"
|
|
fi
|
|
isNotice "Network reset: cleared previous IP/port allocations for $app_name."
|
|
fi
|
|
|
|
# Silently update the template config so apps.json regen reflects the saved
|
|
# values. The visible "Updated CFG_X" lines come from the deployed-config
|
|
# pass inside dockerConfigSetupToContainer.
|
|
if [[ -n "$config_variables" ]]; then
|
|
local template_config="$install_containers_dir$app_name/$app_name.config"
|
|
if [[ -f "$template_config" ]]; then
|
|
IFS='|' read -ra config_pairs <<< "$config_variables"
|
|
for pair in "${config_pairs[@]}"; do
|
|
if [[ "$pair" =~ ^(CFG_[A-Z0-9_]+)=(.*)$ ]]; then
|
|
local _value="${BASH_REMATCH[2]//%7C/|}"
|
|
updateConfigOption "${BASH_REMATCH[1]}" "$_value" "$template_config" >/dev/null
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
|
|
# Create a variable with the name of $app_name and set its value to "i"
|
|
declare "${app_name}=i"
|
|
|
|
"${installFuncName}" "$config_variables"
|
|
|
|
if declare -f webuiGenerateLibrePortalConfig >/dev/null 2>&1; then
|
|
webuiGenerateLibrePortalConfig >/dev/null 2>&1 || true
|
|
fi
|
|
|
|
unset LIBREPORTAL_RESET_NETWORK
|
|
}
|