From e59489e2cd95dcf3c1831e9c6a7c73dc2539e94f Mon Sep 17 00:00:00 2001 From: Dom Date: Wed, 1 Jul 2026 23:58:54 +0200 Subject: [PATCH] =?UTF-8?q?feat(installer):=20upgrade=20=E2=80=94=20backup?= =?UTF-8?q?=20rollback=20(hors=20embed)=20+=20purge=20captures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Complete la voie 1 sur les 2 items de confort/securite du checklist upgrade : - BACKUP : robocopy code+config vers _backup HORS python-embed/sessions/ logs (leger, rapide) => filet de rollback manuel si la nouvelle version deconne (l'install manuel n'a pas d'A/B auto). - PURGE : suppression des captures accumulees (agent_v1/sessions) = donnees d'apprentissage internes non exploitables cote clinique. Libere le disque ; le fix capture JPEG evite la reprise de saturation. Logs conserves (180j). Valide .11 (upgrade sur etat Emilie) : Lea tuee, identite+serveur preserves, backup code/config sans embed, 40 PNG purges -> 0, exit 0. Co-Authored-By: Claude Opus 4.8 (1M context) --- deploy/installer/Lea.iss | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/deploy/installer/Lea.iss b/deploy/installer/Lea.iss index a2ab2d63d..e6625df4b 100644 --- a/deploy/installer/Lea.iss +++ b/deploy/installer/Lea.iss @@ -587,12 +587,16 @@ end; // -------------------------------------------------------------------- function PrepareToInstall(var NeedsRestart: Boolean): String; var - LockPath: string; + AppDir, LockPath, BackupDir, SessionsDir: string; Lines: TArrayOfString; ResultCode: Integer; begin Result := ''; - LockPath := ExpandConstant('{app}\lea_agent.lock'); + AppDir := ExpandConstant('{app}'); + + // 1) Tuer une Lea en cours (via le PID du lock) pour liberer les DLL + // python-embed. Ne tue QUE ce PID, jamais tous les pythonw du poste. + LockPath := AppDir + '\lea_agent.lock'; if FileExists(LockPath) then begin if LoadStringsFromFile(LockPath, Lines) and (GetArrayLength(Lines) > 0) then @@ -600,6 +604,27 @@ begin DeleteFile(LockPath); Sleep(1500); end; + + // UPGRADE uniquement (install existante detectee via config.txt). + if FileExists(AppDir + '\config.txt') then + begin + // 2) BACKUP (rollback) : copie code+config vers _backup, HORS + // python-embed / sessions / logs (leger, rapide). Filet si la nouvelle + // version deconne : Julien restaure ce dossier. + BackupDir := AppDir + '_backup'; + Exec(ExpandConstant('{cmd}'), + '/c rmdir /s /q "' + BackupDir + '" 2>nul & robocopy "' + AppDir + '" "' + BackupDir + + '" /E /XD python-embed sessions logs __pycache__ /XF *.pyc /R:1 /W:1 /NFL /NDL /NJH /NJS /NP >nul 2>&1', + '', SW_HIDE, ewWaitUntilTerminated, ResultCode); + + // 3) PURGE des captures accumulees (donnees d'apprentissage internes, non + // exploitables cote clinique) : libere le disque. Le fix capture JPEG + // evite que la saturation reprenne. Les logs (compliance 180j) restent. + SessionsDir := AppDir + '\agent_v1\sessions'; + if DirExists(SessionsDir) then + Exec(ExpandConstant('{cmd}'), + '/c rmdir /s /q "' + SessionsDir + '"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); + end; end; // --------------------------------------------------------------------