From 6c258462eaa557b0419d6ea9d18dc11b730871f1 Mon Sep 17 00:00:00 2001 From: Dom Date: Tue, 7 Jul 2026 16:15:54 +0200 Subject: [PATCH] =?UTF-8?q?docs(handoff):=20handoff=20sujet-scopp=C3=A9=20?= =?UTF-8?q?installateur/MAJ/GPO=20=E2=80=94=202026-07-07?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Handoff auto-suffisant pour reprise parallèle du sujet installateur Léa (install silencieuse dashboard + MAJ AD/GPO + procédure), isolé des autres sujets. Sans secrets (renvois reference_credentials). Réf commit 48b1fc280. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../2026-07-07_installateur_maj_gpo.md | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 docs/handoffs/2026-07-07_installateur_maj_gpo.md diff --git a/docs/handoffs/2026-07-07_installateur_maj_gpo.md b/docs/handoffs/2026-07-07_installateur_maj_gpo.md new file mode 100644 index 000000000..7287c14cb --- /dev/null +++ b/docs/handoffs/2026-07-07_installateur_maj_gpo.md @@ -0,0 +1,114 @@ +# HANDOFF — Installateur Léa : install silencieuse + MAJ + déploiement AD/GPO + +> **Handoff sujet-scoppé** (pour travail parallèle multi-agents). Portée = UNIQUEMENT +> l'installateur/MAJ/déploiement des clients Léa. NE couvre PAS le cœur v1 (ORALoop), +> R1/apprentissage, fusion sémantique — ces sujets ont leurs propres fils. +> Date : 2026-07-07. Un agent doit pouvoir reprendre ce sujet avec ce seul fichier. +> ⚠️ Aucun secret ici (fichier versionné/poussé gitea) — creds : voir §Infra. + +## 0. Cap (rappel) +POC clinique Wallerstein : 5 postes Léa (TIM, logiciels métier web/RDP/Citrix, 2 écrans). +Ce sujet = **industrialiser l'install et la MAJ de l'agent client Léa** sans casser +l'enrôlement (identité par poste). L'installeur EXE `Lea-Setup-v1.0.2.exe` est +**per-user, upgrade-safe** (préserve `machine_id` + config, tue Léa, backup, purge). + +## 1. Statut : ✅ LIVRÉ + DÉPLOYÉ cette session +Commit **`48b1fc280`** sur `feat/push-log-dgx` (**poussé gitea**, et route greffée sur la prod DGX). + +| Livrable | Fichier | État | +|---|---|---| +| Install silencieuse **nouveau poste** (dashboard) | route `GET /api/fleet/installer` dans `web_dashboard/app.py` | ✅ **live + vérifiée sur DGX** (200, sert le ZIP) | +| Lanceur d'install manuel | `deploy/installer/silent/install_silencieux.bat` (+ `enroll.txt`, `LISEZMOI_SILENCIEUX.txt`) | ✅ **validé sur poste réel .11** (RC=0, upgrade-safe) | +| **MAJ via AD/GPO** | `deploy/gpo/Deploy-LeaUpdate.ps1` | ✅ **validé sur .11** (PS 5.1, 2 branches, DryRun) | +| Procédure opérateur | `docs/PROCEDURE_DEPLOIEMENT_LEA_JULIEN.md` | ✅ | +| EXE distribué | `deploy/installer/releases/Lea-Setup-v1.0.2.exe` (SHA256 `07105c4bd446…e36b520`, 24 896 371 o) | ✅ sur DGX (non versionné, `.gitignore`) | + +## 2. Architecture — 2 voies DISTINCTES (ne pas confondre) +- **Install NEUVE** (poste sans Léa) → **dashboard, MANUELLE** : opérateur télécharge + `GET /api/fleet/installer` → ZIP `Lea-Install-Silencieux-vX.Y.Z.zip` {EXE + + `install_silencieux.bat` + `enroll.txt` (SERVER_URL+token pré-injectés par + `_resolve_public_server_url` + `RPA_API_TOKEN`) + LISEZMOI}. Remplir USER_NAME/EMAIL, + double-clic. L'EXE **génère un machine_id neuf** → pas de pré-enregistrement. + « Silencieuse » = sans fenêtre d'assistant (`/VERYSILENT`), **pas** « via GPO ». +- **MAJ d'un poste EXISTANT** → **AD/GPO, AUTOMATIQUE** : `Deploy-LeaUpdate.ps1`. + +### Points d'archi non négociables (vérifiés en réel) +1. **Install PER-USER** (`PrivilegesRequired=lowest`, dossier `%LOCALAPPDATA%\Programs\Lea`, + clé désinstall sous **HKCU**) ⇒ le script GPO **DOIT** être un **Logon script + (User Configuration), contexte UTILISATEUR** — jamais Computer/Startup (SYSTEM ne + voit ni l'install per-user ni HKCU → ne mettrait rien à jour). +2. **Détection de version = `DisplayVersion` du registre HKCU** (clé Inno + `{B3F9A1E2-5C4D-4E7F-9A1B-2C3D4E5F6789}_is1`). Le `config.txt` généré par l'EXE + **ne contient PAS** la version (vérifié sur .11) ; fallback `RPA_AGENT_VERSION` + = installs via ZIP seulement. +3. Comparaison **semver** (piège `1.0.2 < 1.0.10`). `Deploy-LeaUpdate.ps1` : idempotent, + journalisation best-effort **silencieuse** (`-ErrorAction SilentlyContinue` — un + `try/catch` ne capture PAS les erreurs non-terminantes d'un partage injoignable), + non bloquant à l'ouverture de session. Options : `-DryRun`, + `-TargetVersionOverride`, `-LogShareOverride`. +4. Voie ZIP/Python historique (`download_agent_package`, `deploy/lea_package/`) = + séparée, ne pas la confondre avec la voie EXE. + +## 3. Reste à faire (par ordre logique) +- **A. Mise en place réelle de la GPO dans le domaine clinique** (dépend DSI **Nicolas + Porquet**) : créer un **partage** `\\\...\Lea\` (y déposer l'EXE), configurer + la **GPO Logon script** pointant sur `Deploy-LeaUpdate.ps1` (éditer les 3 params en + tête : `$ExeSource`, `$TargetVersion`, `$LogShare`), tester. → *Ce qu'un agent peut + produire : un **doc/pack de mise en place GPO dédié au DSI** (partage + import GPO + + test DryRun).* +- **B. (optionnel, CHANTIER NEUF) Install NEUVE aussi via AD/GPO** : aujourd'hui la + nouvelle install passe par le dashboard manuel. Si Dom veut que les nouveaux postes + se déploient par GPO → à construire (déploiement EXE + enroll/token par poste, + machine_id). **Non fait.** +- **C.** Valider `install_silencieux.bat` au **1er vrai poste neuf** (Dom) — cf. + option 1 du plan de validation. +- **D.** MAJ manuelle des **4 postes restants** (Dom + Julien) via l'EXE en double-clic + (upgrade-safe). Émilie (poste pilote) = déjà en 1.0.2. +- **E.** Réconciliation DGX (distinct) — voir §Infra. + +## 4. Infra & accès (creds = NON écrits ici) +- **DGX clinique** : `aivanov@192.168.1.178` (VPN Stormshield, route /32 .178 ; + `.45` legacy). Repo runtime `/home/aivanov/ai/rpa_vision_v3`, venv **`venv_v3`**. + Dashboard :5001 = **service systemd SYSTEM** `rpa-vision-v3-dashboard.service` → + **restart = `sudo systemctl restart` (mot de passe aivanov requis, pas de NOPASS)**. + Détail + état branche : mémoire `reference_dgx_runtime_repo_state`. + ⚠️ Branche locale DGX nommée `poc-dgx` mais sur **lignée `feat/push-log-dgx`** + (`3ed9798` = ancêtre du tip gitea `c371c977`) → **pas divergente, juste en retard + + working tree sale** (workflows.db, learned_workflow_bridge.py, app.py greffé à + préserver). Réconciliation = fast-forward + préserver ces fichiers. +- **Poste Windows labo `.11`** (`DESKTOP-58D5CAC`) : source de l'EXE + `C:\lea_build\releases\Lea-Setup-v1.0.2.exe`. SSH par **password** (user `dom`) — + le cert MCP est cassé (`public_blob`), forcer + `-o PubkeyAuthentication=no -o PreferredAuthentications=password` (+ `sshpass`). + MCP `ssh-windows` corrigé (`SSH_AUTH_SOCK=""` ajouté à `~/.claude.json`) → **effectif + au prochain restart de Claude Code**. +- **gitea** : `http://localhost:3100/Dom/rpa_vision_v3.git` (sur le poste dev .40), + remote local nommé `gitea`, auth via helper `store`. `feat/push-log-dgx` = à jour + (`48b1fc280`). Auth dashboard = Basic (creds `DASHBOARD_USER`/`DASHBOARD_PASSWORD` + dans `.env.local` DGX). **Tous les creds** : mémoire `reference_credentials` / + demander à Dom. + +## 5. Comment reprendre / re-vérifier (sans secrets) +- Route dashboard live (DGX, depuis la DGX) : + `curl -s -u "$U:$P" http://localhost:5001/api/fleet/installer` + → `200` + ZIP si l'EXE est dans `releases/`, sinon `404` « EXE introuvable » (creds `$U/$P` = `.env.local`). +- Test GPO **sans rien installer** (sur un poste avec Léa) : + `powershell -NoProfile -ExecutionPolicy Bypass -File Deploy-LeaUpdate.ps1 -DryRun` + → journalise « déjà à jour » ou « [DryRun] MAJ qui SERAIT appliquée ». +- Intégrité EXE : SHA256 attendu `07105c4bd446dded1dbdb0acaf337a38814e4760aa9361f5a7d4051a4e36b520`. + +## 6. Pièges appris (gain de temps) +- **Escaping 4 couches** (bash→ssh→cmd→PowerShell) casse silencieusement → toujours + **uploader un `.ps1` et l'exécuter avec `-File`**, jamais du PowerShell inline complexe. +- **zsh ne word-split PAS** une variable non-quotée → mettre les options `-o …` de + ssh/scp **inline**, pas dans `$OPT`. +- **py_compile ne détecte que la syntaxe** — pour l'app.py DGX, valider aussi que la + route répond (404 propre) après restart + attendre ~1-5 s que le port 5001 écoute. +- Le test réel a rapporté **2 bugs** invisibles en test Linux (détection version + registre, erreur non-terminante) → sur ce sujet, **toujours valider sur un vrai + poste Windows** (`.11`). + +## 7. Liens mémoire +`reference_dgx_runtime_repo_state` · `project_session_20260701_exe_emilie_v102` · +`reference_windows_pc` · `reference_credentials` · `feedback_verify_physical_artifact_deploy` · +`feedback_smoke_plus_reel`. Tableau d'avancement : `docs/TABLEAU_BORD_CHANTIERS_POC.md`.