Commit Graph

3477 Commits

Author SHA1 Message Date
rcourtman 183e169380 Auto-update Helm chart version to 5.1.34 helm-chart-5.1.34 2026-06-02 12:11:56 +00:00
rcourtman a468858189 Auto-update Helm chart documentation 2026-06-02 12:11:54 +00:00
rcourtman 3a63e2ad5d Prepare v5.1.34 release v5.1.34 2026-06-02 11:42:45 +01:00
rcourtman 7204684ca3 Retire orphaned agent-identity Ceph alerts on dedup
Follow-up to the #1341 dual-source fix. When the Proxmox API identity
wins the FSID dedup, proactively clear any usage alert still active under
this agent's own pool IDs so a pre-fix duplicate clears on the next agent
report rather than aging out over the ~24h stale-alert window. Agent-only
clusters (where the agent identity is the winner) are untouched.
2026-06-02 11:31:21 +01:00
rcourtman c6364dd453 Collapse dual-source Ceph pools to one alert identity
Fixes #1341 (reopened)

When the same Ceph cluster is reported by both the Proxmox API poller
(instance "pve5") and a Pulse host-agent (instance "agent:pve5"), it
landed in state twice under two pool-ID namespaces
("pve5-ceph-pool-X" vs "agent:pve5-ceph-pool-X"). The frontend collapsed
them via an FSID dedup whose winner was chosen by a fluctuating
completeness score, but alert evaluation ran on the raw, un-deduped list
(and ce1607694 added a third check on the raw agent cluster). So:

  - the threshold UI row identity flipped between the two pool IDs as the
    dedup winner oscillated, making a saved per-pool override appear to
    revert between the custom value and the storage default; and
  - both pool IDs were alert-checked under independent lifecycles,
    producing duplicate, flapping active alerts.

Make alert evaluation and the frontend consume the same deterministic
FSID-deduplicated Ceph view (DedupeCephClusters), preferring the
authoritative non-agent identity so a pool has exactly one ID. Route the
agent-report and mock alert paths through GetDedupedCephClusters, and
honor the legacy "agent:"-prefixed override key for the surviving pool so
existing thresholds keep firing without manual re-entry. Retires the
ce1607694 agent-only check path.
2026-06-02 11:28:28 +01:00
rcourtman bb9d73c737 Backport alert cooldown delivery guard
Refs #1444
2026-06-01 14:35:36 +01:00
rcourtman 0e79bb1b28 Auto-update Helm chart version to 5.1.33 helm-chart-5.1.33 2026-05-29 11:47:36 +00:00
rcourtman 46a37a2548 Auto-update Helm chart documentation 2026-05-29 11:47:34 +00:00
rcourtman afbf8788f0 Backport Proxmox guest metric fallback
Centralize the QEMU guest-agent MemAvailable fallback on the 5.1 branch and record the direct guest-agent value in diagnostic snapshots.

Add regression coverage for the issue #1319 saturated Linux memory payload and Windows fsinfo volume payload.

Refs #1319
v5.1.33
2026-05-29 12:02:31 +01:00
rcourtman 9a9ec01b84 Enable opt-in v5 RBAC enforcement
Release: v5.1.33
2026-05-29 11:57:15 +01:00
rcourtman ce1607694e Run ceph pool alerts for agent-sourced clusters
Fixes #1341

When a Pulse host-agent reports Ceph data, ApplyHostReport upserts the
cluster into state but only the Proxmox-API polling path ran
cephPoolAlertStorageTargets. Users with agent-reported Ceph (instance
prefix "agent:hostname") saved per-pool overrides under
agent-prefixed IDs that the alert manager never evaluated. The
threshold appeared to save (and showed Custom in the UI), but the
polling cycle was checking a different storage ID, so the alert
silently stayed dormant. Run CheckStorage for each pool right after
the agent upsert so the override key actually drives evaluation.
2026-05-28 14:11:22 +01:00
rcourtman 2c46c6c2db Stop swallowing alert config persistence errors
Refs #1341

UpdateAlertConfig used to log SaveAlertConfig failures and still tell
the client "saved successfully", leaving the in-memory state with the
new override but the on-disk file untouched. On the next config reload
or process restart, the override silently vanished and the user saw
their threshold "revert" with no surfaced error. Return HTTP 500 with
the persistence error so the frontend can show a real save-failed
toast instead of false confidence.
2026-05-28 13:12:55 +01:00
rcourtman 9ac7df976f Surface alert override identities in diagnostics
Refs #1341

buildAlertsDiagnostic previously emitted only boolean flags (legacy
thresholds, missing cooldown/grouping window). Override keys and their
trigger values were absent, so triaging a support case where the user
suspects an override mismatch required asking them to paste
data/alerts.json from inside their container. Add an Overrides slice
that names each persisted key with its thresholds and disabled flags.
Sanitize mode in the frontend redacts the keys to override-N while
keeping thresholds visible, so a public export still shows the alert
shape without leaking instance names that may be hostnames.
2026-05-28 10:45:10 +01:00
rcourtman a70f1d9676 Cover Ceph pool override path with regression test
Refs #1341

The 5.1.32 fix in 6f3bea32f only tested the storage default path for
synthetic Ceph pool entries. Reporter on #1341 sets a 50% per-pool
override on a pool at ~61% usage and still doesn't get an alert; lock
the override path against future regressions so this remains a config
question rather than a code regression.
2026-05-28 10:24:35 +01:00
rcourtman 6b5fb6f82a Fix guest table full-width layout expansion
Ensure the dashboard guest table expands to 100% of the container width on large screens (especially under the Proxmox overview tab), while retaining the minimum width calculation to prevent horizontal collapses.

Fixes #1480
2026-05-26 07:30:35 +01:00
rcourtman c01917811a Auto-update Helm chart version to 5.1.32 helm-chart-5.1.32 2026-05-25 07:13:46 +00:00
rcourtman 9289b16346 Prepare v5.1.32 release v5.1.32 2026-05-25 07:36:27 +01:00
rcourtman 18944b0350 Fix resolved notifications for state alerts
Refs #1350
2026-05-24 23:27:45 +01:00
rcourtman 15d76f34ea Fix dashboard guest table width in Firefox
Refs #1430
2026-05-24 23:20:15 +01:00
rcourtman 375ff62a96 Persist Docker-agent image identity by default
Refs #1447
2026-05-24 23:14:45 +01:00
rcourtman da38263ea4 Prefer linked host-agent VM disk inventory
Refs #1438
2026-05-24 23:07:24 +01:00
rcourtman d8d5016a30 Preserve split agent backend IDs in unified rows
Refs #1421
2026-05-24 22:56:21 +01:00
rcourtman c10b0dc353 Keep metric bars visually critical when alerts are disabled
Refs #1319
2026-05-24 22:43:46 +01:00
rcourtman 469a8e1bdc Count Ceph monitors from detailed monmap data
Refs #1290
2026-05-24 22:32:58 +01:00
rcourtman 8046b5035d Prefer Proxmox guest-agent privileges
Refs #1466
2026-05-24 22:28:29 +01:00
rcourtman 117ec901da Clarify PBS alert threshold identity
Refs #1448
2026-05-24 22:13:58 +01:00
rcourtman a8f6dbd8b4 Prefer host-agent temperature data over SSH fallback
Refs #1473
2026-05-24 22:04:36 +01:00
rcourtman 98945e3228 Allow multiline email recipient entry
Refs #1462
2026-05-24 22:01:58 +01:00
rcourtman f32a3e5235 Coalesce duplicate metric writes
Refs #1442
2026-05-24 21:55:27 +01:00
rcourtman 8600706da3 Fix FreeBSD agent restart handling
Refs #1457
2026-05-24 21:51:11 +01:00
rcourtman 0dca8a0375 Keep snapshot polling independent of backup scans
Refs #1437
2026-05-24 21:41:56 +01:00
rcourtman 6f3bea32ff Fix Ceph pool alert threshold targets
Refs #1341
2026-05-24 21:35:46 +01:00
rcourtman 2dffa40379 Fix v5 user-reported monitoring and auth issues
Refs #1452

Refs #1455

Refs #1467

Refs #1471

Refs #1472

Refs #1477

Refs #1478

Refs #1479
2026-05-24 21:07:55 +01:00
rcourtman e503863c9e Fix guest metadata migration race
Refs #1435
v5.1.31 helm-chart-5.1.31
2026-05-17 09:43:42 +01:00
rcourtman 87440d9a42 Prepare v5.1.31 release 2026-05-17 09:32:35 +01:00
rcourtman 87ed3398b9 Fix stable installer prerelease fallback
Refs #1435
2026-05-17 09:30:33 +01:00
rcourtman 5a20994b0d Auto-update Helm chart documentation 2026-05-03 19:11:34 +00:00
rcourtman 7475c8a238 Auto-update Helm chart version to 5.1.30 helm-chart-5.1.30 2026-05-03 19:07:40 +00:00
rcourtman 719e78ce2f Auto-update Helm chart documentation 2026-05-03 19:07:39 +00:00
rcourtman 8071758ce3 Prepare v5.1.30 release
Refs #1454
v5.1.30
2026-05-03 19:25:54 +01:00
rcourtman 8337cbc4c9 Fix v5 diagnostics GitHub export
Normalize diagnostics collection fields to empty arrays before encoding and harden the sanitized GitHub export path against null arrays so empty v5 installs can still produce issue attachments.

Refs #1454
2026-05-03 19:12:24 +01:00
rcourtman 9bfef81d93 Fix v5 update helper installer URL
Render the maintenance installer URL into the generated update helper so it does not depend on installer-only shell functions after installation. Add a smoke test that executes the generated helper with fake curl and bash to preserve source-build forwarding.\n\nRefs #1454
2026-05-03 18:57:28 +01:00
rcourtman 80adfe848c Bump postcss to 8.5.13 on release/5.1
Keeps the release/5.1 frontend lockfile above the patched floor for GHSA-qx2v-qp2m-jg93 and aligned with the default-branch Dependabot fix.

Refs Dependabot alert #83.
2026-05-01 20:18:00 +01:00
rcourtman 7294f795cb Auto-update Helm chart version to 5.1.29 helm-chart-5.1.29 2026-05-01 14:44:25 +00:00
rcourtman 08fd10188e Auto-update Helm chart documentation 2026-05-01 14:44:23 +00:00
rcourtman 858c894023 Prepare v5.1.29 release v5.1.29 2026-05-01 15:04:48 +01:00
rcourtman 84d6aa7ba8 Document issue-first contribution policy
Pulse is a single-maintainer project and does not accept unsolicited
external pull requests. README, CONTRIBUTING, and a new
PULL_REQUEST_TEMPLATE now state this directly so contributors hit the
policy before investing time in code, and so PRs opened in error point
to issues and discussions as the correct intake.

CONTRIBUTING is rewritten end-to-end around the new policy: how to
file bugs, feature requests, support questions, and security reports;
where to look for context (README, ARCHITECTURE, docs/); and the
maintainer-direction carve-out for PRs explicitly requested against
tracked issues.
2026-05-01 15:04:41 +01:00
rcourtman 3d3b1a9642 Stop re-notification spam when alert cooldown is disabled (Fixes #1444)
shouldNotifyAfterCooldown previously returned true on every call when
Schedule.Cooldown was 0 or negative, which the alert evaluation loop
runs on every metric tick. With cooldown disabled, an active alert was
re-notified on each tick.

The UI labels cooldown=0 as "Disabled," so the intuitive contract is
"do not re-notify," not "re-notify continuously." Treat <=0 as
"first-time only": fire the initial notification, then suppress
subsequent re-notifications until the alert clears or the cooldown is
configured to a positive value. Level escalation re-notifications
remain handled at the call site and are unaffected.

Tests cover all three branches: first-time fire with cooldown=0,
re-notification suppression with cooldown=0 (named regression guard
for #1444), and the same behavior for negative values.
2026-05-01 15:04:27 +01:00
rcourtman f0f20422da Always make UpdateProgressModal closable so a stuck update can't lock the UI
The modal had no close path when isComplete() was false: the X button
was Show-gated on isComplete(), there was no Escape handler, and the
backdrop had no onClick. So if the SSE stream dropped, the polling
fallback failed, or the update process crashed before writing a
terminal status, the modal stayed open with a black backdrop covering
the page and no way to dismiss it except a hard browser refresh — the
"page is blacked out and you can't press anything" symptom.

Make the close path always available:
  - The X button in the header is no longer Show-gated. Its tooltip
    and aria-label adapt to clarify that closing during an active
    update only hides the modal — the update keeps running.
  - Escape on the document closes the modal while it is open.
  - Clicking on the backdrop (and only the backdrop, not the modal
    body) closes the modal.

The actual update process is server-side and unaffected: closing
just unmounts the modal's local SSE/polling. GlobalUpdateProgressWatcher
keeps polling /api/updates/status independently and will surface
completion via the existing reload path or via the Updates settings
page.

Frontend type-check passes and the 447-test vitest suite is green.
2026-04-30 12:01:25 +01:00
rcourtman 611ae5b9f8 Add --agent-id-file so containerized agents keep a stable identity
Pulse agents derive their identity from /etc/machine-id by default. In
Docker containers (especially nested in LXCs), /etc/machine-id is not
guaranteed stable across container recreation: a fresh image instance
gets a new machine-id, and the resulting AgentID drift causes the
server to reject reports with 401 because the API token is bound to
the original AgentID via the bound_agent_id token-metadata check
(internal/api/router.go:1448-1458). Refs #1447.

Add a --agent-id-file (and PULSE_AGENT_ID_FILE env var) flag that:

  1. Reads the persisted AgentID from the file on start, when present,
     and short-circuits machine-id detection. The user mounts the file
     as a Docker volume (e.g. -v pulse-agent-id:/var/lib/pulse-agent)
     so it survives container recreation.
  2. On first start (or when the file is missing/empty), the existing
     machine-id derivation runs and the resolved ID is written to the
     file atomically (tmp + rename, 0600 perms, parent dir created).

Subsequent restarts of the container — even after `docker rm -f` and
a fresh `docker run` — read the same ID from the volume and the
server keeps recognising the agent.

Default is no flag set, which preserves the current
/etc/machine-id-derived behaviour for non-containerized installs.
2026-04-30 11:50:08 +01:00