Fix stale session causing persistent empty AP list

Two changes:

1. _request_with_retry: after a session-error re-login, also re-fetch
   sites and refresh the client reference so the retry uses valid state.

2. get_aps: if every site fails with an exception, clear the token and
   sites cache so the very next page reload triggers a fresh login.
   Previously the broken state was sticky until a container restart.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-28 09:11:55 +02:00
parent d7d2af7b9b
commit b6082e2c60

View File

@@ -103,9 +103,12 @@ class OmadaClient:
resp.raise_for_status()
data = resp.json()
if data.get("errorCode", 0) in (-1006, -1003, -30109):
logger.info("Session error %s — re-authenticating", data.get("errorCode"))
self._token = None
self._sites = None
await self._login()
await self._fetch_sites()
client = self._get_client()
resp = await client.request(method, url, headers=self._auth_headers(), **kwargs)
resp.raise_for_status()
data = resp.json()
@@ -160,6 +163,8 @@ class OmadaClient:
"""Fetch APs from every accessible site and return a combined list."""
await self._ensure_ready()
all_aps = []
failed_sites = 0
total_sites = len(self._sites)
for site_name, site_key in self._sites.items():
try:
data = await self._request_with_retry(
@@ -174,7 +179,15 @@ class OmadaClient:
all_aps.append(d)
except Exception as exc:
logger.warning("Failed to fetch devices for site '%s': %s", site_name, exc)
logger.info("Fetched %d APs across %d sites", len(all_aps), len(self._sites))
failed_sites += 1
if failed_sites > 0 and failed_sites == total_sites:
# Every site failed — session is likely stale with an unrecognised error code.
# Clear auth state so the next request triggers a full re-login instead of
# requiring a container restart.
logger.warning("All %d site(s) failed — clearing session state to force re-auth on next request", total_sites)
self._token = None
self._sites = None
logger.info("Fetched %d APs across %d sites", len(all_aps), total_sites)
return all_aps
async def _get_ap_uptime(self, mac: str, site_key: str) -> int: