Fix : Deploy bug 2
This commit is contained in:
@@ -7,8 +7,10 @@
|
|||||||
non comme service Windows : un service tourne en session 0 et ne verrait ni la
|
non comme service Windows : un service tourne en session 0 et ne verrait ni la
|
||||||
fenêtre du navigateur, ni OBS.
|
fenêtre du navigateur, ni OBS.
|
||||||
|
|
||||||
Réexécuter le script met à jour le binaire sans toucher à l'identité d'un agent
|
Réexécuter le script met à jour le binaire et applique les options fournies.
|
||||||
déjà enrôlé.
|
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
|
.EXAMPLE
|
||||||
& ([scriptblock]::Create((irm 'https://git.jeanbonapp.com/api/packages/jeanbon/generic/stream-control-agent/latest/install-agent.ps1'))) `
|
& ([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] $ObsPassword = '',
|
||||||
[string] $InstallDir = 'C:\stream-control-agent',
|
[string] $InstallDir = 'C:\stream-control-agent',
|
||||||
[string] $RunAsUser = "$env:USERDOMAIN\$env:USERNAME",
|
[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'
|
$ErrorActionPreference = 'Stop'
|
||||||
@@ -112,9 +118,37 @@ Move-Item -Force $tmp (Join-Path $InstallDir 'agent.cjs')
|
|||||||
|
|
||||||
# --- Configuration ----------------------------------------------------------
|
# --- Configuration ----------------------------------------------------------
|
||||||
if ($isUpgrade) {
|
if ($isUpgrade) {
|
||||||
# Un agent déjà enrôlé détient un jeton permanent : l'écraser le ferait
|
# Fusion, et non conservation en bloc : l'identité (jeton, agentId) est
|
||||||
# réapparaître comme un second agent dans le dashboard.
|
# préservée — l'écraser ferait réapparaître l'agent en double dans le
|
||||||
Info 'Configuration existante conservée (identité de l''agent préservée)'
|
# 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 {
|
} else {
|
||||||
$config = [ordered]@{
|
$config = [ordered]@{
|
||||||
serverUrl = $Server
|
serverUrl = $Server
|
||||||
|
|||||||
@@ -19,12 +19,17 @@ VERSION="latest"
|
|||||||
PACKAGE_NAME="stream-control-agent"
|
PACKAGE_NAME="stream-control-agent"
|
||||||
PACKAGE_TOKEN=""
|
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=""
|
SERVER_URL=""
|
||||||
TOKEN=""
|
TOKEN=""
|
||||||
AGENT_NAME="$(hostname)"
|
AGENT_NAME=""
|
||||||
OBS_HOST="127.0.0.1"
|
OBS_HOST=""
|
||||||
OBS_PORT="4455"
|
OBS_PORT=""
|
||||||
OBS_PASSWORD=""
|
OBS_PASSWORD=""
|
||||||
|
OBS_PASSWORD_SET=false # un mot de passe vide est une valeur légitime
|
||||||
|
RESET_IDENTITY=false
|
||||||
|
|
||||||
RUN_USER=""
|
RUN_USER=""
|
||||||
INSTALL_DIR="/opt/stream-control-agent"
|
INSTALL_DIR="/opt/stream-control-agent"
|
||||||
@@ -43,8 +48,9 @@ Installe (ou met à jour) l'agent Stream Control sur une VM Linux.
|
|||||||
--server ws://<IP_DU_CONTROLE>:8080/ws/agent \
|
--server ws://<IP_DU_CONTROLE>:8080/ws/agent \
|
||||||
--token <JETON_ENROLEMENT>
|
--token <JETON_ENROLEMENT>
|
||||||
|
|
||||||
Réexécuter le script met à jour le binaire sans toucher à l'identité d'un agent
|
Réexécuter le script met à jour le binaire et applique les options fournies.
|
||||||
déjà enrôlé.
|
L'identité de l'agent (jeton permanent, agentId) est préservée : sans cela il
|
||||||
|
réapparaîtrait en double dans le dashboard.
|
||||||
|
|
||||||
Options :
|
Options :
|
||||||
--registry URL Base de l'instance Gitea (obligatoire)
|
--registry URL Base de l'instance Gitea (obligatoire)
|
||||||
@@ -55,6 +61,8 @@ Options :
|
|||||||
--obs-host HOTE Défaut 127.0.0.1
|
--obs-host HOTE Défaut 127.0.0.1
|
||||||
--obs-port PORT Défaut 4455
|
--obs-port PORT Défaut 4455
|
||||||
--obs-password MDP Mot de passe obs-websocket
|
--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)
|
--version VERSION Version du paquet à installer (défaut : latest)
|
||||||
--owner PROPRIETAIRE Propriétaire du paquet Gitea (défaut : jeanbon)
|
--owner PROPRIETAIRE Propriétaire du paquet Gitea (défaut : jeanbon)
|
||||||
--package-token JETON Jeton de lecture si le paquet est privé
|
--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 ;;
|
--user) RUN_USER="${2:?}"; shift 2 ;;
|
||||||
--obs-host) OBS_HOST="${2:?}"; shift 2 ;;
|
--obs-host) OBS_HOST="${2:?}"; shift 2 ;;
|
||||||
--obs-port) OBS_PORT="${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 ;;
|
--version) VERSION="${2:?}"; shift 2 ;;
|
||||||
--owner) OWNER="${2:?}"; shift 2 ;;
|
--owner) OWNER="${2:?}"; shift 2 ;;
|
||||||
--package-token) PACKAGE_TOKEN="${2:?}"; shift 2 ;;
|
--package-token) PACKAGE_TOKEN="${2:?}"; shift 2 ;;
|
||||||
@@ -99,6 +108,11 @@ IS_UPGRADE=false
|
|||||||
if [ "$IS_UPGRADE" = false ]; then
|
if [ "$IS_UPGRADE" = false ]; then
|
||||||
[ -n "$SERVER_URL" ] || die "--server est obligatoire pour une première installation."
|
[ -n "$SERVER_URL" ] || die "--server est obligatoire pour une première installation."
|
||||||
[ -n "$TOKEN" ] || die "--token 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
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@@ -160,9 +174,46 @@ mv "$TMP_FILE" "$INSTALL_DIR/agent.cjs"
|
|||||||
|
|
||||||
# --- Configuration ----------------------------------------------------------
|
# --- Configuration ----------------------------------------------------------
|
||||||
if [ "$IS_UPGRADE" = true ]; then
|
if [ "$IS_UPGRADE" = true ]; then
|
||||||
# Un agent déjà enrôlé possède un jeton permanent : l'écraser avec le jeton
|
# Fusion, et non conservation en bloc : l'identité (jeton, agentId) est
|
||||||
# d'enrôlement le ferait réapparaître comme un second agent dans le dashboard.
|
# préservée — l'écraser ferait réapparaître l'agent en double dans le
|
||||||
info "Configuration existante conservée (identité de l'agent préservée)"
|
# 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
|
else
|
||||||
umask 077
|
umask 077
|
||||||
cat > "$CONFIG_FILE" <<EOF
|
cat > "$CONFIG_FILE" <<EOF
|
||||||
@@ -217,15 +268,22 @@ systemctl restart "$SERVICE"
|
|||||||
echo
|
echo
|
||||||
# Mêmes variables que l'unité systemd, sinon le diagnostic signale un DISPLAY
|
# Mêmes variables que l'unité systemd, sinon le diagnostic signale un DISPLAY
|
||||||
# absent que le service, lui, aura bien.
|
# absent que le service, lui, aura bien.
|
||||||
|
CHECK_OK=true
|
||||||
sudo -u "$RUN_USER" \
|
sudo -u "$RUN_USER" \
|
||||||
AGENT_CONFIG="$CONFIG_FILE" \
|
AGENT_CONFIG="$CONFIG_FILE" \
|
||||||
DISPLAY=":0" \
|
DISPLAY=":0" \
|
||||||
XAUTHORITY="$USER_HOME/.Xauthority" \
|
XAUTHORITY="$USER_HOME/.Xauthority" \
|
||||||
"$(command -v node)" "$INSTALL_DIR/agent.cjs" --check || true
|
"$(command -v node)" "$INSTALL_DIR/agent.cjs" --check || CHECK_OK=false
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
if systemctl is-active --quiet "$SERVICE"; then
|
if systemctl is-active --quiet "$SERVICE"; then
|
||||||
|
if [ "$CHECK_OK" = true ]; then
|
||||||
echo "✓ Agent installé et démarré."
|
echo "✓ Agent installé et démarré."
|
||||||
|
else
|
||||||
|
echo "✓ Agent installé et démarré — mais le diagnostic ci-dessus signale un"
|
||||||
|
echo " problème bloquant. L'agent retentera en boucle jusqu'à sa résolution ;"
|
||||||
|
echo " il n'apparaîtra pas dans le dashboard d'ici là."
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
echo "✗ Le service n'est pas actif. Journal :"
|
echo "✗ Le service n'est pas actif. Journal :"
|
||||||
journalctl -u "$SERVICE" -n 20 --no-pager || true
|
journalctl -u "$SERVICE" -n 20 --no-pager || true
|
||||||
|
|||||||
Reference in New Issue
Block a user