• v0.4.0 ec171ede47

    mward4 released this 2026-05-24 13:12:16 -04:00 | 47 commits to main since this release

    OpenPXE v0.4.0

    Quality-of-life release on top of v0.3.2: upload reliability + diagnostics,
    a per-host install log, and a true jet-black dark theme.

    New features

    • Host log under the Hosts tab — every time a PXE client actually starts
      imaging (i.e. /boot/<entry>.ipxe is served past any password gate, or a
      per-MAC host binding fires) OpenPXE records (timestamp, MAC, IP, image)
      to a bounded ring (latest 500) and appends it to boot_log.jsonl under
      the work dir. The new Host log card shows it newest-first. Reserved
      console shortcuts (_local, _queue, …) are deliberately skipped so the
      log stays focused on "what got installed where."
    • GET /api/boot-log — JSON endpoint backing the new tab. Empty until
      the first client boots.
    • iPXE MAC plumbing — per-entry chain URLs and password-prompt
      submissions now carry ?mac=${mac} so the boot log can attribute events
      to a host without depending on DHCP correlation.

    Reliability

    • Upload truncation handled correctly. The multipart loop used
      while let Ok(Some(_)) = field.chunk().await, which silently treated
      mid-stream errors (reverse-proxy buffer caps like Cloudflare's 100 MB
      free-tier limit, Cloudflare 524s, half-closed TCP, etc.) as clean EOF —
      the server would happily finalise a partial ISO. v0.4.0 distinguishes
      Ok(None) from Err(_) and returns 400 Bad Request with the
      underlying cause and a "try the LAN IP directly" hint when the body is
      truncated.
    • Per-stage upload tracing. openpxe::http::upload now logs at
      info/warn/error for every transition (begin → MB watermarks at
      64/128/256/… → body complete → introspect → final). A stuck or rejected
      upload is now debuggable from the Terminal tab.
    • Client-side upload telemetry. The browser drop-zone now shows
      bytes/total, percent, throughput, and ETA while uploading. Common
      failures (413, 502, 504, network drop, timeout) map to actionable hints.

    UI

    • Jet-black dark theme. Replaced the blue-tinted ramp (#0b1018
      #1a2334) with a true-black palette (#000000#0a0a0a#141414
      #1c1c1c), modelled on NetBox Labs' product chrome. The teal accent
      is preserved for brand continuity. Terminal toolbar/input recoloured to
      match.
    • Service status moved to the sidebar. The top-right "● ready" chip
      is gone; readiness is now part of the sidebar footer block alongside the
      advertised PXE URL ("Service status: Ready / Advertised to clients /
      http://…"). The advertised address was already the PXE boot IP
      (auto-detected NIC) rather than the WebUI URL, but operators wanted them
      grouped together.
    • Queue tab — card header "Forge" → "Status".
    • Hosts tab — dropped the "Inspired by Tinkerbell smee" attribution
      blurb. The MAC-binding mechanic is still the same; the marketing footnote
      was just clutter.

    Container image

    • gitea.milesward.dev/mward4/openpxe:0.4.0
    • gitea.milesward.dev/mward4/openpxe:latest

    linux/amd64; ~97 MB; Debian 12-slim runtime + binary + iPXE binaries

    • wimboot. Non-root UID 10001 with setcap NET_BIND_SERVICE.

    Quality

    • 89 tests passing (was 85 in v0.3.2). Includes 4 new integration
      tests for the boot log (records correctly + skips reserved targets +
      empty endpoint behaviour) and 5 new unit tests for the in-memory ring
      • on-disk JSONL.
    • cargo clippy --workspace --all-targets clean.

    Known caveats

    • Uploading >100 MB ISOs through a Cloudflare reverse proxy will still
      reject (Cloudflare's body cap, not OpenPXE's). The new UI/server hints
      point the operator at the LAN IP for big files.
    Downloads