fix: authenticate device config sync like upload client

- send X-Device-Name and X-Api-Key to /api/device-config
- require YARIS_DEVICE_NAME alongside shared upload creds
- fix server create_device output to match actual Pi env names
- document shared upload/config sync credential requirements

Co-authored-by: Copilot <[email protected]>
This commit is contained in:
Mathieu Moran
2026-08-10 17:42:40 -04:00
co-authored by Copilot
parent 5a5058adca
commit a114939914
6 changed files with 47 additions and 42 deletions
+22 -29
View File
@@ -40,8 +40,9 @@ def _has_internet():
def _server_credentials():
server_url = os.getenv("YARIS_SERVER_URL", "").rstrip("/")
device_name = os.getenv("YARIS_DEVICE_NAME") or os.getenv("YARIS_UPLOAD_DEVICE_NAME", "")
device_key = os.getenv("YARIS_DEVICE_KEY") or os.getenv("YARIS_API_KEY", "")
return server_url, device_key
return server_url, device_name, device_key
def start_sync():
@@ -49,7 +50,7 @@ def start_sync():
global _SYNC_THREAD, _SYNC_STOP
if _SYNC_THREAD is not None:
return
_SYNC_STOP = False
_SYNC_THREAD = threading.Thread(target=_sync_loop, daemon=True)
_SYNC_THREAD.start()
@@ -70,48 +71,40 @@ def stop_sync():
def _sync_loop():
"""Periodically sync device config from server when internet available."""
global _SYNC_CONFIG_VERSION
server_url, device_key = _server_credentials()
if not server_url or not device_key:
return # Sync disabled if server URL or device key not configured
# Sync every 5 minutes (300 sec) when connected, backoff to 60 sec when offline
server_url, device_name, device_key = _server_credentials()
if not server_url or not device_name or not device_key:
return
sync_interval = 300
offline_interval = 60
while not _SYNC_STOP:
try:
is_connected = _has_internet()
if is_connected:
# Fetch device config from server
headers = {"Authorization": f"Bearer {device_key}"}
if _has_internet():
response = requests.get(
f"{server_url.rstrip('/')}/api/device-config",
headers=headers,
timeout=5
f"{server_url}/api/device-config",
headers={
"X-Device-Name": device_name,
"X-Api-Key": device_key,
},
timeout=5,
)
if response.status_code == 200:
config = response.json()
# Check if config changed
new_version = config.get("config_version", 0)
if new_version != _SYNC_CONFIG_VERSION:
_SYNC_CONFIG_VERSION = new_version
# Store in database
_store_synced_config(config)
# Signal that config changed (for hot-reload)
_on_config_changed()
time.sleep(sync_interval)
else:
# Offline: backoff to less frequent checks
time.sleep(offline_interval)
except Exception as e:
# Log error but don't crash sync thread
print(f"Device config sync error: {e}")
time.sleep(60)
@@ -134,8 +127,8 @@ def _on_config_changed():
def is_sync_enabled():
"""Check if device config sync from server is enabled."""
server_url, device_key = _server_credentials()
return bool(server_url) and bool(device_key)
server_url, device_name, device_key = _server_credentials()
return bool(server_url) and bool(device_name) and bool(device_key)
def get_synced_config_version():