• v0.6.1 4f193cac05

    mward4 released this 2026-06-09 11:18:07 -04:00 | 11 commits to main since this release

    v0.6.1 — latest iPXE + automatic NIC driver fallback

    Mirrors the worthwhile device-support wins from iVentoy 1.0.24→1.0.35 onto OpenPXE's proxy-DHCP + iPXE-chainload architecture. (iVentoy's other changes don't apply: arm64-server / distro-display fixes live in its injected Linux, which we don't have; iSCSI is niche; Matrix Boot is closed-source.)

    iPXE refreshed (mirrors 1.0.35 "Update iPXE")

    • From-source build pinned to ipxe/ipxe master @ 2026-06-09 (95ffbf47) — newer NIC drivers + EFI fixes. The pin also busts the cached build layer so the release genuinely recompiles iPXE.

    Automatic NIC driver fallback (mirrors 1.0.34 "driver / boot-file mode" — zero toggle)

    • The proxy-DHCP serves the firmware-net build (snponly/undionly) by default — unchanged, so hardware that boots today never regresses.
    • If a client's firmware NIC stack fails (it re-PXE-boots without ever completing the tell-tale iPXE-user-class handoff), that MAC is automatically escalated to iPXE's own all-drivers build (ipxe.efi / ipxe.pxe / ipxe-i386.efi / ipxe-arm64.efi) so iPXE's native drivers can bind the card. The choice is sticky per-MAC after a confirmed handoff. No settings, no UI — it just works.
    • All-drivers binaries now embedded for every supported arch.

    Core principles intact: DHCP-proxy-only, container-first, Rust-focused (the logic is all Rust; only the iPXE fetch/build stays shell), Windows hard-rules untouched.

    Validation

    clippy clean; full workspace test suite green (core 99 incl. new DriverMode tests, dhcp-proxy +4 escalation tests, http-api 31+68, iso-store 61, tftp 6, bin 2); the Docker build recompiled iPXE from latest master successfully (the build is the upstream-compatibility check).

    Image: gitea.milesward.dev/mward4/openpxe:0.6.1 (also :latest) — linux/amd64, digest sha256:f9683754495b7e756a3e5e4a5b08344cf94b6e31a4124a891ad49605d293bdf6.

    Downloads
  • v0.6.0 5df0fd5972

    mward4 released this 2026-06-05 13:02:38 -04:00 | 13 commits to main since this release

    v0.6.0 — closes the 0.5.x chapter

    Bootable-ISO handling is now honest end-to-end, and generic El Torito ISOs (ESXi/VMvisor installers, BSDs, firmware tools) boot via iPXE sanboot with no special-casing.

    Boot detection / menu

    • An unclassified ISO gets a boot entry only when it is actually bootable — it carries an El Torito catalog, or it is a remote-share ISO we could not introspect (assumed bootable). A locally-introspected ISO with no boot catalog (a data/appliance image like a VMware vCenter Server Appliance bundle) gets no entry and stays out of the iPXE menu instead of offering a pick that always fails.
    • ESXi installer ISOs (VMware-VMvisor-Installer-*.iso) are El Torito images → they surface in the installer menu and sanboot the raw ISO, backed by HTTP range reads (size is a non-issue). No new code path or operator toggle.
    • Dropped the stale "(SAN boot — may fail for >1GiB ISOs)" disclaimer; sanboot is the primary path for Windows and any El Torito image.
    • Dashboard panel renamed "Images that won't boot with current settings" → "Non-bootable images" (nothing here is settings-dependent).

    Carried from v0.5.9

    • El Torito boot-catalog detection + retroactive re-introspection of stale local ISOs on startup (fixes Windows 11 / IoT ISOs uploaded by older builds without re-upload).
    • Static SSO login button (served from the public /api/me; metadata/entity-ID stay gated).

    Validation

    Full v0.5.0→v0.5.9 compatibility sweep: clippy clean; entire workspace test suite green (core 96, http-api 31+68, iso-store 61, dhcp 1, tftp 6, bin 2); app.js syntax-checked.

    Image: gitea.milesward.dev/mward4/openpxe:0.6.0 (also :latest) — linux/amd64, digest sha256:49dfd27cf009adcc53f50328e179ad8f7ff677fd8d1a549f7ac56c11159c3a06.

    Downloads
  • v0.5.9 06695c3d77

    v0.5.9 Pre-Release

    mward4 released this 2026-06-05 11:47:41 -04:00 | 14 commits to main since this release

    v0.5.9 — boot detection + SSO login fixes

    Storage / boot

    • El Torito boot-catalog detection. ISOs are now classified by whether they actually carry a boot catalog, not by file size. Bootable ISOs we cannot otherwise identify (BSD, ESXi, firmware tools, custom spins) boot via iPXE sanboot; genuine data/appliance images (e.g. VMware vCenter bundles) are flagged honestly instead of mislabeled.
    • Retroactive re-introspection on upgrade. Local ISOs uploaded by an older build are re-probed on startup, so a Windows 11 / Windows 11 IoT ISO that previously showed "won't boot" is reclassified and boots — no delete-and-re-upload.
    • Dashboard image counts now bucket Windows / Linux / other accurately.

    Single sign-on

    • The "Sign in with …" button is now static — it renders whenever SSO is usable, signed in or out. Previously it keyed off an auth-gated endpoint and vanished instance-wide after the first login. A minimal, non-sensitive SSO descriptor now ships on the public /api/me; metadata/entity-ID stay gated.

    Image: gitea.milesward.dev/mward4/openpxe:0.5.9 (also :latest) — linux/amd64, digest sha256:6668a132c3c7b3316e888847b02ea6bd03b48f3064129ffde52d40ac3ce8c587.

    Downloads
  • v0.5.8 9fc9a9a1af

    mward4 released this 2026-06-04 21:24:23 -04:00 | 17 commits to main since this release

    OpenPXE v0.5.8 — Windows ISOs just work, plus Storage UX

    Windows boot (no setup, no SMB)

    Windows ISOs now boot out of the box via iPXE HTTP sanboot — iPXE
    exposes the raw, unmodified ISO as an emulated CD backed by on-demand
    HTTP range reads, and Windows Setup boots from it. No SMB server, no
    extraction, no operator toggle, works in any environment. Nothing is
    injected into Windows (no httpdisk.sys, no test certificates, no
    trust-store changes).

    • Broadened Windows detection for modern UDF-only Windows 10/11 ISOs
      (UTF-16 filename markers + filename hint) — their cryptic volume labels
      previously left them unrecognized.
    • The Windows Installers submenu now appears automatically whenever a
      Windows ISO is present.
    • The dashboard no longer flags Windows ISOs as "won't boot"; the generic
      large-ISO warning was reworded so genuinely non-bootable images (e.g.
      VMware VCSA appliance bundles) read clearly.

    Storage UX

    • Available images are now listed alphabetically.
    • Uploads gain a Cancel button (aborts and discards the partial file).
    • A leave-page warning appears while an upload is in flight.
    docker pull gitea.milesward.dev/mward4/openpxe:0.5.8   # or :latest
    

    Static x86_64-unknown-linux-musl binary; 263 tests pass, clippy clean.

    Downloads
  • v0.5.7 ac433b30e9

    mward4 released this 2026-06-03 19:28:10 -04:00 | 18 commits to main since this release

    OpenPXE v0.5.7 — legacy-BIOS boot-menu fix

    The graphical PNG boot-menu background broke menu rendering on legacy
    BIOS
    clients. The menu issued console --picture … || console, but on
    a no-PNG BIOS build (undionly.kpxe) the --picture attempt misbehaves
    before the || console fallback can recover — it tries to set a
    framebuffer mode the BIOS console can't honour.

    Fix: the background is now gated on iseq ${platform} efi, so BIOS
    clients never issue the command and drop straight to the plain text
    menu, while UEFI clients still get the graphical background. Automatic
    and per-client — a mixed BIOS+UEFI fleet each gets the right treatment,
    no toggle required.

    docker pull gitea.milesward.dev/mward4/openpxe:0.5.7   # or :latest
    
    Downloads
  • v0.5.6 c0d17fa9ca

    mward4 released this 2026-06-03 18:49:59 -04:00 | 19 commits to main since this release

    OpenPXE v0.5.6 — boot-URL port hot fix

    Bug fix for non-port-80 deployments. The base URL advertised to PXE
    clients was built as http://<ip> with no port, ignoring
    OPENPXE_HTTP_PORT. Since every client-facing URL derives from it — the
    DHCP-proxy iPXE filename, UEFI HTTP boot, and the boot menu's
    kernel/initrd/ISO links — any deployment on a non-80 port told clients
    to fetch :80 (the wrong service). On Unraid that's the webGUI, which
    301-redirects to https; iPXE (no TLS) then aborts the chain with
    Operation not supported. This broke the exact setup the Unraid
    template recommends (HTTP port 4200, chosen to avoid the webGUI).

    Fix: the advertised base URL now includes the port unless it's 80 —
    http://10.0.0.5 stays clean, http://10.0.0.5:4200 is reachable.
    Regression-tested.

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

    If you run OpenPXE on a non-80 HTTP port, re-pull and PXE boot works with
    no other changes.

    Downloads
  • v0.5.5 44a2212abe

    mward4 released this 2026-06-03 11:49:37 -04:00 | 21 commits to main since this release

    OpenPXE v0.5.5 — SFTP-over-SSH remote shares

    Adds SFTP as a third remote ISO-library protocol alongside SMB and NFS.

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

    What's new

    • SFTP remote shares — point OpenPXE at an SSH/SFTP server and boot ISOs straight off it. Pure-Rust (russh + russh-sftp, ring crypto backend): no kernel mount, no subprocess, no OpenSSL, no new C dependencies.
    • HTTP Range support — like NFS (and unlike SMB), SFTP-sourced ISOs support byte-range reads (the SFTP file handle seeks), so kernel/initrd extraction and httpdisk range requests work.
    • Auth — password or SSH private key (optional passphrase). The server's SSH host key is pinned trust-on-first-use; a changed key is refused with a clear warning.
    • UI — "SFTP (SSH)" added to the Remote shares protocol dropdown with a password/key toggle and host-key fingerprint display. Plus sftp terminal commands (list/add/remove/scan) and /api/sftp-shares.

    Why not SCP

    SCP is sequential-only (no random access → no HTTP Range, unlike SFTP/NFS), and the mature Rust SCP crates wrap libssh2 (C + OpenSSL), which would break the static-musl, OpenSSL-free build.

    Notes

    • russh is pinned to =0.55.0 — the newest release that coexists with the SAML crypto stack (bergshamra-crypto pins RustCrypto release-candidate crates that conflict with russh 0.61's stable ones). Functionally identical; ring-backed, OpenSSL-free.
    • Static x86_64-unknown-linux-musl binary; 252 tests pass, clippy clean.
    Downloads
  • 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
  • v0.5.3 7358013093

    v0.5.3 Pre-Release

    mward4 released this 2026-06-03 02:50:51 -04:00 | 23 commits to main since this release

    OpenPXE v0.5.3

    UI polish on top of v0.5.2.

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

    Changes

    • Branding previews are now theme-accurate. In Settings → Branding, each
      logo swatch (Light / Dark / Client) previews on a background matching where
      the mark actually lands — light page, dark page, and the dark PXE boot
      screen — independent of the theme you're currently viewing Settings in. The
      Dark-mode slot no longer renders on a light card.
    • Unified button spacing site-wide. Every primary card action button
      (Save, Bind, Add, Launch, …) now shares one consistent gap above it via a
      single rule, and the ad-hoc per-button inline margins were removed. Fixes
      the Hosts → "Bind MAC to target" button butting directly against the form.

    Not changed (by design)

    • The PXE boot-menu selection highlight is unchanged. A rotating RGB
      highlight isn't achievable in iPXE's menu (it draws once and blocks for a
      keypress — no animation loop); doing it for real needs a custom menu
      renderer, tracked as a future effort.

    Under the hood

    • Same single static x86_64-unknown-linux-musl binary, built via the native
      cargo-zigbuild cross-compile pipeline introduced in v0.5.2 (no QEMU).
    • Workspace: tests green, clippy clean.
    Downloads
  • v0.5.2 7adf5e2918

    v0.5.2 Pre-Release

    mward4 released this 2026-05-31 16:11:59 -04:00 | 25 commits to main since this release

    OpenPXE v0.5.2

    Builds on the v0.5.1 SAML SSO release with a FleetDM-style login, themable
    branding, and a full unattended-install pipeline (Kickstart / Preseed /
    Autoinstall / Windows answer files) wired through host pins and the queue.

    Pull into Unraid (host networking):

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

    Authentication / login page

    • FleetDM-style separation. The local username/password form is now a
      self-contained block; when SSO is enabled, a distinct “Sign in with …”
      button sits below an or divider (optionally with the IdP logo) instead of
      the credential fields doubling as the SSO trigger.
    • The Settings → SSO copy now reflects that SAML is live (no more
      “runtime pending” language).

    Branding — three logo slots

    Branding splits into three independent slots, all on one row in
    Settings → Branding:

    • Light mode and Dark mode logos drive the top-left mark and the
      sign-in page — whichever theme is active picks its variant (with
      cross-theme fallback). Toggling the theme swaps the logo live.
    • Client logo is the raster painted above the PXE boot menu
      (/branding/pxe-logo), seen by booting machines.
    • The favicon is now pinned to the bundled OpenPXE mark on its own
      endpoint (/assets/favicon.svg) — it never follows custom branding, so the
      browser-tab icon stays recognisably OpenPXE.
    • A pre-v0.5.2 single uploaded logo is migrated automatically into the
      dark + client slots on first launch.

    Unattended installs (Storage → Advanced)

    • New Unattended file upload drop-zone: “Drop a Kickstart, Preseed,
      Autoinstall, or Answer File here.”
      Accepts .ks, .cfg, .seed,
      .yaml, .yml, .xml, and user-data. Files are classified on upload
      and stored in their own directory (/var/lib/openpxe/unattended) — never
      the ISO listing or the PXE menu.
    • Use {{HOSTNAME}}, {{IP}}, {{MAC}} placeholders in your answer file;
      they are substituted per-host at boot.

    Host pins + Queue profiles

    • Hosts pin form gains Auto hostname (optional), Auto IP address
      (optional)
      , and an Unattended file dropdown next to Label; the table
      shows an Auto-deploy summary per binding.
    • Queue positions gain a Profile button that prompts for the same
      three fields per queued device.
    • On boot, a bound/queued MAC with an unattended file selected has the right
      kernel argument injected automatically:
      • Kickstart → inst.ks=…
      • Preseed → auto=true priority=critical url=…
      • Autoinstall → autoinstall ds=nocloud-net;s=…/ (cloud-init NoCloud seed
        dir, serving user-data + meta-data)
      • The auto hostname/IP are templated into the served answer file. OpenPXE
        remains a DHCP proxy — it does not assign leases; the values are
        applied by the installer as static-network directives in the answer file.

    Storage — Remote shares

    • Default protocol is now NFS (no credential row, cleaner form).
    • Updated copy: “Remote .iso libraries are read on demand — no local cache to
      preserve disk usage. Support for NFS 3.0 and SMB. Ensure that the hosts IP
      address is provisioned.”

    Under the hood

    • Still a single static x86_64-unknown-linux-musl binary — pure Rust, no
      OpenSSL/C deps added.
    • Workspace: 235 tests green, clippy clean.
    • New API surface: POST/GET /api/unattended, DELETE /api/unattended/:id,
      public GET /unattended/:id (templated serve) + NoCloud seed dir;
      POST/DELETE /api/branding/logo/:slot; PUT /api/queue/:id/profile;
      host pin + queue entry carry an optional deployment profile.
    Downloads