Files
Linux_post_install/bin/pos-docker-ps
T
he 5ef38dc46f fix: resolve all 23 MAINTENANCE audit tickets
- 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
2026-08-14 12:57:00 -04:00

126 lines
4.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# POS: docker ps — Enhanced container overview (health, IPs, ports, uptime)
source "$(dirname "$0")/../lib/common.sh" 2>/dev/null || source "$(dirname "$0")/common.sh"
usage() {
cat <<EOF
Usage: pos docker ps
Display enhanced Docker container overview with health status,
uptime, IPs, and port mappings.
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 -q 2>/dev/null) || [[ -z "$container_ids" ]]; then
echo "No running containers."
exit 0
fi
healthy_count=0
unhealthy_count=0
running_count=0
total_count=0
printf "%-28s %-35s %-22s %-10s %-35s %-20s %s\n" \
"NAME" "IMAGE" "STATUS(HEALTH)" "UPTIME" "IPS" "PORTS" "CONTAINER ID"
for cid in $container_ids; do
total_count=$((total_count + 1))
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)
image=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['Config']['Image'])" 2>/dev/null)
status=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['State']['Status'])" 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)
ip_data=$(echo "$info" | python3 -c "
import sys,json
d=json.load(sys.stdin)[0]
nets=d.get('NetworkSettings',{}).get('Networks',{})
out=' '.join(f'{k}:{v.get(\"IPAddress\",\"\")}' for k,v in nets.items() if v.get('IPAddress'))
print(out or '-')
" 2>/dev/null)
port_data=$(echo "$info" | python3 -c "
import sys,json
d=json.load(sys.stdin)[0]
ports=d.get('NetworkSettings',{}).get('Ports',{}) or {}
parts=[]
for container_port, bindings in ports.items():
if bindings:
for b in bindings:
hp=b.get('HostPort','')
hi=b.get('HostIp','')
if hi and hp:
parts.append(f'{hi}:{hp}->{container_port}')
elif hp:
parts.append(f'{hp}->{container_port}')
else:
parts.append(container_port)
else:
parts.append(container_port)
print(', '.join(parts) if parts else '-')
" 2>/dev/null)
[ "${#image}" -gt 35 ] && image="${image:0:32}..."
if [ "$status" = "running" ]; then
running_count=$((running_count + 1))
fi
if [ -n "$health" ]; then
case "$health" in
healthy) healthy_count=$((healthy_count + 1)); status_display="${GREEN}${status} (${health})${RESET}" ;;
unhealthy) unhealthy_count=$((unhealthy_count + 1)); status_display="${RED}${status} (${health})${RESET}" ;;
*) status_display="${YELLOW}${status} (${health})${RESET}" ;;
esac
else
status_display="${YELLOW}${status}${RESET}"
fi
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
printf "%-28s %-35s %-22b %-10s %-35s %-20s %s\n" \
"$name" "$image" "$status_display" "$uptime" "$ip_data" "$port_data" "$cid"
done
echo
printf '%*s\n' 120 '' | tr ' ' '-'
echo "Containers : $total_count"
echo "Healthy : $healthy_count"
echo "Unhealthy : $unhealthy_count"
echo "Running : $running_count"
if [ "$unhealthy_count" -gt 0 ]; then
echo
echo "${RED}Warning: unhealthy containers detected${RESET}"
fi