diff --git a/web/app/(app)/servers/[id]/page.tsx b/web/app/(app)/servers/[id]/page.tsx index 01e233c..b7cf12c 100644 --- a/web/app/(app)/servers/[id]/page.tsx +++ b/web/app/(app)/servers/[id]/page.tsx @@ -301,7 +301,9 @@ export default function ServerDetailPage() {
{activeTab === "overview" && } - {activeTab === "workloads" && } + {activeTab === "workloads" && ( + + )} {activeTab === "security" && } {activeTab === "access" && setShowGenerateModal(true)} />} {activeTab === "maintenance" && ( diff --git a/web/components/servers/tabs/MaintenanceTab.tsx b/web/components/servers/tabs/MaintenanceTab.tsx index 7e27dc8..4b6edd3 100644 --- a/web/components/servers/tabs/MaintenanceTab.tsx +++ b/web/components/servers/tabs/MaintenanceTab.tsx @@ -47,11 +47,18 @@ export function MaintenanceTab({

OS updates

- {updates.length > 0 ? {updates.length} pending : up to date} +
+ {updates.length > 0 ? {updates.length} pending : up to date} + {/* Sits with the updates panel because that is what + caused it. The agent never reboots a host itself. */} + {server.inventory?.reboot_required && reboot required} +
{updates.length === 0 ? ( -

No pending package updates. The agent checks hourly.

+

+ {isWindows ? "No pending Windows updates. The agent checks hourly." : "No pending package updates. The agent checks hourly."} +

) : ( <> {/* Capped so a host with 400 pending packages does not make the @@ -60,9 +67,9 @@ export function MaintenanceTab({ - + - + diff --git a/web/components/workloads/WorkloadList.tsx b/web/components/workloads/WorkloadList.tsx index 072e204..8be40ef 100644 --- a/web/components/workloads/WorkloadList.tsx +++ b/web/components/workloads/WorkloadList.tsx @@ -45,7 +45,7 @@ const ACTION_PAST: Record = { restart: "Restarted", }; -export function WorkloadList({ serverId, canControl }: { serverId: string; canControl: boolean }) { +export function WorkloadList({ serverId, canControl, isWindows }: { serverId: string; canControl: boolean; isWindows: boolean }) { const qc = useQueryClient(); const toast = useToast(); const [logTarget, setLogTarget] = useState(null); @@ -115,7 +115,7 @@ export function WorkloadList({ serverId, canControl }: { serverId: string; canCo {snapshot.isLoading ? (

Loading…

) : !data ? ( -

Nothing reported yet. Agents report every 60 seconds, on Linux only.

+

Nothing reported yet. Agents report every 60 seconds.

) : (
{/* Docker absent is the common case on a fleet built @@ -128,9 +128,18 @@ export function WorkloadList({ serverId, canControl }: { serverId: string; canCo

Docker is not in use on this server.

) : null} + {/* One wire field, two honest words for it: the agent + reports Windows services under the same `unit` kind + systemd units use, and only the UI knows which host + this is. On Windows there is no "not in use" case — + every Windows host has a service controller — so a + failure is the only thing worth saying. */} {data.systemd_error ? ( -

systemd could not be read: {data.systemd_error}

- ) : !data.systemd_ok ? ( +

+ {isWindows ? "Windows services could not be read: " : "systemd could not be read: "} + {data.systemd_error} +

+ ) : !data.systemd_ok && !isWindows ? (

systemd is not in use on this server.

) : null}
diff --git a/web/lib/api.ts b/web/lib/api.ts index 8f93b31..df1ed40 100644 --- a/web/lib/api.ts +++ b/web/lib/api.ts @@ -14,6 +14,7 @@ export interface Inventory { swap_used_bytes: number; partitions?: { device: string; mountpoint: string; fstype?: string; total_bytes: number; used_bytes: number }[]; kernel?: string; + reboot_required?: boolean; metrics_at?: string; static_at?: string; }
Package{isWindows ? "Update" : "Package"} CurrentAvailable{isWindows ? "KB" : "Available"}