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:
15
app/omada.py
15
app/omada.py
@@ -103,9 +103,12 @@ class OmadaClient:
|
|||||||
resp.raise_for_status()
|
resp.raise_for_status()
|
||||||
data = resp.json()
|
data = resp.json()
|
||||||
if data.get("errorCode", 0) in (-1006, -1003, -30109):
|
if data.get("errorCode", 0) in (-1006, -1003, -30109):
|
||||||
|
logger.info("Session error %s — re-authenticating", data.get("errorCode"))
|
||||||
self._token = None
|
self._token = None
|
||||||
self._sites = None
|
self._sites = None
|
||||||
await self._login()
|
await self._login()
|
||||||
|
await self._fetch_sites()
|
||||||
|
client = self._get_client()
|
||||||
resp = await client.request(method, url, headers=self._auth_headers(), **kwargs)
|
resp = await client.request(method, url, headers=self._auth_headers(), **kwargs)
|
||||||
resp.raise_for_status()
|
resp.raise_for_status()
|
||||||
data = resp.json()
|
data = resp.json()
|
||||||
@@ -160,6 +163,8 @@ class OmadaClient:
|
|||||||
"""Fetch APs from every accessible site and return a combined list."""
|
"""Fetch APs from every accessible site and return a combined list."""
|
||||||
await self._ensure_ready()
|
await self._ensure_ready()
|
||||||
all_aps = []
|
all_aps = []
|
||||||
|
failed_sites = 0
|
||||||
|
total_sites = len(self._sites)
|
||||||
for site_name, site_key in self._sites.items():
|
for site_name, site_key in self._sites.items():
|
||||||
try:
|
try:
|
||||||
data = await self._request_with_retry(
|
data = await self._request_with_retry(
|
||||||
@@ -174,7 +179,15 @@ class OmadaClient:
|
|||||||
all_aps.append(d)
|
all_aps.append(d)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.warning("Failed to fetch devices for site '%s': %s", site_name, 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
|
return all_aps
|
||||||
|
|
||||||
async def _get_ap_uptime(self, mac: str, site_key: str) -> int:
|
async def _get_ap_uptime(self, mac: str, site_key: str) -> int:
|
||||||
|
|||||||
Reference in New Issue
Block a user