#!/usr/bin/env bash # juc500 — 로컬 + 상대편(Mac Studio) JUC500을 동시에 재시작 # # 상대편 재시작 순서: # 1) USB 연결 + GUI 실행 중 → /api/restart/both (RPC로 상대도 재시작) # 2) SSH 가능 시 → 상대편에서 scripts/peer_restart.sh 실행 # # 환경 변수: # JUC500_PEER_SSH 기본 aidev@aidevs-Mac-Studio.local # JUC500_PEER_ROOT 기본 /Users/aidev/dev/juc500/juc500 # JUC500_GUI_URL 기본 http://127.0.0.1:8766 set -euo pipefail ROOT="$(cd "$(dirname "$0")" && pwd)" cd "$ROOT" PEER_SSH="${JUC500_PEER_SSH:-aidev@aidevs-Mac-Studio.local}" PEER_ROOT="${JUC500_PEER_ROOT:-/Users/aidev/dev/juc500/juc500}" GUI_URL="${JUC500_GUI_URL:-http://127.0.0.1:8766}" PY="" if [[ -x "$ROOT/.venv/bin/python" ]]; then PY="$ROOT/.venv/bin/python" elif command -v python3 >/dev/null 2>&1; then PY="$(command -v python3)" else echo "python3 없음" >&2 exit 1 fi chmod +x "$ROOT/scripts/peer_restart.sh" 2>/dev/null || true pick_gui_url() { local url for url in "$GUI_URL" "http://127.0.0.1:8766" "http://127.0.0.1:8765"; do if curl -sf -m2 "$url/api/status" >/dev/null 2>&1; then echo "$url" return 0 fi done return 1 } restart_via_usb_api() { local base url resp connected base="$(pick_gui_url)" || return 1 connected="$("$PY" -c " import json, urllib.request, sys with urllib.request.urlopen('${base}/api/status', timeout=3) as r: print('yes' if json.load(r).get('connected') else 'no') " 2>/dev/null || echo no)" if [[ "$connected" != "yes" ]]; then echo "USB API: GUI는 실행 중이나 상대와 연결되지 않음 ($base)" >&2 return 1 fi echo "=== USB 연결됨 — API로 양쪽 재시작 ($base) ===" resp="$(curl -sf -m20 -X POST "$base/api/restart/both" -H 'Content-Type: application/json' -d '{}' || true)" if [[ -z "$resp" ]]; then echo "USB API 재시작 요청 실패" >&2 return 1 fi echo "$resp" return 0 } restart_peer_ssh() { echo "=== 상대편 SSH 재시작 ($PEER_SSH) ===" ssh -o BatchMode=yes -o ConnectTimeout=12 "$PEER_SSH" \ "bash -lc 'cd \"$PEER_ROOT\" && chmod +x scripts/peer_restart.sh start.sh 2>/dev/null; ./scripts/peer_restart.sh'" } restart_local() { echo "=== 로컬 재시작 ===" "$ROOT/scripts/peer_restart.sh" } echo "juc500 양쪽 재시작 시작…" echo " 로컬: $ROOT" echo " 상대: $PEER_SSH:$PEER_ROOT" echo "" # USB로 양쪽 동시 재시작 (연결된 경우 — RPC로 상대도 재시작됨) if pick_gui_url >/dev/null 2>&1; then if [[ "${JUC500_SYNC_BEFORE_RESTART:-1}" != "0" ]]; then echo "=== 상대편 소스 동기화 ===" if JUC500_SYNC_RESTART=0 JUC500_GUI_URL="$(pick_gui_url)" "$ROOT/scripts/sync_peer.sh"; then echo "동기화 완료" else echo "동기화 건너뜀 (연결 없음 또는 실패)" >&2 fi echo "" fi fi if restart_via_usb_api; then echo "" echo "완료 — 잠시 후 양쪽 GUI가 다시 뜹니다. 한쪽에서 「연결」을 누르세요." exit 0 fi # 폴백: SSH 상대 + 로컬 병렬 재시작 PEER_RC=0 LOCAL_RC=0 restart_peer_ssh & PID_PEER=$! restart_local & PID_LOCAL=$! wait "$PID_PEER" || PEER_RC=$? wait "$PID_LOCAL" || LOCAL_RC=$? echo "" if [[ "$LOCAL_RC" -eq 0 ]]; then echo "로컬 재시작: OK" else echo "로컬 재시작: 실패" >&2 fi if [[ "$PEER_RC" -eq 0 ]]; then echo "상대 재시작: OK" else echo "상대 재시작: 실패 (SSH $PEER_SSH 확인 또는 USB 연결 후 다시 실행)" >&2 fi if [[ "$LOCAL_RC" -ne 0 ]]; then exit 1 fi echo "" echo "완료 — 한쪽에서 「연결」을 누르면 양쪽이 자동 연결됩니다."