diff --git a/scripts/podx-tools.sh b/scripts/podx-tools.sh index a81b490..2cd2a69 100755 --- a/scripts/podx-tools.sh +++ b/scripts/podx-tools.sh @@ -168,14 +168,40 @@ EOF # ------------------------------ Redis toggles ------------------------------ _redis_cli() { - if command -v docker >/dev/null 2>&1 && docker compose ps redis >/dev/null 2>&1; then - docker compose exec -T redis redis-cli "$@" - elif command -v redis-cli >/dev/null 2>&1; then - redis-cli -h "${REDIS_HOST:-127.0.0.1}" -p "${REDIS_PORT:-6379}" "$@" - else - echo "redis-cli not found and no docker compose redis service available." >&2 - return 1 + # Allow explicit override with PODX_REDIS_CLI, e.g.: + # PODX_REDIS_CLI="docker exec -i myredis redis-cli" + if [ -n "${PODX_REDIS_CLI:-}" ]; then + # shellcheck disable=SC2086 + ${PODX_REDIS_CLI} "$@" + return $? fi + + # Defaults (overridable via .env) + : "${PODX_REDIS_SERVICE:=redis}" + : "${PODX_REDIS_HOST:=${REDIS_HOST:-127.0.0.1}}" + : "${PODX_REDIS_PORT:=${REDIS_PORT:-6379}}" + + if command -v docker >/dev/null 2>&1 && command -v docker compose >/dev/null 2>&1; then + # If the configured service exists, use it + if docker compose ps --services 2>/dev/null | grep -qx "$PODX_REDIS_SERVICE"; then + docker compose exec -T "$PODX_REDIS_SERVICE" redis-cli "$@" + return $? + fi + # Auto-detect a redis-like service name (redis, redis-*, *-redis, *_redis) + auto_srv="$(docker compose ps --services 2>/dev/null | grep -Ei '(^redis$)|(^redis[-_])|([-_]redis$)' | head -n1)" + if [ -n "$auto_srv" ]; then + docker compose exec -T "$auto_srv" redis-cli "$@" + return $? + fi + fi + + if command -v redis-cli >/dev/null 2>&1; then + redis-cli -h "$PODX_REDIS_HOST" -p "$PODX_REDIS_PORT" "$@" + return $? + fi + + echo "Could not find a way to run redis-cli.\n- Set PODX_REDIS_CLI to a full command (e.g. 'docker exec -i redis-cli')\n- Or set PODX_REDIS_SERVICE to your compose service name\n- Or install redis-cli / set PODX_REDIS_HOST & PODX_REDIS_PORT" >&2 + return 1 } # --- Redis key utilities -------------------------------------------------- @@ -204,6 +230,28 @@ _redis_llen() { # usage: _redis_llen _redis_cli LLEN "$1" 2>/dev/null | tr -d '\r' || echo 0 } +_redis_type() { # usage: _redis_type + _redis_cli TYPE "$1" 2>/dev/null | tr -d '\r' || echo none +} + +_redis_size() { # usage: _redis_size + local k="$1" + local t; t="$(_redis_type "$k")" + case "$t" in + list) _redis_cli LLEN "$k" 2>/dev/null | tr -d '\r' || echo 0 ;; + set) _redis_cli SCARD "$k" 2>/dev/null | tr -d '\r' || echo 0 ;; + zset) _redis_cli ZCARD "$k" 2>/dev/null | tr -d '\r' || echo 0 ;; + hash) _redis_cli HLEN "$k" 2>/dev/null | tr -d '\r' || echo 0 ;; + string) _redis_cli STRLEN "$k" 2>/dev/null | tr -d '\r' || echo 0 ;; + stream) _redis_cli XLEN "$k" 2>/dev/null | tr -d '\r' || echo 0 ;; + none) echo 0 ;; + *) # unknown or module-specific; try LLEN, then ZCARD, then HLEN + _redis_cli LLEN "$k" 2>/dev/null | tr -d '\r' || \ + _redis_cli ZCARD "$k" 2>/dev/null | tr -d '\r' || \ + _redis_cli HLEN "$k" 2>/dev/null | tr -d '\r' || echo 0 ;; + esac +} + _transcribe_key="podx:transcribe:paused" # Queue namespace & patterns (override in .env if your deployment differs) @@ -272,11 +320,11 @@ case "$cmd" in echo "[workers] namespace: ${PODX_QUEUE_NS}" for q in ${PODX_WORKER_QUEUES}; do base="${PODX_QUEUE_NS}:${q}" - printf "%-28s %6s\n" "$base" "$(_redis_llen "$base")" + printf "%-28s %6s\n" "$base" "$(_redis_size "$base")" for suf in ${PODX_QUEUE_SUFFIXES}; do k="${base}${suf}" if [ -n "$(_redis_keys "$k")" ]; then - printf "%-28s %6s\n" "$k" "$(_redis_llen "$k")" + printf "%-28s %6s\n" "$k" "$(_redis_size "$k")" fi done done @@ -302,7 +350,7 @@ case "$cmd" in for pat in ${OPENWEBUI_QUEUE_PATTERNS}; do mapfile -t keys < <(_redis_keys "$pat") for k in "${keys[@]}"; do - printf "%-40s %6s\n" "$k" "$(_redis_llen "$k")" + printf "%-40s %6s\n" "$k" "$(_redis_size "$k")" done done ;;