v0.5.2: FleetDM login split, 3-slot branding, unattended installs

Authentication / login:
- Separate the local username/password form from the SSO "Sign in with …"
  button (FleetDM-style divider + optional IdP logo); credential fields no
  longer double as the SSO trigger. Settings → SSO copy now says SAML is live.

Branding — three slots (light / dark / client) on one row:
- Light/Dark feed the top-left mark + sign-in page by active theme (with
  cross-theme fallback; theme toggle swaps the logo live). Client feeds the
  PXE boot-menu background. Favicon pinned to the bundled mark via a new
  /assets/favicon.svg endpoint. Legacy single logo migrates to dark + client.
- BrandingStore refactored to per-slot storage; /api/branding/logo/:slot.

Unattended installs (Storage → Advanced):
- New UnattendedStore (iso-store) + /api/unattended upload/list/delete and a
  public templated serve at /unattended/:id (+ NoCloud seed dir for
  autoinstall). Accepts .ks/.cfg/.seed/.yaml/.yml/.xml/user-data; classified
  on upload; stored in its own unattended/ dir, never the ISO listing/menu.
- {{HOSTNAME}}/{{IP}}/{{MAC}} substituted per host at serve time.

Host pins + Queue profiles:
- HostBinding + QueueEntry carry an optional DeployProfile (auto_hostname /
  auto_ip / unattended_file). Hosts pin form + a per-device Queue "Profile"
  button collect them. On boot, a matched MAC has the right kernel arg
  injected (inst.ks= / preseed url= / autoinstall ds=nocloud-net) and the
  hostname/IP templated into the served answer file. DHCP stays proxy-only.

Storage:
- Remote shares default protocol is now NFS; updated descriptive copy.

235 tests green, clippy clean. Still a single static musl binary, pure Rust.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
Miles Ward
2026-05-31 16:11:04 -04:00
co-authored by Claude Opus 4.8
parent cbcd63bb14
commit 7adf5e2918
19 changed files with 2295 additions and 330 deletions
Generated
+8 -8
View File
@@ -2251,7 +2251,7 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]]
name = "openpxe"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"axum",
@@ -2273,7 +2273,7 @@ dependencies = [
[[package]]
name = "openpxe-core"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"base64",
@@ -2299,7 +2299,7 @@ dependencies = [
[[package]]
name = "openpxe-dhcp-proxy"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"bytes",
@@ -2313,7 +2313,7 @@ dependencies = [
[[package]]
name = "openpxe-http-api"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"axum",
@@ -2349,7 +2349,7 @@ dependencies = [
[[package]]
name = "openpxe-ipxe-assets"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"openpxe-core",
"rust-embed",
@@ -2359,7 +2359,7 @@ dependencies = [
[[package]]
name = "openpxe-iso-store"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"bcrypt",
@@ -2386,7 +2386,7 @@ dependencies = [
[[package]]
name = "openpxe-tftp"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"bytes",
@@ -2400,7 +2400,7 @@ dependencies = [
[[package]]
name = "openpxe-webui"
version = "0.5.1"
version = "0.5.2"
[[package]]
name = "p256"