No client data yet.
+No client data yet.
{% else %}
diff --git a/steward/ansible/executor.py b/steward/ansible/executor.py
index 3f51975..e061930 100644
--- a/steward/ansible/executor.py
+++ b/steward/ansible/executor.py
@@ -462,9 +462,16 @@ async def start_run(
except _Aborted:
final_status = "cancelled"
- except Exception:
+ except Exception as exc:
logger.exception("Ansible run %s failed with exception", run_id)
final_status = "cancelled" if run_id in _cancelled else "failed"
+ # Surface WHY in the run output instead of an empty "failed" (e.g. ENOSPC
+ # when the temp dir can't be created — the run never reaches Ansible).
+ msg = f"[run error] {type(exc).__name__}: {exc}"
+ _broadcast(run_id, msg)
+ if len(failures) < _FAILURE_CAP:
+ failures.append(msg[:500])
+ db_output = (db_output + "\n" + msg) if db_output else msg
finally:
if logf is not None:
logf.close()
diff --git a/steward/core/widgets.py b/steward/core/widgets.py
index 5f92858..7ea8671 100644
--- a/steward/core/widgets.py
+++ b/steward/core/widgets.py
@@ -27,7 +27,7 @@ WIDGET_REGISTRY: dict[str, dict] = {
"label": "Status — Overview",
"description": "Unified up/down/pending summary across ping, DNS, and HTTP monitors",
"hx_url": "/status/widget",
- "detail_url": "/status",
+ "detail_url": "/status/",
"plugin": None,
"poll": True,
"params": [],
diff --git a/steward/templates/status/widget.html b/steward/templates/status/widget.html
index eef40b8..2acc92f 100644
--- a/steward/templates/status/widget.html
+++ b/steward/templates/status/widget.html
@@ -7,7 +7,7 @@
{% set problems = entries | rejectattr("status", "equalto", "up") | list %}
{% if not entries %}
-
No monitors configured.
+
No monitors configured.
{% elif not problems %}
✓ All {{ up }} monitors are up.
{% else %}