• v0.5.4 674a69f93b

    v0.5.4 Stable

    mward4 released this 2026-06-03 03:33:05 -04:00 | 22 commits to main since this release

    OpenPXE v0.5.4

    Internal code-cleanup pass — the final tidy-up before real-world hardware
    testing. No behaviour changes; 248 tests green, clippy clean, same static
    x86_64-unknown-linux-musl binary.

    docker pull gitea.milesward.dev/mward4/openpxe:0.5.4   # or :latest
    

    What changed (engineering only)

    • Uniform HTTP errors. New AppError maps openpxe_core::Error to one
      consistent status/body; the clearly-safe handlers now ? through it.
      Handlers with intentional domain statuses (duplicate-share → 409, etc.)
      were left explicit on purpose, so no API status changed.
    • Layered config via figment. Config::load merges defaults → TOML →
      OPENPXE_* env. The historical flat var names (OPENPXE_HTTP_PORT,
      OPENPXE_ISO_DIR, …) keep working unchanged, plus a nested
      OPENPXE_SECTION__FIELD form, and every field is now covered (the old
      hand-rolled mapping silently skipped unattended_dir and the bind
      addresses). Backed by hermetic figment::Jail tests.
    • Typed /api/status. The 25-key hand-built JSON blob is now a typed
      StatusResponse struct (compile-checked contract with the WebUI), guarded
      by a test asserting every key the UI reads.
    • Dependency hygiene. thiserror 1 → 2; dropped unused mime /
      mime_guess / once_cell.
    • De-duplication. pct_encode / xml_escape consolidated into
      openpxe_core::encoding (were copy-pasted across the HTTP + SAML layers).
    • Concurrency tidy. The chunked-upload registry is now a
      parking_lot::RwLock (sync, never held across .await); the per-session
      lock stays a tokio::Mutex.
    • Test coverage. Added an insta snapshot of the rendered iPXE menu and
      wiremock coverage of the SAML metadata-URL fetch.

    Notes

    • Duration::from_hours/from_mins were kept (they're stable on the pinned
      Rust 1.95 toolchain and clippy prefers the readable form).
    • The /api/docs typed-struct conversion was deliberately deferred (lowest
      value, highest churn, no functional benefit).
    Downloads