Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f022673c4d |
No files matched your search
@@ -298,12 +298,19 @@ function MatchAdminCard({ m, run, busy, token, reload, setNotice }) {
|
||||
{current.live?.roundsPlayed != null && <span className="muted">Runde {current.live.roundsPlayed + 1}</span>}
|
||||
</div>
|
||||
)}
|
||||
{m.server?.address && m.server.status !== 'stopped' && (
|
||||
{m.server && (m.server.requestedAt || (m.server.address && m.server.status !== 'stopped')) && (
|
||||
<div className="admin-address">
|
||||
{m.server.address && m.server.status !== 'stopped' && (
|
||||
<>
|
||||
<span><span className="muted">Server</span> <code>{m.server.address.host}:{m.server.address.port}</code></span>
|
||||
{m.server.address.tvPort && (
|
||||
<span><span className="muted">CSTV</span> <code>{m.server.address.host}:{m.server.address.tvPort}</code></span>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
{m.server.requestedAt && (
|
||||
<span><span className="muted">Angefordert</span> {formatDateTime(m.server.requestedAt)}</span>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
{paused && <span className="admin-badge is-paused">Pausiert</span>}
|
||||
@@ -686,3 +693,7 @@ function DockerHostsPanel({ token, setNotice }) {
|
||||
</section>
|
||||
);
|
||||
}
|
||||
/** Datum und Uhrzeit auf Deutsch, z. B. 29.10.2026, 12:54 Uhr */
|
||||
function formatDateTime(ms) {
|
||||
return `${new Date(ms).toLocaleString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' })} Uhr`;
|
||||
}
|
||||
@@ -956,8 +956,10 @@ export class MatchService extends EventEmitter {
|
||||
updatedAt: row.updated_at,
|
||||
idleTimeoutMinutes: this.config.idleTimeoutMinutes,
|
||||
};
|
||||
if (viewer.isOrganizer && row.host) {
|
||||
view.address = { host: row.host, port: row.port, tvPort: row.tv_port };
|
||||
if (viewer.isOrganizer) {
|
||||
// Zeitpunkt der letzten Anforderung (neuer Start oder "Server neu starten / wiederholen")
|
||||
view.requestedAt = row.started_at ?? null;
|
||||
if (row.host) view.address = { host: row.host, port: row.port, tvPort: row.tv_port };
|
||||
}
|
||||
const configured = row.status === 'configured';
|
||||
if (!configured || viewer.role === 'public') return view;
|
||||
|
||||
@@ -378,11 +378,8 @@ export class DockerHostPool {
|
||||
adapterFor(handle) {
|
||||
const name = handle?.hostName ?? this.hosts[0].name;
|
||||
const adapter = this.adapters.get(name);
|
||||
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`);
|
||||
if (!adapter) throw new Error(`Docker-Host "${name}" ist nicht (mehr) konfiguriert`);
|
||||
return adapter;
|
||||
}
|
||||
|
||||
async status(handle) {
|
||||
|
||||
@@ -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 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/);
|
||||
// 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/);
|
||||
});
|
||||
|
||||
test('Alte Handles ohne Host-Namen laufen auf dem ersten Host', () => {
|
||||
@@ -96,14 +96,3 @@ 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/);
|
||||
});
|
||||
Reference in new issue
Block a user