fix: implement host-filesystem state file with transition detection
The contract said the state file was written after every scan, but the script had no state-file logic at all. This PR adds: 1. Host filesystem scanning (probe_host_filesystems) - probes df on all PVE nodes 2. State file I/O (read_state_file/write_state_file) - absolute path from script location 3. Band classification (classify_band) - HOST-WARN/AMBER/RED thresholds 4. Transition detection (detect_transitions) - alerts on escalation/recovery 5. CLI flags (--hosts-only, --guests-only) to control which parts run The contract now specifies the state file path resolves from the script's own location (not CWD-relative), so two different execution contexts cannot write to two different places.
This commit is contained in:
@@ -65,7 +65,7 @@ Host filesystems have their own risk profile and their own bands. A host root ne
|
||||
|
||||
**Escalations are STATE-CHANGE driven, not per-run.** A volume alerts ONCE when it enters a higher band (GREEN->WARN, WARN->AMBER, AMBER->RED) and ONCE when it drops back down (a recovery notice). While a volume stays in the same band, it is reported in the scan output only — no DM, no channel alert. This prevents the same 96% easystore2 from re-DMing the owner on every 6-hour scan and drowning a real warning in noise.
|
||||
|
||||
**State lives in a small JSON state file:** `state/host-disk-bands.json`, keyed by `host/volume` → last-seen band. The scanner reads the prior band, compares to the current band, and DMs only on a transition. The state file is written after every scan. (Chosen over a periodic digest because the scan already runs every 6h and a transition is genuinely new, actionable state that warrants an immediate DM — but only once.)
|
||||
**State lives in a small JSON state file:** the scanner resolves it to an absolute path from the script's location — `$(dirname "$0")/state/host-disk-bands.json` (i.e., the `state/` directory next to the `scripts/` directory in the prose-contracts repo). Keyed by `host/volume` → last-seen band. The scanner reads the prior band, compares to the current band, and DMs only on a transition. The state file is written after every scan. (Chosen over a periodic digest because the scan already runs every 6h and a transition is genuinely new, actionable state that warrants an immediate DM — but only once.)
|
||||
|
||||
**Volume naming rule:** Every host line MUST name the volume and what lives on it. Example output:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user