From 33e0b73f7f246e19a11be50b46e17cca8a1c87b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Gr=C3=BCssing?= Date: Fri, 26 Jun 2026 14:14:14 +0200 Subject: [PATCH] Fix: AGENT_VERSION-Fallback-Bug erneut behoben (Downgrade auf v2.0.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beim heutigen Secrets-Cleanup von docker-compose.yml ging AGENT_VERSION verloren (war nur ad-hoc auf dem Server gesetzt, nie versioniert) — der Code-Fallback griff dadurch wieder auf hartcodierte Alt-Versionen zurück ('2.0.0'/'1.2.4'/'1.2.3'), wodurch 17 Agents beim Selbst-Update-Versuch fälschlich auf v2.0.0 downgraded wurden. AGENT_VERSION jetzt fest im docker-compose.yml-Template verankert, alle Fallback-Stellen im Code auf eine gemeinsame FALLBACK_AGENT_VERSION-Konstante zusammengeführt. Co-Authored-By: Claude Sonnet 4.6 --- backend/src/controllers/monitoringAgent.controller.js | 11 ++++++++--- docker-compose.yml | 4 ++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/backend/src/controllers/monitoringAgent.controller.js b/backend/src/controllers/monitoringAgent.controller.js index b558874..fddaa62 100644 --- a/backend/src/controllers/monitoringAgent.controller.js +++ b/backend/src/controllers/monitoringAgent.controller.js @@ -7,6 +7,11 @@ const { getForAgent } = require('./announcement.controller'); const { validateAgentKey } = require('../utils/agentAuth'); const crypto = require('crypto'); +// Code-seitiger Fallback falls AGENT_VERSION env-Var fehlt — bei jedem Agent-Release mit hochziehen! +// (War zuvor an mehreren Stellen hartcodiert auf alte Versionen wie '2.0.0'/'1.2.4' — echter +// Downgrade-Bug für Agents ohne Patch-Gruppe oder ohne ?hostname-Parameter.) +const FALLBACK_AGENT_VERSION = '2.8.0'; + // POST /api/monitoring/enroll — Agent tauscht geteilten Bootstrap-Key gegen individuellen Per-Device-Key. // Idempotent: ein bereits enrollter Agent bekommt seinen bestehenden Key einfach erneut zurück. const enroll = asyncHandler(async (req, res) => { @@ -123,7 +128,7 @@ const checkin = asyncHandler(async (req, res) => { const { pending, running } = getPendingCommands(agent.id); // Zielversion: Gruppen-spezifisch (staged rollout) oder globaler Default - const GLOBAL_VERSION = process.env.AGENT_VERSION || '1.2.4'; + const GLOBAL_VERSION = process.env.AGENT_VERSION || FALLBACK_AGENT_VERSION; let targetVersion = GLOBAL_VERSION; try { const db = getDatabase(); @@ -211,7 +216,7 @@ const downloadScript = asyncHandler(async (req, res) => { return res.status(404).json({ status: 'error', message: 'Script nicht gefunden' }); } res.setHeader('Content-Type', 'text/plain; charset=utf-8'); - res.setHeader('X-Agent-Version', process.env.AGENT_VERSION || '1.2.3'); + res.setHeader('X-Agent-Version', process.env.AGENT_VERSION || FALLBACK_AGENT_VERSION); res.sendFile(scriptPath); }); @@ -244,7 +249,7 @@ const downloadSetup = asyncHandler(async (req, res) => { const fs = require('fs'); // Zielversion: Gruppen-spezifisch (staged rollout) oder globaler Default — gleiche Logik wie checkin() - let version = process.env.AGENT_VERSION || '2.0.0'; + let version = process.env.AGENT_VERSION || FALLBACK_AGENT_VERSION; const hostname = req.query.hostname; if (hostname) { try { diff --git a/docker-compose.yml b/docker-compose.yml index dac0e81..4fd973f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,6 +18,10 @@ services: - SCANNER_API_KEY=${SCANNER_API_KEY} - ENCRYPTION_KEY=${ENCRYPTION_KEY} - TV_DASHBOARD_KEY=${TV_DASHBOARD_KEY} + # Globaler Fallback für Agents ohne Patch-Gruppe ODER ohne ?hostname-Parameter (alte Agent-Versionen + # vor v2.5.0) — bei jedem neuen Agent-Release IMMER mit hochziehen, sonst fallen alte/gruppenlose + # Agents auf den hartcodierten Code-Default zurück (war zuvor 2.0.0 — ein echter Downgrade-Bug)! + - AGENT_VERSION=${AGENT_VERSION} - JWT_EXPIRATION=8h - DATABASE_PATH=/app/data/database.sqlite - FRONTEND_URL=https://it-nexus.cereda-systems.de