BTRFS misdiagnosis in README The build watcher was registered as a SYSTEM-context Scheduled Task (schtasks /ru SYSTEM). Confirmed on a real run this never actually works: Z:\ (the /shared mount) is mapped per interactive session, a SYSTEM task has no session of its own and can't see it, so watch_build.bat spun forever on its own "if not exist Z:\" wait -- a build request sat unclaimed for hours with zero indication anything was wrong. Fixed with an All-Users Startup-folder entry instead, which runs in whichever user's session actually logs in. Also correcting the README's earlier "BTRFS boot-loop" entry: that was a misdiagnosis from reading the text log alone (repeated "loading/starting Boot0004" lines). Actually looking at the noVNC screen showed genuine, progressing Windows Setup the whole time -- Setup legitimately reboots the VM multiple times, each one re-prints those same firmware lines. The chattr +C fix stays (real, independently documented dockur/QEMU/BTRFS caveat) but likely wasn't fixing an actual problem that time. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
88 lines
4.7 KiB
Batchfile
88 lines
4.7 KiB
Batchfile
@echo off
|
|
REM One-time provisioning, auto-run by dockur/windows during the final step
|
|
REM of Windows's own unattended setup (see its README's /oem mechanism).
|
|
REM Everything here happens exactly once and lands on the VM's persistent
|
|
REM disk -- later builds just boot this already-provisioned VM and run
|
|
REM build.bat, no re-provisioning.
|
|
REM
|
|
REM UNTESTED end to end: written from MSYS2's documented CI bootstrap
|
|
REM sequence (the same one msys2/setup-msys2 uses) and WiX's own docs, not
|
|
REM verified against a live dockur/windows boot. Expect to debug this on
|
|
REM the actual first run -- watch it happen at http://localhost:8006.
|
|
REM
|
|
REM Every step also echoes to Z:\install_progress.log (best-effort, only
|
|
REM if the Z:\ shared drive happens to be up already at this point in
|
|
REM setup) purely so build_windows.sh on the host has SOMETHING to show
|
|
REM besides silence during the one-time provisioning run.
|
|
|
|
setlocal enabledelayedexpansion
|
|
call :log "starting FEnigma build-VM provisioning"
|
|
|
|
REM -- MSYS2: the "base" self-extracting archive, not the GUI installer --
|
|
REM (the GUI installer has no reliable non-interactive/silent flag across
|
|
REM versions; the base sfx archive is what CI pipelines actually use).
|
|
REM Discover the current filename by scraping the repo listing, since it's
|
|
REM datestamped and there's no stable "latest" URL.
|
|
call :log "finding current MSYS2 base archive..."
|
|
powershell -NoProfile -Command ^
|
|
"$ProgressPreference='SilentlyContinue';" ^
|
|
"$html = Invoke-WebRequest -Uri 'https://repo.msys2.org/distrib/x86_64/' -UseBasicParsing;" ^
|
|
"$name = ($html.Links | Where-Object { $_.href -match '^msys2-base-x86_64-.*\.sfx\.exe$' } | Select-Object -Last 1).href;" ^
|
|
"Invoke-WebRequest -Uri ('https://repo.msys2.org/distrib/x86_64/' + $name) -OutFile 'C:\msys2-base.sfx.exe' -UseBasicParsing"
|
|
if not exist C:\msys2-base.sfx.exe (
|
|
call :log "FAILED: could not download MSYS2 base archive"
|
|
exit /b 1
|
|
)
|
|
|
|
call :log "extracting MSYS2 to C:\msys64 ..."
|
|
C:\msys2-base.sfx.exe -y -oC:\ >> C:\OEM\install.log 2>&1
|
|
del C:\msys2-base.sfx.exe
|
|
|
|
REM First bash launch finalizes the base install and kills itself off
|
|
REM mid-update (documented MSYS2 behavior) -- run it, ignore its exit
|
|
REM code, then run the real update.
|
|
call :log "bootstrapping MSYS2 (pacman -Syuu, twice) ..."
|
|
C:\msys64\usr\bin\bash.exe -lc "exit 0" >> C:\OEM\install.log 2>&1
|
|
C:\msys64\usr\bin\bash.exe -lc "pacman -Syuu --noconfirm" >> C:\OEM\install.log 2>&1
|
|
C:\msys64\usr\bin\bash.exe -lc "pacman -Syuu --noconfirm" >> C:\OEM\install.log 2>&1
|
|
|
|
call :log "installing GTK4/libadwaita/PyGObject/build deps ..."
|
|
C:\msys64\usr\bin\bash.exe -lc "pacman -S --noconfirm --needed mingw-w64-x86_64-python mingw-w64-x86_64-python-pip mingw-w64-x86_64-python-gobject mingw-w64-x86_64-gtk4 mingw-w64-x86_64-libadwaita mingw-w64-x86_64-python-numpy mingw-w64-x86_64-python-pillow mingw-w64-x86_64-opencv mingw-w64-x86_64-tesseract-ocr" >> C:\OEM\install.log 2>&1
|
|
|
|
call :log "pip install pytesseract (pure python, no wheel needed) ..."
|
|
C:\msys64\mingw64\bin\python3.exe -m pip install pytesseract >> C:\OEM\install.log 2>&1
|
|
|
|
REM -- WiX v3 toolset (candle/light/heat), a plain zip of standalone exes,
|
|
REM no installer needed. Fixed versioned URL, no scraping required.
|
|
call :log "fetching WiX v3.11 ..."
|
|
powershell -NoProfile -Command ^
|
|
"$ProgressPreference='SilentlyContinue';" ^
|
|
"Invoke-WebRequest -Uri 'https://github.com/wixtoolset/wix3/releases/download/wix3111rtm/wix311-binaries.zip' -OutFile 'C:\wix311-binaries.zip' -UseBasicParsing;" ^
|
|
"Expand-Archive -Path 'C:\wix311-binaries.zip' -DestinationPath 'C:\wix' -Force"
|
|
del C:\wix311-binaries.zip
|
|
|
|
REM -- Register the build watcher to run at every login from here on,
|
|
REM plus kick it off right now too (a fresh login won't retroactively
|
|
REM fire for this already-logged-in session). Deliberately an All-Users
|
|
REM Startup-folder entry, NOT a SYSTEM-context Scheduled Task: confirmed
|
|
REM on a real run that a /ru SYSTEM task can't see Z:\ at all and spins
|
|
REM forever on watch_build.bat's own "if not exist Z:\" wait -- Z:\ (the
|
|
REM /shared mount) is mapped per INTERACTIVE session, invisible to a
|
|
REM SYSTEM task with no session of its own. Startup-folder entries run
|
|
REM in whichever user's session actually logs in, inheriting their
|
|
REM drive mappings correctly.
|
|
call :log "registering build watcher (Startup folder) ..."
|
|
copy /y C:\OEM\watch_build.bat "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\FenigmaBuildWatcher.bat" >> C:\OEM\install.log 2>&1
|
|
start "" cmd /c C:\OEM\watch_build.bat
|
|
|
|
call :log "provisioning done"
|
|
echo DONE > C:\OEM\provisioned.marker
|
|
if exist Z:\ echo DONE > Z:\PROVISIONED
|
|
endlocal
|
|
exit /b 0
|
|
|
|
:log
|
|
echo [install.bat] %~1 >> C:\OEM\install.log
|
|
if exist Z:\ echo [install.bat] %~1 >> Z:\install_progress.log
|
|
exit /b 0
|