#!/usr/bin/env bash # Build offline Windows update package (USB stick / closed network). # Includes runtime sources + vendor wheels/libusb/zadig + apply bat. # Does NOT require internet on the Windows peer. set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" STAMP="$(date +%Y%m%d-%H%M%S)" BUILD="$("$ROOT/.venv/bin/python" -c "from juc500_xfer.usb_link import XFER_BUILD; print(XFER_BUILD)" 2>/dev/null || echo unknown)" OUT_DIR="${1:-$ROOT/dist-offline/juc500-offline-update-${STAMP}}" ZIP_OUT="${2:-$ROOT/dist-offline/juc500-offline-update-${STAMP}.zip}" mkdir -p "$OUT_DIR" "$ROOT/dist-offline" echo "=== Offline Windows update package ===" echo "XFER_BUILD=$BUILD" echo "OUT_DIR=$OUT_DIR" rm -rf "$OUT_DIR" mkdir -p "$OUT_DIR/juc500_xfer/static" "$OUT_DIR/scripts" "$OUT_DIR/vendor/wheels" "$OUT_DIR/vendor/tools" "$OUT_DIR/docs" # Runtime Python package (all modules — SmartKMLink lives in usb_link.py) rsync -a --delete \ --exclude '__pycache__' --exclude '*.py[cod]' --exclude '.DS_Store' \ "$ROOT/juc500_xfer/" "$OUT_DIR/juc500_xfer/" # Launchers / entry for f in juc500_app.py start.bat start.sh start_win.sh start_both.sh requirements.txt README.md; do [[ -f "$ROOT/$f" ]] && cp -f "$ROOT/$f" "$OUT_DIR/$f" done # Scripts (bootstrap + apply) rsync -a --exclude '__pycache__' "$ROOT/scripts/" "$OUT_DIR/scripts/" cp -f "$ROOT/scripts/apply_offline_update.bat" "$OUT_DIR/apply_offline_update.bat" # Vendor offline essentials cp -f "$ROOT/vendor/libusb-1.0.dll" "$OUT_DIR/vendor/libusb-1.0.dll" cp -f "$ROOT/vendor/wheels/"*.whl "$OUT_DIR/vendor/wheels/" 2>/dev/null || true [[ -f "$ROOT/vendor/wheels/README.md" ]] && cp -f "$ROOT/vendor/wheels/README.md" "$OUT_DIR/vendor/wheels/" [[ -f "$ROOT/vendor/README.md" ]] && cp -f "$ROOT/vendor/README.md" "$OUT_DIR/vendor/" [[ -f "$ROOT/vendor/get-pip.py" ]] && cp -f "$ROOT/vendor/get-pip.py" "$OUT_DIR/vendor/" if [[ -f "$ROOT/vendor/tools/zadig.exe" ]]; then cp -f "$ROOT/vendor/tools/zadig.exe" "$OUT_DIR/vendor/tools/zadig.exe" fi # Docs for f in OFFLINE-WINDOWS.md WINDOWS.md WINDOWS-ACCESS-DENIED.md; do [[ -f "$ROOT/docs/$f" ]] && cp -f "$ROOT/docs/$f" "$OUT_DIR/docs/$f" done cat >"$OUT_DIR/BUILD.txt" <"$OUT_DIR/APPLY-WINDOWS.txt" <<'EOF' 폐쇄망 Windows 11 — 오프라인 업데이트 ==================================== 1. 이 폴더 전체를 USB로 Windows PC에 복사 2. JUC500 GUI 종료 3. apply_offline_update.bat 실행 (기본 대상 C:\dev\juc500) 4. C:\dev\juc500 에서 start.bat 실행 5. 상단 빌드 태그가 BUILD.txt 의 XFER_BUILD 와 같은지 확인 6. JUC500(0711:7500): vendor\tools\zadig.exe → Options → List All Devices → Smart Data Link → Interface 5 (MI_05) → WinUSB 인터넷·pip 설치 불필요. vendor\wheels · libusb · (선택) zadig 포함. EOF rm -f "$ZIP_OUT" ( cd "$OUT_DIR" zip -r -q "$ZIP_OUT" . ) # Also drop a copy on Desktop for easy USB copy DESK="$HOME/Desktop/juc500-offline-update-${STAMP}.zip" cp -f "$ZIP_OUT" "$DESK" bytes="$(wc -c <"$ZIP_OUT" | tr -d ' ')" echo "완료: $ZIP_OUT ($bytes bytes)" echo "Desktop: $DESK" echo "폴더: $OUT_DIR" echo "XFER_BUILD=$BUILD"