• v0.2.0 49d0b00a8a

    v0.2.0 — pre-beta Pre-Release

    mward4 released this 2026-04-30 02:28:10 -04:00 | 54 commits to main since this release

    v0.2.0 — pre-beta

    This is the bulk pre-beta cleanup pass. The protocol stack and operator UI are exercised by 66 automated tests (up from 56), cargo clippy --workspace --all-targets is fully clean, and the container image is 97 MB of linux/amd64 bytes.

    Pull

    docker pull gitea.milesward.dev/mward4/openpxe:0.2.0
    

    Highlights

    Per-MAC host bindings Pin a MAC to a boot target and the client skips the menu. The DHCP reply embeds ?mac=${mac} in the boot.ipxe URL; iPXE substitutes the literal MAC client-side, and the HTTP layer chains straight to the bound entry. New Hosts tab and /api/hosts CRUD.

    Prometheus /metrics. Counters for DHCP replies (per arch), TFTP transfers + bytes, HTTP requests (per route family). Gauges for ISO / client / gate / imaging counts, NFS active mounts, uptime, build info. Plain text exposition format. Lock-free AtomicU64s — no prometheus/metrics-rs runtime dep.

    Light + dark themes. CSS-token toggle in the top-right corner (or press T). Light palette designed against reference. Pre-paint inline script avoids the dark→light flash on every page load. Terminal pane stays dark in both themes.

    Windows boot workflow validation. A new integration test synthesizes a Windows-style ISO and asserts (1) introspection identifies it correctly, (2) the boot entry is the canonical 5-file wimboot chain, (3) the rendered iPXE script chains wimboot with initrd --name for each, and (4) no trust-store strings (bcdedit, testsigning, certutil, httpdisk, test-signed) appear. WinPE startnet.cmd picks up other open source utility lessons (explicit net start Workstation before net use, surfaced errors).

    Code cleanup pass

    cargo clippy --workspace --all-targets is now warning-free. Among the bigger fixes:

    • format!() appended to Stringstd::fmt::Write::write!
    • manual reverse comparators → Reverse
    • map_or(false, …)is_some_and
    • redundant closures → method references
    • std::io::Error::new(Other, …)Error::other
    • merged identical match arms

    Run on Unraid

    docker pull gitea.milesward.dev/mward4/openpxe:0.2.0
    

    Same deployment as v0.1.0 — see deploy/unraid/README.md. Drop deploy/unraid/openpxe.xml into /boot/config/plugins/dockerMan/templates-user/ for a one-click template. Web UI: http://<unraid-ip>/.

    What's next

    A detailed Phase 6 punch list lives at docs/NEXT_PHASE.md. The headline item is real-hardware validation across BIOS / UEFI x64 / UEFI ARM64 — the protocol legs are CI-tested, but no real firmware has booted OpenPXE yet.

    Image details

    • Base: debian:12-slim
    • Architecture: linux/amd64
    • Size: ~97 MB
    • Digest: sha256:d682c97f903caf16ae9e1631d547d7ec32a8da64b4db7ef93f64b12164233ea4
    • Runs as uid 10001 (entrypoint chowns bind mounts as root, then drops via gosu)
    • Required cap: NET_BIND_SERVICE
    • Optional cap: SYS_ADMIN for NFS share mounting
    Downloads