#!/usr/bin/env bash 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:-}" 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="$(resolve_ecosystem_path)" if [ ! -f "$ECOSYSTEM_PATH" ]; then echo "ERROR: ecosystem file not found: $ECOSYSTEM_PATH" exit 1 fi cd "$PROJECT_DIR" echo "Recreating PM2 app '$APP_NAME' from '$ECOSYSTEM_PATH'..." pm2 delete "$APP_NAME" >/dev/null 2>&1 || true pm2 start "$ECOSYSTEM_PATH" pm2 save echo "Done. Current PM2 status:" pm2 ls