101 lines
3.7 KiB
Bash
Executable File
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"
|