LibrePortal/scripts/docker/app/functions/function_app_tool.sh
librelad 875a60f90f LibrePortal v0.1.0 — initial release
A free, open, self-hosted app platform (GNU AGPLv3): one-click app deploys,
Traefik reverse proxy with automatic SSL, rootless Docker support, gluetun
VPN routing, and a web dashboard to manage it all.

Free & open forever to self-host; optional paid hosted services fund it.
See PROMISE.md.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

Signed-off-by: librelad <librelad@digitalangels.vip>
2026-05-21 20:37:54 +01:00

76 lines
2.4 KiB
Bash

#!/bin/bash
# Per-app "tools" dispatcher.
#
# Each container/<app>/<app>.sh that exposes Tools-tab actions defines a
# function named `<app>Tool` (e.g. `gluetunTool`) that takes two args:
# $1 = tool id (matches an entry in <app>/<app>.tools.json)
# $2 = pipe-encoded args string from the modal, e.g. "duration=5|mode=fast"
#
# Tool args parsing helper: see toolArgsGet below.
dockerAppRunTool()
{
local app_name="$1"
local tool_name="$2"
local tool_args="$3"
# One-file-per-tool convention: tool id `<verb>_<noun>` resolves to
# function `app<AppName><PascalCaseToolId>`. Each tool lives at
# scripts/app/containers/<app>/<app>_<tool_id>.sh.
#
# Examples:
# gluetun + refresh_providers → appGluetunRefreshProviders
# mattermost + reset_password → appMattermostResetPassword
local app_name_ucfirst="$(tr '[:lower:]' '[:upper:]' <<< ${app_name:0:1})${app_name:1}"
local tool_pascal=""
local _word
local IFS='_'
for _word in $tool_name; do
tool_pascal+="$(tr '[:lower:]' '[:upper:]' <<< ${_word:0:1})${_word:1}"
done
unset IFS
local toolFuncName="app${app_name_ucfirst}${tool_pascal}"
if ! declare -f "$toolFuncName" >/dev/null 2>&1; then
isError "App '$app_name' has no tool '$tool_name' (missing function $toolFuncName — expected in scripts/app/containers/$app_name/$app_name_${tool_name}.sh)."
return 1
fi
initializeAppVariables "$app_name"
isHeader "Running tool '$tool_name' for $app_name"
"$toolFuncName" "$tool_args"
local tool_rc=$?
# Refresh apps.json so the WebUI sees any CFG_* the tool just wrote.
# Targeted patch (jq) instead of full regen — ~30x faster.
if declare -F webuiPatchAppConfigJson >/dev/null 2>&1; then
webuiPatchAppConfigJson "$app_name" >/dev/null 2>&1 || true
elif declare -F webuiGenerateLibrePortalConfig >/dev/null 2>&1; then
webuiGenerateLibrePortalConfig >/dev/null 2>&1 || true
fi
return $tool_rc
}
# Read a single value out of the pipe-encoded args string. Usage:
# local val
# val=$(toolArgsGet "$tool_args" "duration")
toolArgsGet()
{
local args="$1"
local key="$2"
local pair value
IFS='|' read -ra _pairs <<< "$args"
for pair in "${_pairs[@]}"; do
if [[ "$pair" == "$key="* ]]; then
value="${pair#${key}=}"
printf '%s' "$value"
return 0
fi
done
return 1
}