diff --git a/vps-monitor/backend/__pycache__/main.cpython-313.pyc b/vps-monitor/backend/__pycache__/main.cpython-313.pyc index d7fe435..a60e5d5 100644 Binary files a/vps-monitor/backend/__pycache__/main.cpython-313.pyc and b/vps-monitor/backend/__pycache__/main.cpython-313.pyc differ diff --git a/vps-monitor/backend/main.py b/vps-monitor/backend/main.py index 4d198f3..ffb0c6a 100644 --- a/vps-monitor/backend/main.py +++ b/vps-monitor/backend/main.py @@ -8,6 +8,7 @@ import asyncio import base64 import json import os +import re import secrets import sqlite3 import time @@ -47,7 +48,18 @@ from webauthn.helpers.structs import ( # ─── Config ─────────────────────────────────────────────────────────────────── DB_FILE = Path(os.getenv("DB_FILE", "data/monitor.db")) -EXPECTED_AGENT_VERSION = os.getenv("EXPECTED_AGENT_VERSION", "1.2.0") + +# Version de référence : d'abord env var explicite, sinon récupérée dynamiquement depuis le dépôt +_FORCED_AGENT_VERSION = os.getenv("EXPECTED_AGENT_VERSION", "") # si non vide, court-circuite le fetch +REPO_AGENT_URL = os.getenv( + "REPO_AGENT_URL", + "https://git.jeanbonapp.com/jeanbon/ScriptVPS/raw/branch/main/vps-monitor/agent/agent.py", +) +_latest_agent_version: str = _FORCED_AGENT_VERSION or "unknown" + + +def _get_expected_version() -> str: + return _latest_agent_version # ─── Ring buffer de stats (en mémoire) ─────────────────────────────────────── _STATS_MAX_POINTS = 120 # 10 min à 5 s d'intervalle @@ -541,8 +553,8 @@ async def fetch_vps_status(vps: dict) -> dict: "system": system, "tags": vps.get("tags", []), "agent_version": agent_version, - "expected_agent_version": EXPECTED_AGENT_VERSION, - "agent_up_to_date": agent_version == EXPECTED_AGENT_VERSION, + "expected_agent_version": _get_expected_version(), + "agent_up_to_date": agent_version == _get_expected_version() and _get_expected_version() != "unknown", } except Exception as e: return { @@ -557,7 +569,7 @@ async def fetch_vps_status(vps: dict) -> dict: "system": None, "tags": vps.get("tags", []), "agent_version": None, - "expected_agent_version": EXPECTED_AGENT_VERSION, + "expected_agent_version": _get_expected_version(), "agent_up_to_date": False, } @@ -614,10 +626,37 @@ async def _stats_collector() -> None: await asyncio.sleep(5) +async def _refresh_latest_agent_version() -> None: + """Récupère AGENT_VERSION depuis le dépôt Gitea toutes les heures. + Si EXPECTED_AGENT_VERSION est défini en env var, cette tâche n'écrase pas la valeur forcée. + """ + global _latest_agent_version + if _FORCED_AGENT_VERSION: + return # version forcée par env var — pas besoin de fetcher + while True: + try: + timeout = aiohttp.ClientTimeout(total=10) + async with aiohttp.ClientSession() as session: + async with session.get(REPO_AGENT_URL, timeout=timeout) as r: + if r.status == 200: + text = await r.text() + m = re.search( + r'^AGENT_VERSION\s*=\s*["\']([^"\']+)["\']', + text, + re.MULTILINE, + ) + if m: + _latest_agent_version = m.group(1) + except Exception: + pass # garder la dernière valeur connue en cas d'erreur réseau + await asyncio.sleep(3600) # rafraîchit toutes les heures + + @app.on_event("startup") async def startup_event() -> None: asyncio.create_task(_stats_collector()) asyncio.create_task(_cleanup_old_stats()) + asyncio.create_task(_refresh_latest_agent_version()) async def _cleanup_old_stats() -> None: