mirror of
https://github.com/jmagar/unraid-mcp.git
synced 2026-03-23 12:39:24 -07:00
merge: subscription fixes from worktree (validation, byte cap, autostart, URL scheme)
This commit is contained in:
@@ -15,7 +15,7 @@ def build_ws_url() -> str:
|
||||
The WebSocket URL string (e.g. "wss://10.1.0.2:31337/graphql").
|
||||
|
||||
Raises:
|
||||
ValueError: If UNRAID_API_URL is not configured.
|
||||
ValueError: If UNRAID_API_URL is not configured or has an unrecognised scheme.
|
||||
"""
|
||||
if not UNRAID_API_URL:
|
||||
raise ValueError("UNRAID_API_URL is not configured")
|
||||
@@ -24,8 +24,13 @@ def build_ws_url() -> str:
|
||||
ws_url = "wss://" + UNRAID_API_URL[len("https://") :]
|
||||
elif UNRAID_API_URL.startswith("http://"):
|
||||
ws_url = "ws://" + UNRAID_API_URL[len("http://") :]
|
||||
elif UNRAID_API_URL.startswith(("ws://", "wss://")):
|
||||
ws_url = UNRAID_API_URL # Already a WebSocket URL
|
||||
else:
|
||||
ws_url = UNRAID_API_URL
|
||||
raise ValueError(
|
||||
f"UNRAID_API_URL must start with http://, https://, ws://, or wss://. "
|
||||
f"Got: {UNRAID_API_URL[:20]}..."
|
||||
)
|
||||
|
||||
if not ws_url.endswith("/graphql"):
|
||||
ws_url = ws_url.rstrip("/") + "/graphql"
|
||||
@@ -60,8 +65,8 @@ def _analyze_subscription_status(
|
||||
) -> tuple[int, list[dict[str, Any]]]:
|
||||
"""Analyze subscription status dict, returning error count and connection issues.
|
||||
|
||||
This is the canonical, shared implementation used by both the health tool
|
||||
and the subscription diagnostics tool.
|
||||
Only reports connection_issues for subscriptions that are currently in a
|
||||
failure state (not recovered ones that happen to have a stale last_error).
|
||||
|
||||
Args:
|
||||
status: Dict of subscription name -> status info from get_subscription_status().
|
||||
@@ -69,15 +74,19 @@ def _analyze_subscription_status(
|
||||
Returns:
|
||||
Tuple of (error_count, connection_issues_list).
|
||||
"""
|
||||
_error_states = frozenset(
|
||||
{"error", "auth_failed", "timeout", "max_retries_exceeded", "invalid_uri"}
|
||||
)
|
||||
error_count = 0
|
||||
connection_issues: list[dict[str, Any]] = []
|
||||
|
||||
for sub_name, sub_status in status.items():
|
||||
runtime = sub_status.get("runtime", {})
|
||||
conn_state = runtime.get("connection_state", "unknown")
|
||||
if conn_state in ("error", "auth_failed", "timeout", "max_retries_exceeded", "invalid_uri"):
|
||||
if conn_state in _error_states:
|
||||
error_count += 1
|
||||
if runtime.get("last_error"):
|
||||
# Gate on current failure state so recovered subscriptions are not reported
|
||||
if runtime.get("last_error") and conn_state in _error_states:
|
||||
connection_issues.append(
|
||||
{
|
||||
"subscription": sub_name,
|
||||
|
||||
Reference in New Issue
Block a user