feat(deploy): reliability API routes, atomic releases, version single-source

This commit is contained in:
2026-08-22 15:20:39 -06:00
parent aba08e36c7
commit 1bb15de258
10 changed files with 586 additions and 40 deletions
@@ -4863,6 +4863,60 @@ def h_rfplan_post(ctx):
return (200, result) if ok else (502, result)
def h_profiles_get(ctx):
import mk8_profiles
return 200, {'profiles': mk8_profiles.list_profiles()}
def h_profile_save(ctx):
import mk8_events
import mk8_profiles
body = ctx.body or {}
name = (body.get('name') or '').strip()
if not name:
return 400, {'error': 'profile name is required'}
try:
ok = bool(mk8_profiles.snapshot(name))
except ValueError as exc:
return 400, {'error': str(exc)}
except OSError:
ok = False
try:
mk8_events.log_event('profile_save', sev='info' if ok else 'warn',
msg='profile %s %s'
% (name, 'saved' if ok else 'save failed'),
meta={'name': name, 'ok': ok})
except Exception:
pass
return (200, {'ok': True}) if ok else (502, {'ok': False})
def h_profile_restore(ctx):
import mk8_events
import mk8_gate
import mk8_profiles
body = ctx.body or {}
name = (body.get('name') or '').strip()
if not name:
return 400, {'error': 'profile name is required'}
mk8_gate.enter('restore_profile')
try:
result = mk8_profiles.restore(name)
except ValueError as exc:
return 400, {'error': str(exc)}
device_run(['wifi', 'reload'], timeout=45)
ok = bool(result.get('ok'))
try:
mk8_events.log_event('profile_restore',
sev='info' if ok else 'warn',
msg='profile %s %s' % (name, 'restored' if ok
else 'restore failed'),
meta=result)
except Exception:
pass
return (200, result) if ok else (502, result)
# --------------------------------------------------------------------------
# Startup environment check: run once at service startup (and via
# ``server.py --env-check`` on the payload screen) to make the device match
@@ -7247,6 +7301,9 @@ ROUTER.add('GET', r'/api/mode', h_mode_get)
ROUTER.add('POST', r'/api/mode/release', h_mode_release)
ROUTER.add('GET', r'/api/rfplan', h_rfplan_get)
ROUTER.add('POST', r'/api/rfplan/role', h_rfplan_post)
ROUTER.add('GET', r'/api/reliability/profiles', h_profiles_get)
ROUTER.add('POST', r'/api/reliability/profile', h_profile_save)
ROUTER.add('POST', r'/api/reliability/restore', h_profile_restore)
def serve():