From 0239f49aaa77d29aecb2fb86579ec5bf4ffc13f5 Mon Sep 17 00:00:00 2001 From: LyAhn Date: Mon, 22 Jun 2026 17:01:29 +0000 Subject: [PATCH] fix: Update pm2-manager with updated ecosystem Now prefers Ctrl-managed configs when no explicit ecosystem file is passed. Still supports explicit repo-local or absolute config paths. --- pm2/pm2-manager.sh | 60 ++++++++++++++++++++++++++++++++++------ pm2/pm2-recreate.sh | 67 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 115 insertions(+), 12 deletions(-) diff --git a/pm2/pm2-manager.sh b/pm2/pm2-manager.sh index cc7d758..0b47203 100755 --- a/pm2/pm2-manager.sh +++ b/pm2/pm2-manager.sh @@ -2,10 +2,13 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +CTRL_DATA_DIR="${CTRL_DATA_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/ctrl}" +CTRL_ECOSYSTEM_DIR="${CTRL_ECOSYSTEM_DIR:-$CTRL_DATA_DIR/ecosystems}" declare -a APP_NAMES=() declare -a APP_DIRS=() declare -a APP_ECOSYSTEMS=() +declare -a APP_SOURCES=() trim() { local s="$1" @@ -25,18 +28,49 @@ extract_app_name() { printf "%s" "$name" } +extract_app_cwd() { + local ecosystem_file="$1" + local cwd + cwd="$(grep -E 'cwd:[[:space:]]*"[^"]+"' "$ecosystem_file" | head -n1 | sed -E 's/.*cwd:[[:space:]]*"([^"]+)".*/\1/' || true)" + cwd="$(trim "$cwd")" + if [ -z "$cwd" ]; then + cwd="$(dirname "$ecosystem_file")" + fi + printf "%s" "$cwd" +} + +add_ecosystem() { + local file="$1" + local source="$2" + local app_name project_dir + + app_name="$(extract_app_name "$file")" + project_dir="$(extract_app_cwd "$file")" + APP_NAMES+=("$app_name") + APP_DIRS+=("$project_dir") + APP_ECOSYSTEMS+=("$file") + APP_SOURCES+=("$source") +} + discover_ecosystems() { - local file app_name project_dir + local file + + if [ -d "$CTRL_ECOSYSTEM_DIR" ]; then + while IFS= read -r file; do + add_ecosystem "$file" "ctrl" + done < <( + find "$CTRL_ECOSYSTEM_DIR" -maxdepth 1 -type f -name "*.config.cjs" | sort + ) + fi while IFS= read -r file; do - project_dir="$(dirname "$file")" - app_name="$(extract_app_name "$file")" - APP_NAMES+=("$app_name") - APP_DIRS+=("$project_dir") - APP_ECOSYSTEMS+=("$file") + add_ecosystem "$file" "repo" done < <( - find "$ROOT_DIR" -mindepth 2 -maxdepth 2 -type f \ + find "$ROOT_DIR" -maxdepth 4 \ + \( -path "$ROOT_DIR/gitea" -o -path "*/node_modules" -o -path "*/.next" -o -path "*/.git" \) -prune -o \ + -type f \ \( -name "ecosystem.config.cjs" -o -name "ecosystem.cron.config.js" \) \ + -print \ | sort ) } @@ -50,8 +84,13 @@ print_services() { echo "Discovered services:" for i in "${!APP_NAMES[@]}"; do - rel="${APP_ECOSYSTEMS[$i]#"$ROOT_DIR/"}" - printf " %2d) %-18s %s\n" "$((i + 1))" "${APP_NAMES[$i]}" "$rel" + if [[ "${APP_ECOSYSTEMS[$i]}" == "$ROOT_DIR/"* ]]; then + rel="${APP_ECOSYSTEMS[$i]#"$ROOT_DIR/"}" + else + rel="${APP_ECOSYSTEMS[$i]}" + fi + printf " %2d) %-18s %-4s %s\n" "$((i + 1))" "${APP_NAMES[$i]}" "${APP_SOURCES[$i]}" "$rel" + printf " cwd: %s\n" "${APP_DIRS[$i]}" done } @@ -144,6 +183,9 @@ Actions: Service can be: - numeric index from "list" - app name (e.g. zap, zap-cleanup, caddy-manager, api) + +Ctrl-managed configs are discovered from: + ${CTRL_ECOSYSTEM_DIR} EOF } diff --git a/pm2/pm2-recreate.sh b/pm2/pm2-recreate.sh index 7c4daba..ce49e46 100755 --- a/pm2/pm2-recreate.sh +++ b/pm2/pm2-recreate.sh @@ -4,19 +4,80 @@ set -euo pipefail if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then echo "Usage: $0 [ecosystem_file]" echo "Example: $0 /home/ubuntu/JezzWTF/zap zap ecosystem.config.cjs" + echo "If ecosystem_file is omitted, Ctrl-managed configs are preferred." exit 1 fi PROJECT_DIR="$1" APP_NAME="$2" -ECOSYSTEM_FILE="${3:-ecosystem.config.cjs}" +ECOSYSTEM_FILE="${3:-}" +CTRL_DATA_DIR="${CTRL_DATA_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/ctrl}" +CTRL_ECOSYSTEM_DIR="${CTRL_ECOSYSTEM_DIR:-$CTRL_DATA_DIR/ecosystems}" + +trim() { + local s="$1" + s="${s#"${s%%[![:space:]]*}"}" + s="${s%"${s##*[![:space:]]}"}" + printf "%s" "$s" +} + +ecosystem_app_name() { + local ecosystem_file="$1" + local name + name="$(grep -E 'name:[[:space:]]*"[^"]+"' "$ecosystem_file" | head -n1 | sed -E 's/.*name:[[:space:]]*"([^"]+)".*/\1/' || true)" + trim "$name" +} + +ecosystem_cwd() { + local ecosystem_file="$1" + local cwd + cwd="$(grep -E 'cwd:[[:space:]]*"[^"]+"' "$ecosystem_file" | head -n1 | sed -E 's/.*cwd:[[:space:]]*"([^"]+)".*/\1/' || true)" + trim "$cwd" +} + +resolve_ecosystem_path() { + local file name cwd name_match="" + + if [ -n "$ECOSYSTEM_FILE" ]; then + if [[ "$ECOSYSTEM_FILE" = /* ]]; then + printf "%s" "$ECOSYSTEM_FILE" + else + printf "%s" "$PROJECT_DIR/$ECOSYSTEM_FILE" + fi + return 0 + fi + + if [ -d "$CTRL_ECOSYSTEM_DIR" ]; then + while IFS= read -r file; do + name="$(ecosystem_app_name "$file")" + [ "$name" = "$APP_NAME" ] || continue + + cwd="$(ecosystem_cwd "$file")" + if [ "$cwd" = "$PROJECT_DIR" ]; then + printf "%s" "$file" + return 0 + fi + + if [ -z "$name_match" ]; then + name_match="$file" + fi + done < <(find "$CTRL_ECOSYSTEM_DIR" -maxdepth 1 -type f -name "*.config.cjs" | sort) + fi + + if [ -n "$name_match" ]; then + printf "%s" "$name_match" + return 0 + fi + + printf "%s" "$PROJECT_DIR/ecosystem.config.cjs" +} if [ ! -d "$PROJECT_DIR" ]; then echo "ERROR: project directory not found: $PROJECT_DIR" exit 1 fi -ECOSYSTEM_PATH="$PROJECT_DIR/$ECOSYSTEM_FILE" +ECOSYSTEM_PATH="$(resolve_ecosystem_path)" if [ ! -f "$ECOSYSTEM_PATH" ]; then echo "ERROR: ecosystem file not found: $ECOSYSTEM_PATH" exit 1 @@ -24,7 +85,7 @@ fi cd "$PROJECT_DIR" -echo "Recreating PM2 app '$APP_NAME' from '$ECOSYSTEM_FILE'..." +echo "Recreating PM2 app '$APP_NAME' from '$ECOSYSTEM_PATH'..." pm2 delete "$APP_NAME" >/dev/null 2>&1 || true pm2 start "$ECOSYSTEM_PATH" pm2 save