64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
|
|
"""Opt-in, minimal, HTTPS-only telemetry and update checks."""
|
||
|
|
import os
|
||
|
|
from urllib.parse import urlparse
|
||
|
|
|
||
|
|
|
||
|
|
def _https_endpoint(env_name):
|
||
|
|
endpoint = os.environ.get(env_name, "").strip()
|
||
|
|
if not endpoint:
|
||
|
|
return ""
|
||
|
|
parsed = urlparse(endpoint)
|
||
|
|
if parsed.scheme != "https" or not parsed.netloc or parsed.username or parsed.password:
|
||
|
|
raise ValueError("%s must be an HTTPS URL without embedded credentials" % env_name)
|
||
|
|
return endpoint
|
||
|
|
|
||
|
|
|
||
|
|
def heartbeat_payload(sequence):
|
||
|
|
from framework.settings import PROJECT_FLAG, PROJECT_VERSION
|
||
|
|
return {
|
||
|
|
"event": "heartbeat",
|
||
|
|
"product": PROJECT_FLAG,
|
||
|
|
"version": PROJECT_VERSION,
|
||
|
|
"sequence": int(sequence),
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
def send_heartbeat(sequence, session=None):
|
||
|
|
from app.utils.GlobalUtils import g_config
|
||
|
|
if not getattr(g_config, "telemetryEnabled", False):
|
||
|
|
return False, "telemetry disabled"
|
||
|
|
endpoint = _https_endpoint("MONITOR_TELEMETRY_ENDPOINT")
|
||
|
|
if not endpoint:
|
||
|
|
return False, "telemetry endpoint not configured"
|
||
|
|
if session is None:
|
||
|
|
import requests
|
||
|
|
session = requests
|
||
|
|
response = session.post(
|
||
|
|
endpoint, json=heartbeat_payload(sequence), timeout=10, allow_redirects=False
|
||
|
|
)
|
||
|
|
return response.status_code == 200, "status=%s" % response.status_code
|
||
|
|
|
||
|
|
|
||
|
|
def check_update(lang=None, session=None):
|
||
|
|
from app.utils.GlobalUtils import g_config
|
||
|
|
if not getattr(g_config, "updateCheckEnabled", False):
|
||
|
|
return False, False, "update check disabled", {}
|
||
|
|
endpoint = _https_endpoint("MONITOR_UPDATE_ENDPOINT")
|
||
|
|
if not endpoint:
|
||
|
|
return False, False, "update endpoint not configured", {}
|
||
|
|
from framework.settings import PROJECT_FLAG, PROJECT_VERSION
|
||
|
|
payload = {"product": PROJECT_FLAG, "version": PROJECT_VERSION, "lang": (lang or "")[:12]}
|
||
|
|
if session is None:
|
||
|
|
import requests
|
||
|
|
session = requests
|
||
|
|
try:
|
||
|
|
response = session.post(endpoint, json=payload, timeout=10, allow_redirects=False)
|
||
|
|
if response.status_code != 200:
|
||
|
|
return True, False, "status=%s" % response.status_code, {}
|
||
|
|
result = response.json()
|
||
|
|
if result.get("code") == 1000:
|
||
|
|
return True, True, str(result.get("msg", "ok")), result.get("data") or {}
|
||
|
|
return True, False, str(result.get("msg", "no update")), {}
|
||
|
|
except Exception as exc:
|
||
|
|
return False, False, str(exc), {}
|