Replace "[installed]" text with an install count "[N]"
"[installed]" was 11 characters of an already-tight 78-column checklist row, most of the reason the marker had so little room to spare before whiptail's width truncation silently dropped it (previous commit). "[N]" says the same thing in 3 characters — and for services that support CLAUDE.md's multi-instance pattern (a base install plus any number of "<name>-<suffix>" siblings, e.g. two separate mattermost instances), it's more informative than a flat "installed": N > 1 means several instances exist, not just one. Add install_count() alongside is_installed() in setup.sh: the default case counts $DOCKER_DIR/<name> plus any $DOCKER_DIR/<name>-* siblings; the specially-cased services (asterisk, wordpress, etc.) either already count sites directly (wordpress) or aren't part of the multi-instance pattern, so they just mirror is_installed() as 0 or 1. Wired into the whiptail checklist, the non-whiptail plain-text fallback, and --status.
This commit is contained in:
@@ -109,6 +109,28 @@ is_installed() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# How many instances of a service are installed — most services here are
|
||||||
|
# single-instance, but several support the multi-instance pattern from
|
||||||
|
# CLAUDE.md (a base install plus any number of "<name>-<suffix>" siblings,
|
||||||
|
# e.g. mattermost + mattermost-team-b). Only the default case knows that
|
||||||
|
# naming convention; the specially-cased services above aren't part of the
|
||||||
|
# multi-instance pattern (wordpress is the one exception and already counts
|
||||||
|
# sites directly), so for those this just mirrors is_installed() as 0 or 1.
|
||||||
|
install_count() {
|
||||||
|
case "$1" in
|
||||||
|
base|glow|crowdsec|security-dashboard|kdeconnect|silent-send|sync-cc|sky-cam|sky-cam-frigate|asterisk|pstn-trunk|sms-inbound|ssh-config)
|
||||||
|
is_installed "$1" && echo 1 || echo 0 ;;
|
||||||
|
wordpress)
|
||||||
|
find "$DOCKER_DIR" -mindepth 1 -maxdepth 1 -name 'wordpress-*' -type d 2>/dev/null | wc -l ;;
|
||||||
|
*)
|
||||||
|
local c=0
|
||||||
|
[ -e "$DOCKER_DIR/$1" ] && c=1
|
||||||
|
c=$((c + $(find "$DOCKER_DIR" -mindepth 1 -maxdepth 1 -name "$1-*" -type d 2>/dev/null | wc -l)))
|
||||||
|
echo "$c"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
run_service() {
|
run_service() {
|
||||||
local name="$1"
|
local name="$1"
|
||||||
if [ -n "${SERVICE_ALIAS[$name]:-}" ]; then
|
if [ -n "${SERVICE_ALIAS[$name]:-}" ]; then
|
||||||
@@ -139,13 +161,14 @@ list_services() {
|
|||||||
# the "[installed]" suffix off-screen without it being obvious that's what
|
# the "[installed]" suffix off-screen without it being obvious that's what
|
||||||
# happened.
|
# happened.
|
||||||
print_status() {
|
print_status() {
|
||||||
local g name marker
|
local g name marker count
|
||||||
while IFS= read -r g; do
|
while IFS= read -r g; do
|
||||||
echo ""; echo "── ${g^^} ──"
|
echo ""; echo "── ${g^^} ──"
|
||||||
while IFS= read -r name; do
|
while IFS= read -r name; do
|
||||||
|
count="$(install_count "$name")"
|
||||||
marker="not installed"
|
marker="not installed"
|
||||||
is_installed "$name" && marker="INSTALLED"
|
[ "$count" -gt 0 ] && marker="INSTALLED (x$count)"
|
||||||
printf " %-20s %-12s %s\n" "$name" "$marker" "${SERVICE_DESC[$name]}"
|
printf " %-20s %-16s %s\n" "$name" "$marker" "${SERVICE_DESC[$name]}"
|
||||||
done < <(services_in_group "$g")
|
done < <(services_in_group "$g")
|
||||||
done < <(groups_present)
|
done < <(groups_present)
|
||||||
echo ""
|
echo ""
|
||||||
@@ -410,23 +433,28 @@ while true; do
|
|||||||
# description (fmd's is 68 chars; +13 for the suffix is 81,
|
# description (fmd's is 68 chars; +13 for the suffix is 81,
|
||||||
# past the width) silently drops the marker off the end, making
|
# past the width) silently drops the marker off the end, making
|
||||||
# an installed service look uninstalled with no visual cue
|
# an installed service look uninstalled with no visual cue
|
||||||
# anything was cut. A long description can still lose its own
|
# anything was cut. "[installed]" itself also ate a lot of the
|
||||||
# tail this way, but that's harmless — the install status is
|
# already-tight width just by being 11 characters wide — "[N]"
|
||||||
# what actually matters and now always survives.
|
# (install count) says the same thing in 3, and for the
|
||||||
# Also prefix the name itself with "*" — the checkbox's own
|
# multi-instance services (CLAUDE.md's pattern — a base install
|
||||||
# [ ]/[*] state is reserved for "install this now", so an
|
# plus any number of "<name>-<suffix>" siblings) it's more
|
||||||
# already-installed item stays unchecked by design (checking it
|
# informative than a flat "installed", since N > 1 means several
|
||||||
# would reinstall on <Ok>); this "*" sits right next to the
|
# separate instances exist.
|
||||||
# checkbox as a second, harder-to-miss cue distinct from that
|
_count="$(install_count "$name")"
|
||||||
# selection state. Stripped back off below before dispatch.
|
if [ "$_count" -gt 0 ]; then
|
||||||
if is_installed "$name"; then
|
tag="[$_count] $tag"
|
||||||
tag="[installed] $tag"
|
# The checkbox's own [ ]/[*] state is reserved for "install
|
||||||
|
# this now", so an already-installed item stays unchecked by
|
||||||
|
# design (checking it would reinstall on <Ok>); prefixing
|
||||||
|
# the name itself with "*" gives a second, harder-to-miss
|
||||||
|
# cue right next to the checkbox, distinct from that
|
||||||
|
# selection state. Stripped back off below before dispatch.
|
||||||
svc_tag="*$name"
|
svc_tag="*$name"
|
||||||
fi
|
fi
|
||||||
svc_items+=("$svc_tag" "$tag" "OFF")
|
svc_items+=("$svc_tag" "$tag" "OFF")
|
||||||
done
|
done
|
||||||
CHOICE=$(whiptail --title "${CHOSEN_CAT^^}" --checklist \
|
CHOICE=$(whiptail --title "${CHOSEN_CAT^^}" --checklist \
|
||||||
"Space to select, Enter to install. Already-installed are marked with *:" "$_box_h" 78 "$_list_h" \
|
"Space to select, Enter to install. [N] = N instance(s) already installed:" "$_box_h" 78 "$_list_h" \
|
||||||
"${svc_items[@]}" 3>&1 1>&2 2>&3 </dev/tty) || continue
|
"${svc_items[@]}" 3>&1 1>&2 2>&3 </dev/tty) || continue
|
||||||
eval "SELECTED=($CHOICE)"
|
eval "SELECTED=($CHOICE)"
|
||||||
# Undo the display-only "*" prefix before these reach run_service.
|
# Undo the display-only "*" prefix before these reach run_service.
|
||||||
@@ -434,7 +462,8 @@ while true; do
|
|||||||
else
|
else
|
||||||
echo ""; echo "${CHOSEN_CAT^^}:"
|
echo ""; echo "${CHOSEN_CAT^^}:"
|
||||||
for name in "${SVCS[@]}"; do
|
for name in "${SVCS[@]}"; do
|
||||||
m=""; is_installed "$name" && m="[installed] "
|
m=""; _count="$(install_count "$name")"
|
||||||
|
[ "$_count" -gt 0 ] && m="[$_count] "
|
||||||
printf " %-16s %s%s\n" "$name" "$m" "${SERVICE_DESC[$name]}"
|
printf " %-16s %s%s\n" "$name" "$m" "${SERVICE_DESC[$name]}"
|
||||||
done
|
done
|
||||||
read -rp "Enter service names to install (space-separated, blank to go back): " -a SELECTED
|
read -rp "Enter service names to install (space-separated, blank to go back): " -a SELECTED
|
||||||
|
|||||||
Reference in New Issue
Block a user