diff --git a/roles/protonvpn/files/protonvpn-watchdog.py b/roles/protonvpn/files/protonvpn-watchdog.py index 93f5315..ad1cc1a 100644 --- a/roles/protonvpn/files/protonvpn-watchdog.py +++ b/roles/protonvpn/files/protonvpn-watchdog.py @@ -111,34 +111,36 @@ class AsyncDaemon(BaseAsyncDaemon): self.bad_servers: Set[str] = set() async def get_serverlist(self) -> Optional[Json]: + data: Optional[Json] = None try: f = open(self.SERVER_LIST, encoding='utf-8') except FileNotFoundError: pass else: with f: + try: + data = json.load(f) + except ValueError as e: + log.warning('Failed to parse server list: %s', e) st = os.fstat(f.fileno()) now = time.time() if st.st_mtime > now - 3600: log.info('Using cached server list from %s', f.name) - try: - return json.load(f) - except ValueError as e: - log.warning('Failed to parse server list: %s', e) + return data async with httpx.AsyncClient() as client: log.info('Fetching server list from %s', self.SERVER_LIST_URL) - r: httpx.Response = await client.get(self.SERVER_LIST_URL) - if r.status_code != HTTPStatus.OK: - log.error( - 'Failed to fetch server list: HTTP status %s', - r.status_code, - ) - return None + r: httpx.Response + try: + r = await client.get(self.SERVER_LIST_URL) + r.raise_for_status() + except httpx.HTTPError as e: + log.error('Failed to fetch server list: %s', e) + return data try: data = r.json() except ValueError as e: log.error('Failed to parse server list: %s', e) - return None + return data path = Path(self.SERVER_LIST) path.parent.mkdir(parents=True, exist_ok=True) with path.open('w', encoding='utf-8') as f: