From b616bbafc1ae6cf3dd4f07b514508ac8896f51bb Mon Sep 17 00:00:00 2001 From: MrEgosar Date: Thu, 29 Oct 2026 13:54:46 +0100 Subject: [PATCH] =?UTF-8?q?Docker:=20alte=20Server=20ohne=20passenden=20Ho?= =?UTF-8?q?st-Namen=20=C3=BCber=20die=20Adresse=20finden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/servers/dockerAdapter.js | 7 +++++-- server/test/dockerHostPool.test.js | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/server/src/servers/dockerAdapter.js b/server/src/servers/dockerAdapter.js index f12407f..0fc29e4 100644 --- a/server/src/servers/dockerAdapter.js +++ b/server/src/servers/dockerAdapter.js @@ -378,8 +378,11 @@ export class DockerHostPool { adapterFor(handle) { const name = handle?.hostName ?? this.hosts[0].name; const adapter = this.adapters.get(name); - if (!adapter) throw new Error(`Docker-Host "${name}" ist nicht (mehr) konfiguriert`); - return adapter; + if (adapter) return adapter; + // Server aus der Zeit vor der Host-Liste (Name "default") oder nach einer Umbenennung: über die Adresse finden + const byAddress = handle?.rconHost && this.hosts.find((h) => h.rconHost === handle.rconHost || h.publicHost === handle.rconHost); + if (byAddress) return this.adapters.get(byAddress.name); + throw new Error(`Docker-Host "${name}" ist nicht (mehr) konfiguriert`); } async status(handle) { diff --git a/server/test/dockerHostPool.test.js b/server/test/dockerHostPool.test.js index f1c458a..100ab29 100644 --- a/server/test/dockerHostPool.test.js +++ b/server/test/dockerHostPool.test.js @@ -72,8 +72,8 @@ test('Status, Stopp und Befehle gehen an den Host des Matches', async () => { await p.stop(r.handle); assert.deepEqual(calls.at(-1)[0], 'rm'); assert.equal(calls.at(-1).at(-1), r.handle.container); - // Ein Handle von einem Host, der nicht mehr konfiguriert ist, wird abgelehnt - await assert.rejects(p.status({ ...r.handle, hostName: 'gelöscht' }), /nicht \(mehr\) konfiguriert/); + // Ein Handle von einem Host, der weder per Name noch per Adresse bekannt ist, wird abgelehnt + await assert.rejects(p.status({ ...r.handle, hostName: 'gelöscht', rconHost: '10.9.9.9' }), /nicht \(mehr\) konfiguriert/); }); test('Alte Handles ohne Host-Namen laufen auf dem ersten Host', () => { @@ -96,3 +96,14 @@ test('df-Ausgabe wird in Gesamt- und freien Speicher zerlegt', async () => { }); assert.equal(parseDf('kaputt'), null); }); +test('Alter Handle ohne passenden Host-Namen wird über die Adresse dem richtigen Host zugeordnet', async () => { + const docker = fakeDocker(); + const p = new DockerHostPool(options([ + { ...hostA, rconHost: '10.0.0.1' }, + { ...hostB, rconHost: '10.0.0.2' }, + ]), { runDocker: docker.run }); + await p.stop({ container: 'cs2mv-alt', hostName: 'default', rconHost: '10.0.0.2', port: 27100 }); + assert.deepEqual(docker.calls.at(-1), ['rm', '-f', 'cs2mv-alt']); + assert.equal(p.adapterFor({ hostName: 'default', rconHost: '10.0.0.2' }).options.name, 'b'); + assert.throws(() => p.adapterFor({ hostName: 'weg', rconHost: '10.9.9.9' }), /nicht \(mehr\) konfiguriert/); +});