#!/usr/bin/env bash
set -euo pipefail

find_pg_clusters()
{
   local root="${1:-/pgdata}"
   local dir
   local version
   local port
   local status
   local pid

   printf '%-3s %-10s %-5s %-8s %s\n' "Ver" "Cluster" "Port" "Status" "Data directory"

   while IFS= read -r -d '' dir
   do
      version="$(cat "$dir/PG_VERSION")"

      port="$(
         awk -F= '
            /^[[:space:]]*port[[:space:]]*=/ {
               gsub(/[[:space:]]/, "", $2)
               gsub(/#.*/, "", $2)
               print $2
               exit
            }
         ' "$dir/postgresql.conf" 2>/dev/null || true
      )"
      port="${port:-5432}"

      status="down"
      if [[ -f "$dir/postmaster.pid" ]]
      then
         pid="$(head -n 1 "$dir/postmaster.pid" || true)"
         if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null
         then
            status="online"
         else
            status="stale-pid"
         fi
      fi

      printf '%-3s %-10s %-5s %-8s %s\n' \
         "$version" \
         "$(basename "$dir")" \
         "$port" \
         "$status" \
         "$dir"

   done < <(
      find "$root" -type f -name PG_VERSION -print0 2>/dev/null |
      while IFS= read -r -d '' file
      do
         printf '%s\0' "$(dirname "$file")"
      done
   )
}

find_pg_clusters "${1:-/pgdata}"
