From e284337fb2ba5ecfffb6bc7aca812a9dd60f069b Mon Sep 17 00:00:00 2001 From: jeanotx32 Date: Tue, 11 Aug 2026 18:51:17 +0200 Subject: [PATCH] Fix : Deploy bug 2 --- deploy/install-agent.ps1 | 46 ++++++++++++++++++++--- deploy/install-agent.sh | 80 ++++++++++++++++++++++++++++++++++------ 2 files changed, 109 insertions(+), 17 deletions(-) diff --git a/deploy/install-agent.ps1 b/deploy/install-agent.ps1 index 6eaff14..2a2463f 100644 --- a/deploy/install-agent.ps1 +++ b/deploy/install-agent.ps1 @@ -7,8 +7,10 @@ non comme service Windows : un service tourne en session 0 et ne verrait ni la fenêtre du navigateur, ni OBS. - Réexécuter le script met à jour le binaire sans toucher à l'identité d'un agent - déjà enrôlé. + Réexécuter le script met à jour le binaire et applique les options fournies. + L'identité de l'agent (jeton permanent, agentId) est préservée : sans cela il + réapparaîtrait en double dans le dashboard. Utiliser -ResetIdentity pour forcer + un réenrôlement. .EXAMPLE & ([scriptblock]::Create((irm 'https://git.jeanbonapp.com/api/packages/jeanbon/generic/stream-control-agent/latest/install-agent.ps1'))) ` @@ -31,7 +33,11 @@ param( [string] $ObsPassword = '', [string] $InstallDir = 'C:\stream-control-agent', [string] $RunAsUser = "$env:USERDOMAIN\$env:USERNAME", - [string] $TaskName = 'StreamControlAgent' + [string] $TaskName = 'StreamControlAgent', + # Réenrôle avec le -Token fourni : efface l'identité existante, ce qui crée un + # nouvel agent dans le dashboard. Sans ce commutateur, -Token est ignoré sur + # une mise à jour. + [switch] $ResetIdentity ) $ErrorActionPreference = 'Stop' @@ -112,9 +118,37 @@ Move-Item -Force $tmp (Join-Path $InstallDir 'agent.cjs') # --- Configuration ---------------------------------------------------------- if ($isUpgrade) { - # Un agent déjà enrôlé détient un jeton permanent : l'écraser le ferait - # réapparaître comme un second agent dans le dashboard. - Info 'Configuration existante conservée (identité de l''agent préservée)' + # Fusion, et non conservation en bloc : l'identité (jeton, agentId) est + # préservée — l'écraser ferait réapparaître l'agent en double dans le + # dashboard — mais toute option explicitement passée doit s'appliquer. + # $PSBoundParameters distingue « fourni » de « laissé au défaut ». + $raw = (Get-Content $configFile -Raw) -replace "^\uFEFF", '' + $current = $raw | ConvertFrom-Json + if (-not $current.obs) { + $current | Add-Member -NotePropertyName obs -NotePropertyValue ([pscustomobject]@{}) -Force + } + $applied = @() + + if ($PSBoundParameters.ContainsKey('Server')) { $current.serverUrl = $Server; $applied += 'serverUrl' } + if ($PSBoundParameters.ContainsKey('Name')) { $current.name = $Name; $applied += 'name' } + if ($PSBoundParameters.ContainsKey('ObsHost')) { $current.obs.host = $ObsHost; $applied += 'obs.host' } + if ($PSBoundParameters.ContainsKey('ObsPort')) { $current.obs.port = $ObsPort; $applied += 'obs.port' } + if ($PSBoundParameters.ContainsKey('ObsPassword')) { $current.obs.password = $ObsPassword; $applied += 'obs.password' } + + if ($ResetIdentity -and $Token) { + $current.token = $Token + $current.PSObject.Properties.Remove('agentId') + $applied += 'identité réinitialisée' + } elseif ($Token -and $Token -ne $current.token) { + Write-Host ' (-Token ignoré : identité conservée. Utilise -ResetIdentity pour forcer.)' + } + + $json = $current | ConvertTo-Json -Depth 5 + [System.IO.File]::WriteAllText($configFile, $json, (New-Object System.Text.UTF8Encoding($false))) + + Write-Host $(if ($applied.Count) { " champs mis à jour : $($applied -join ', ')" } + else { ' aucun changement demandé' }) + Info 'Configuration mise à jour, identité de l''agent préservée' } else { $config = [ordered]@{ serverUrl = $Server diff --git a/deploy/install-agent.sh b/deploy/install-agent.sh index 62e7828..ee461e0 100644 --- a/deploy/install-agent.sh +++ b/deploy/install-agent.sh @@ -19,12 +19,17 @@ VERSION="latest" PACKAGE_NAME="stream-control-agent" PACKAGE_TOKEN="" +# Vide = option non fournie. Les valeurs par défaut ne s'appliquent qu'à une +# première installation ; sur une mise à jour, seules les options réellement +# passées écrasent la configuration existante. SERVER_URL="" TOKEN="" -AGENT_NAME="$(hostname)" -OBS_HOST="127.0.0.1" -OBS_PORT="4455" +AGENT_NAME="" +OBS_HOST="" +OBS_PORT="" OBS_PASSWORD="" +OBS_PASSWORD_SET=false # un mot de passe vide est une valeur légitime +RESET_IDENTITY=false RUN_USER="" INSTALL_DIR="/opt/stream-control-agent" @@ -43,8 +48,9 @@ Installe (ou met à jour) l'agent Stream Control sur une VM Linux. --server ws://:8080/ws/agent \ --token -Réexécuter le script met à jour le binaire sans toucher à l'identité d'un agent -déjà enrôlé. +Réexécuter le script met à jour le binaire et applique les options fournies. +L'identité de l'agent (jeton permanent, agentId) est préservée : sans cela il +réapparaîtrait en double dans le dashboard. Options : --registry URL Base de l'instance Gitea (obligatoire) @@ -55,6 +61,8 @@ Options : --obs-host HOTE Défaut 127.0.0.1 --obs-port PORT Défaut 4455 --obs-password MDP Mot de passe obs-websocket + --reset-identity Réenrôler avec le --token fourni (efface l'identité + existante — crée un nouvel agent dans le dashboard) --version VERSION Version du paquet à installer (défaut : latest) --owner PROPRIETAIRE Propriétaire du paquet Gitea (défaut : jeanbon) --package-token JETON Jeton de lecture si le paquet est privé @@ -72,7 +80,8 @@ while [ $# -gt 0 ]; do --user) RUN_USER="${2:?}"; shift 2 ;; --obs-host) OBS_HOST="${2:?}"; shift 2 ;; --obs-port) OBS_PORT="${2:?}"; shift 2 ;; - --obs-password) OBS_PASSWORD="${2:?}"; shift 2 ;; + --obs-password) OBS_PASSWORD="${2-}"; OBS_PASSWORD_SET=true; shift 2 ;; + --reset-identity) RESET_IDENTITY=true; shift ;; --version) VERSION="${2:?}"; shift 2 ;; --owner) OWNER="${2:?}"; shift 2 ;; --package-token) PACKAGE_TOKEN="${2:?}"; shift 2 ;; @@ -99,6 +108,11 @@ IS_UPGRADE=false if [ "$IS_UPGRADE" = false ]; then [ -n "$SERVER_URL" ] || die "--server est obligatoire pour une première installation." [ -n "$TOKEN" ] || die "--token est obligatoire pour une première installation." + # Les défauts ne s'appliquent qu'ici : sur une mise à jour, une option absente + # doit laisser la valeur existante intacte, pas la remplacer par un défaut. + [ -n "$AGENT_NAME" ] || AGENT_NAME="$(hostname)" + [ -n "$OBS_HOST" ] || OBS_HOST="127.0.0.1" + [ -n "$OBS_PORT" ] || OBS_PORT="4455" fi echo @@ -160,9 +174,46 @@ mv "$TMP_FILE" "$INSTALL_DIR/agent.cjs" # --- Configuration ---------------------------------------------------------- if [ "$IS_UPGRADE" = true ]; then - # Un agent déjà enrôlé possède un jeton permanent : l'écraser avec le jeton - # d'enrôlement le ferait réapparaître comme un second agent dans le dashboard. - info "Configuration existante conservée (identité de l'agent préservée)" + # Fusion, et non conservation en bloc : l'identité (jeton, agentId) est + # préservée — l'écraser ferait réapparaître l'agent en double dans le + # dashboard — mais toute option explicitement passée doit s'appliquer. + RESET_FLAG=0 + [ "$RESET_IDENTITY" = true ] && RESET_FLAG=1 + PW_FLAG=0 + [ "$OBS_PASSWORD_SET" = true ] && PW_FLAG=1 + + node -e ' +const fs = require("node:fs"); +const a = process.argv.slice(1); +const [file, serverUrl, name, obsHost, obsPort, pwFlag, obsPassword, resetFlag, token] = a; + +const current = JSON.parse(fs.readFileSync(file, "utf8").replace(/^\uFEFF/, "")); +const next = { ...current, obs: { ...(current.obs || {}) } }; +const applied = []; + +if (serverUrl) { next.serverUrl = serverUrl; applied.push("serverUrl"); } +if (name) { next.name = name; applied.push("name"); } +if (obsHost) { next.obs.host = obsHost; applied.push("obs.host"); } +if (obsPort) { next.obs.port = Number(obsPort); applied.push("obs.port"); } +if (pwFlag === "1") { next.obs.password = obsPassword; applied.push("obs.password"); } + +if (resetFlag === "1" && token) { + next.token = token; + delete next.agentId; + applied.push("identité réinitialisée"); +} else if (token && token !== current.token) { + console.log(" (--token ignoré : identité conservée. Utilise --reset-identity pour forcer.)"); +} + +fs.writeFileSync(file, JSON.stringify(next, null, 2) + "\n"); +console.log(applied.length + ? " champs mis à jour : " + applied.join(", ") + : " aucun changement demandé"); +' "$CONFIG_FILE" "$SERVER_URL" "$AGENT_NAME" "$OBS_HOST" "$OBS_PORT" \ + "$PW_FLAG" "$OBS_PASSWORD" "$RESET_FLAG" "$TOKEN" \ + || die "Fusion de la configuration existante impossible ($CONFIG_FILE)." + + info "Configuration mise à jour, identité de l'agent préservée" else umask 077 cat > "$CONFIG_FILE" <