| #!/usr/bin/env bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| set -euo pipefail |
|
|
| |
| |
| |
| CCMR_CONFIG_FILE="${CCMR_CONFIG_FILE:-/root/.env.d/ccmr.env}" |
|
|
| if [[ -f "$CCMR_CONFIG_FILE" ]]; then |
| |
| source "$CCMR_CONFIG_FILE" |
| fi |
|
|
| CCMR_ENABLED="${CCMR_ENABLED:-false}" |
| CCMR_PORT="${CCMR_PORT:-8080}" |
| CCMR_CONFIG_DIR="${CCMR_CONFIG_DIR:-$HOME/.ccmr}" |
| CCMR_RELOAD_INTERVAL="${CCMR_RELOAD_INTERVAL:-5}" |
|
|
| |
| if [[ "$CCMR_ENABLED" != "true" ]]; then |
| echo "[CCMR-WRAPPER] CCMR is disabled (CCMR_ENABLED != true). Exiting." |
| exit 0 |
| fi |
|
|
| echo "[CCMR-WRAPPER] CCMR is enabled, entering restart loop..." |
| echo "[CCMR-WRAPPER] Config file: ${CCMR_CONFIG_FILE}" |
| echo "[CCMR-WRAPPER] Watching for changes every ${CCMR_RELOAD_INTERVAL}s" |
|
|
| |
| USE_INOTIFY=false |
| if command -v inotifywait &>/dev/null; then |
| USE_INOTIFY=true |
| echo "[CCMR-WRAPPER] Using inotifywait for efficient file monitoring" |
| else |
| echo "[CCMR-WRAPPER] inotifywait not available, using polling mode" |
| fi |
|
|
| |
| |
| |
| restart_count=0 |
|
|
| while true; do |
| restart_count=$((restart_count + 1)) |
| echo "[CCMR-WRAPPER] === Restart #${restart_count} ===" |
|
|
| |
| if [[ -f "$CCMR_CONFIG_FILE" ]]; then |
| |
| source "$CCMR_CONFIG_FILE" |
| CCMR_PORT="${CCMR_PORT:-8080}" |
| fi |
|
|
| |
| /usr/local/bin/ccmr-setup.sh |
|
|
| |
| if ! grep -q '=' "$CCMR_CONFIG_DIR/.env" 2>/dev/null || \ |
| ! grep -v '^#' "$CCMR_CONFIG_DIR/.env" | grep -q '=' 2>/dev/null; then |
| echo "[CCMR-WRAPPER] WARNING: No API keys configured yet." |
| echo "[CCMR-WRAPPER] CCMR will start but may be non-functional." |
| echo "[CCMR-WRAPPER] Create ${CCMR_CONFIG_FILE} with CCMR_*_API_KEY entries." |
| fi |
|
|
| echo "[CCMR-WRAPPER] Starting CCMR gateway on port ${CCMR_PORT}..." |
| echo "[CCMR-WRAPPER] Config dir: ${CCMR_CONFIG_DIR}" |
| echo "[CCMR-WRAPPER] Command: ccmr start --port ${CCMR_PORT}" |
|
|
| |
| cd "$CCMR_CONFIG_DIR" |
| export NODE_ENV=production |
|
|
| ccmr start --port "$CCMR_PORT" & |
| CCMR_PID=$! |
| echo "[CCMR-WRAPPER] CCMR gateway started (PID: ${CCMR_PID})" |
|
|
| |
| |
| |
| restart_reason="" |
| CHANGE_FLAG="/tmp/.ccmr_config_changed" |
|
|
| if [[ "$USE_INOTIFY" == "true" ]]; then |
| |
| |
| rm -f "$CHANGE_FLAG" |
| ( |
| mkdir -p "$(dirname "$CCMR_CONFIG_FILE")" |
| inotifywait -q -m --format '%f' \ |
| -e modify,attrib,move,delete \ |
| "$(dirname "$CCMR_CONFIG_FILE")" 2>/dev/null \ |
| | while read -r fname; do |
| if [[ "$fname" == "ccmr.env" ]]; then |
| touch "$CHANGE_FLAG" |
| exit 0 |
| fi |
| done |
| ) & |
| WATCHER_PID=$! |
| fi |
|
|
| |
| |
| while kill -0 "$CCMR_PID" 2>/dev/null; do |
| sleep "$CCMR_RELOAD_INTERVAL" |
|
|
| if [[ -f "$CHANGE_FLAG" ]]; then |
| restart_reason="config_file_changed" |
| break |
| fi |
| done |
|
|
| |
| if [[ -z "$restart_reason" ]] && ! kill -0 "$CCMR_PID" 2>/dev/null; then |
| restart_reason="process_crashed" |
| fi |
|
|
| |
| if [[ -n "${WATCHER_PID:-}" ]]; then |
| kill "$WATCHER_PID" 2>/dev/null || true |
| wait "$WATCHER_PID" 2>/dev/null || true |
| fi |
| rm -f "$CHANGE_FLAG" |
|
|
| |
| case "$restart_reason" in |
| config_file_changed) |
| echo "[CCMR-WRAPPER] Config file changed. Restarting gateway..." |
| ;; |
| process_crashed) |
| echo "[CCMR-WRAPPER] CCMR process exited unexpectedly (PID: ${CCMR_PID}). Restarting..." |
| ;; |
| *) |
| echo "[CCMR-WRAPPER] Monitoring loop exited (unknown reason). Restarting..." |
| ;; |
| esac |
|
|
| |
| if kill -0 "$CCMR_PID" 2>/dev/null; then |
| echo "[CCMR-WRAPPER] Stopping CCMR (PID: ${CCMR_PID})..." |
| kill "$CCMR_PID" 2>/dev/null || true |
| sleep 1 |
| if kill -0 "$CCMR_PID" 2>/dev/null; then |
| kill -9 "$CCMR_PID" 2>/dev/null || true |
| fi |
| wait "$CCMR_PID" 2>/dev/null || true |
| echo "[CCMR-WRAPPER] CCMR stopped" |
| fi |
|
|
| |
| if [[ "$restart_reason" != "config_file_changed" ]]; then |
| echo "[CCMR-WRAPPER] Restarting in ${CCMR_RELOAD_INTERVAL}s..." |
| sleep "$CCMR_RELOAD_INTERVAL" |
| fi |
| done |
|
|