Files
juc500/dist-offline/juc500-offline-update-20260720-165112/start_both.sh
T
2026-07-21 21:11:19 +09:00

128 lines
3.6 KiB
Bash
Executable File

#!/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 "완료 — 한쪽에서 「연결」을 누르면 양쪽이 자동 연결됩니다."