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.
This commit is contained in:
+51
-9
@@ -2,10 +2,13 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
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_NAMES=()
|
||||||
declare -a APP_DIRS=()
|
declare -a APP_DIRS=()
|
||||||
declare -a APP_ECOSYSTEMS=()
|
declare -a APP_ECOSYSTEMS=()
|
||||||
|
declare -a APP_SOURCES=()
|
||||||
|
|
||||||
trim() {
|
trim() {
|
||||||
local s="$1"
|
local s="$1"
|
||||||
@@ -25,18 +28,49 @@ extract_app_name() {
|
|||||||
printf "%s" "$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() {
|
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
|
while IFS= read -r file; do
|
||||||
project_dir="$(dirname "$file")"
|
add_ecosystem "$file" "repo"
|
||||||
app_name="$(extract_app_name "$file")"
|
|
||||||
APP_NAMES+=("$app_name")
|
|
||||||
APP_DIRS+=("$project_dir")
|
|
||||||
APP_ECOSYSTEMS+=("$file")
|
|
||||||
done < <(
|
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" \) \
|
\( -name "ecosystem.config.cjs" -o -name "ecosystem.cron.config.js" \) \
|
||||||
|
-print \
|
||||||
| sort
|
| sort
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -50,8 +84,13 @@ print_services() {
|
|||||||
|
|
||||||
echo "Discovered services:"
|
echo "Discovered services:"
|
||||||
for i in "${!APP_NAMES[@]}"; do
|
for i in "${!APP_NAMES[@]}"; do
|
||||||
rel="${APP_ECOSYSTEMS[$i]#"$ROOT_DIR/"}"
|
if [[ "${APP_ECOSYSTEMS[$i]}" == "$ROOT_DIR/"* ]]; then
|
||||||
printf " %2d) %-18s %s\n" "$((i + 1))" "${APP_NAMES[$i]}" "$rel"
|
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
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,6 +183,9 @@ Actions:
|
|||||||
Service can be:
|
Service can be:
|
||||||
- numeric index from "list"
|
- numeric index from "list"
|
||||||
- app name (e.g. zap, zap-cleanup, caddy-manager, api)
|
- app name (e.g. zap, zap-cleanup, caddy-manager, api)
|
||||||
|
|
||||||
|
Ctrl-managed configs are discovered from:
|
||||||
|
${CTRL_ECOSYSTEM_DIR}
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+64
-3
@@ -4,19 +4,80 @@ set -euo pipefail
|
|||||||
if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then
|
if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then
|
||||||
echo "Usage: $0 <project_dir> <app_name> [ecosystem_file]"
|
echo "Usage: $0 <project_dir> <app_name> [ecosystem_file]"
|
||||||
echo "Example: $0 /home/ubuntu/JezzWTF/zap zap ecosystem.config.cjs"
|
echo "Example: $0 /home/ubuntu/JezzWTF/zap zap ecosystem.config.cjs"
|
||||||
|
echo "If ecosystem_file is omitted, Ctrl-managed configs are preferred."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PROJECT_DIR="$1"
|
PROJECT_DIR="$1"
|
||||||
APP_NAME="$2"
|
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
|
if [ ! -d "$PROJECT_DIR" ]; then
|
||||||
echo "ERROR: project directory not found: $PROJECT_DIR"
|
echo "ERROR: project directory not found: $PROJECT_DIR"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ECOSYSTEM_PATH="$PROJECT_DIR/$ECOSYSTEM_FILE"
|
ECOSYSTEM_PATH="$(resolve_ecosystem_path)"
|
||||||
if [ ! -f "$ECOSYSTEM_PATH" ]; then
|
if [ ! -f "$ECOSYSTEM_PATH" ]; then
|
||||||
echo "ERROR: ecosystem file not found: $ECOSYSTEM_PATH"
|
echo "ERROR: ecosystem file not found: $ECOSYSTEM_PATH"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -24,7 +85,7 @@ fi
|
|||||||
|
|
||||||
cd "$PROJECT_DIR"
|
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 delete "$APP_NAME" >/dev/null 2>&1 || true
|
||||||
pm2 start "$ECOSYSTEM_PATH"
|
pm2 start "$ECOSYSTEM_PATH"
|
||||||
pm2 save
|
pm2 save
|
||||||
|
|||||||
Reference in New Issue
Block a user