juc500 정상동작
This commit is contained in:
Executable
+127
@@ -0,0 +1,127 @@
|
||||
#!/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 "완료 — 한쪽에서 「연결」을 누르면 양쪽이 자동 연결됩니다."
|
||||
Reference in New Issue
Block a user