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

101 lines
3.7 KiB
Bash
Executable File

#!/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" <<EOF
JUC500 offline update
XFER_BUILD=$BUILD
created=$STAMP
SmartKMLink VID:PID=0ea0:7301 (IF5 same as JUC500)
Windows closed-network apply:
1) Copy this folder (or unzip) to the peer PC via USB stick
2) Close JUC500 GUI on Windows
3) Double-click apply_offline_update.bat
(default DEST=C:\\dev\\juc500 — or: apply_offline_update.bat D:\\path\\juc500)
4) cd C:\\dev\\juc500 && start.bat
5) GUI version line must show: $BUILD
6) SmartKMLink / JUC500 IF5: vendor\\tools\\zadig.exe → MI_05 → WinUSB
Full fresh install (includes embeddable Python):
./scripts/make_windows_bundle.sh
EOF
cat >"$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. SmartKMLink(0ea0:7301) / JUC500: vendor\tools\zadig.exe
→ Options → List All Devices → 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"