5ef38dc46f
- deps guards before -h|--help in docker-health/ps, network-scan, usb-server, media-mp3/mp4 (--dry-run pre-scan kept); system-firewall gains usage()/--help; autostart/usb-automount get flags.sh + template - install.sh: normalize N-M range syntax in --steps - bin/pos: INTERACTIVE_CMDS += docker-compose docker-vbox network-hotspot - common.sh: canonical XDG-aware CONFIG_DIR + DIM color var; notify.sh stderr fallback; ent_plugin_* registry renames (runtime plugin API kept) - docker-compose SCALE_DIR/CONFIG_ENV env seams; ffmpeg in PACKAGES; scrcpy.sh exec bit - docs: health is console-only (--send/--markdown removed), POS.md file refs for config/tree/entertainment, DEV.md no-guard exception, docmap/ filetable regenerated (make gen), hand-maintained line rows bumped - add scripts/lint-conventions.sh gate + Makefile lint target; record all VERIFIED outcomes in MAINTENANCE.md; AGENT_TODO Done entry (2026-08-14) - gates: make gen/check/lint all green (0 FAIL, 0 WARN); bash -n sweep clean; restricted-PATH dep tests + step-matrix dry-runs verified
108 lines
3.4 KiB
Bash
Executable File
108 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
# POS: docker health — One-glance container health dashboard (exits 1 if unhealthy)
|
|
source "$(dirname "$0")/../lib/common.sh" 2>/dev/null || source "$(dirname "$0")/common.sh"
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: pos docker health
|
|
|
|
Quick one-glance health dashboard for all Docker containers.
|
|
Shows health status, uptime, and exits with code 1 if any container is unhealthy.
|
|
|
|
Exit codes:
|
|
0 All containers healthy (or no healthcheck configured)
|
|
1 One or more containers unhealthy
|
|
EOF
|
|
exit 0
|
|
}
|
|
|
|
command -v docker &>/dev/null || err "docker not found — install it with: sudo apt install docker.io"
|
|
|
|
case "${1:-}" in
|
|
-h|--help) usage ;;
|
|
esac
|
|
|
|
if ! container_ids=$(docker ps -a -q 2>/dev/null) || [[ -z "$container_ids" ]]; then
|
|
echo "No containers."
|
|
exit 0
|
|
fi
|
|
|
|
healthy=0
|
|
unhealthy=0
|
|
no_check=0
|
|
other=0
|
|
|
|
echo "── Docker Health ─────────────────────────────────"
|
|
|
|
for cid in $container_ids; do
|
|
info=$(docker inspect "$cid" 2>/dev/null) || continue
|
|
|
|
name=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['Name'].lstrip('/'))" 2>/dev/null)
|
|
health=$(echo "$info" | python3 -c "
|
|
import sys,json
|
|
d=json.load(sys.stdin)[0]
|
|
h=d.get('State',{}).get('Health',{})
|
|
print(h.get('Status','') if h else '')
|
|
" 2>/dev/null || true)
|
|
started_at=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['State']['StartedAt'])" 2>/dev/null)
|
|
status=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['State']['Status'])" 2>/dev/null)
|
|
|
|
# Calculate uptime
|
|
uptime="-"
|
|
if start_ts=$(date -d "$started_at" +%s 2>/dev/null); then
|
|
now_ts=$(date +%s)
|
|
diff=$((now_ts - start_ts))
|
|
days=$((diff / 86400))
|
|
hours=$(((diff % 86400) / 3600))
|
|
mins=$(((diff % 3600) / 60))
|
|
if [ "$days" -gt 0 ]; then
|
|
uptime="${days}d ${hours}h"
|
|
elif [ "$hours" -gt 0 ]; then
|
|
uptime="${hours}h ${mins}m"
|
|
else
|
|
uptime="${mins}m"
|
|
fi
|
|
fi
|
|
|
|
# Determine health display
|
|
if [ -n "$health" ]; then
|
|
case "$health" in
|
|
healthy)
|
|
health_display="${GREEN}healthy${RESET}"
|
|
healthy=$((healthy + 1))
|
|
;;
|
|
unhealthy)
|
|
health_display="${RED}unhealthy${RESET}"
|
|
unhealthy=$((unhealthy + 1))
|
|
;;
|
|
starting)
|
|
health_display="${YELLOW}starting${RESET}"
|
|
other=$((other + 1))
|
|
;;
|
|
*)
|
|
health_display="${YELLOW}${health}${RESET}"
|
|
other=$((other + 1))
|
|
;;
|
|
esac
|
|
elif [ "$status" != "running" ]; then
|
|
health_display="${RED}${status}${RESET}"
|
|
other=$((other + 1))
|
|
else
|
|
health_display="${YELLOW}no healthcheck${RESET}"
|
|
no_check=$((no_check + 1))
|
|
fi
|
|
|
|
printf " %-24s %b%-20s${RESET} %s\n" "$name" "" "$health_display" "$uptime"
|
|
done
|
|
|
|
total=$((healthy + unhealthy + no_check + other))
|
|
echo "──────────────────────────────────────────────────"
|
|
echo " Total: $total ${GREEN}healthy: $healthy${RESET} ${RED}unhealthy: $unhealthy${RESET} no check: $no_check"
|
|
|
|
if [ "$unhealthy" -gt 0 ]; then
|
|
echo
|
|
echo "${RED}Unhealthy containers detected${RESET}"
|
|
exit 1
|
|
fi
|