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:
co-authored by
Claude Opus 4.8
parent
cbcd63bb14
commit
7adf5e2918
@@ -840,3 +840,67 @@ tr.unbootable td:first-child { border-left: 3px solid var(--warn); }
|
||||
border: 1px solid var(--border);
|
||||
color: var(--fg-dim);
|
||||
}
|
||||
|
||||
/* ── v0.5.2: three-slot branding (light / dark / client) ─────────── */
|
||||
.logo-slots {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 12px;
|
||||
}
|
||||
@media (max-width: 720px) { .logo-slots { grid-template-columns: 1fr; } }
|
||||
.logo-slot {
|
||||
display: flex; flex-direction: column; gap: 8px;
|
||||
padding: 12px;
|
||||
background: var(--bg-panel-2);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
.logo-slot-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
|
||||
.logo-slot-head .name { color: var(--fg); font-weight: 600; font-size: 13px; }
|
||||
.logo-slot .swatch {
|
||||
height: 64px;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
background: var(--bg); border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
.logo-slot .swatch img { max-width: 90%; max-height: 52px; object-fit: contain; }
|
||||
.logo-slot-hint { color: var(--fg-dim); font-size: 11.5px; }
|
||||
|
||||
/* ── v0.5.2: login local/SSO separation ─────────────────────────── */
|
||||
.auth-card .auth-divider {
|
||||
display: flex; align-items: center; text-align: center;
|
||||
color: var(--fg-dimmer); font-size: 11px; text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
margin: 16px 0 12px;
|
||||
}
|
||||
.auth-card .auth-divider::before,
|
||||
.auth-card .auth-divider::after {
|
||||
content: ""; flex: 1; height: 1px; background: var(--border-soft);
|
||||
}
|
||||
.auth-card .auth-divider span { padding: 0 10px; }
|
||||
.auth-card .sso-block .sso-btn { margin-top: 0; }
|
||||
.auth-card .sso-btn {
|
||||
display: flex; align-items: center; justify-content: center; gap: 8px;
|
||||
}
|
||||
.auth-card .sso-btn .sso-logo { width: 16px; height: 16px; object-fit: contain; flex: none; }
|
||||
|
||||
/* ── v0.5.2: modal (queue Profile editor) ───────────────────────── */
|
||||
.modal-overlay {
|
||||
position: fixed; inset: 0; z-index: 200;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
background: rgba(0, 0, 0, 0.55);
|
||||
padding: 24px;
|
||||
}
|
||||
.modal-box {
|
||||
width: 100%; max-width: 520px;
|
||||
background: var(--bg-panel);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: var(--shadow-card);
|
||||
padding: 22px;
|
||||
}
|
||||
.modal-box h2 { margin: 0 0 14px; font-size: 16px; font-weight: 600; color: var(--fg); }
|
||||
.modal-actions {
|
||||
display: flex; justify-content: flex-end; gap: 10px; margin-top: 18px;
|
||||
}
|
||||
.modal-actions .submit { width: auto; padding: 8px 18px; }
|
||||
|
||||
Reference in New Issue
Block a user