Compare commits

..
2 Commits
Author SHA1 Message Date
D4rkst3randClaude Opus 5 0f0097ba3c Die Freigabeseite zaehlte ihre eigene Kappung als Gesamtzahl
Gemeldet: die Uebersichtsseite zeigt 2000 Bilder, die Galerie 3685. Gemessen
am Ordner "items": es sind WIRKLICH 3685. Es fehlt keine Datei -- die Seite
zaehlte falsch.

Der Grund stand in zwei Zeilen nebeneinander:

    ... ORDER BY path COLLATE NOCASE LIMIT 2000
    anzahl: zeilen.length,

Die Zahl war also nicht die Anzahl der Dateien, sondern die Anzahl der
geholten Zeilen -- und damit machte die Seite aus ihrer eigenen Kappung eine
Aussage ueber den Bestand. Genau der Fall aus CLAUDE.md: eine Auskunft, die
nicht alles sehen kann, meldet nicht die halbe Zahl als ganze.

Jetzt: COUNT(*) getrennt fuer die wahre Zahl, die Grenze bleibt (20000, damit
eine Freigabe auf einen riesigen Ordner den Dienst nicht erschlaegt) und wird
als `gezeigt` mit ausgeliefert. Sind beide gleich, ist die Liste vollstaendig.

DABEI EINEN EIGENEN FEHLER GEMACHT UND ER IST LEHRREICH: die neue Abfrage bekam
EINEN Backslash im ESCAPE statt zwei, und SQLite antwortete mit "ESCAPE
expression must be a single character". Meine Gegenprobe mit grep suchte nach
derselben falschen Fassung und meldete deshalb "passt". Erst `cat -v` neben der
funktionierenden Zeile hat es gezeigt -- eine Pruefung, die das Falsche misst,
ist schlimmer als keine.

Gemessen nach dem Ausrollen: anzahl 3685, gezeigt 3685, items 3685.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 23:11:28 +02:00
D4rkst3randClaude Opus 5 ab7605a6d2 Der Waechter kennt jetzt die Verwaltungszugaenge von Spieleservern
Der Betreiber hat es angemahnt, waehrend nebenan am Spiele-Panel gearbeitet
wurde: "vergiss nicht die ports an den waechter weiter zu geben."

Nachgesehen und gemessen -- die offenen Ports des Panels standen bereits in
der Basis (25566, 26014), keine Abweichung. Dabei ist etwas anderes
aufgefallen.

AUF 10011 LAUSCHT ts3server.exe AUF ALLEN ADRESSEN, aus C:\Server\TS3, seit dem
09.07.2026. Und eine handangelegte Regel laesst herein:

    Regelname:   TS3_10011 (TCP)
    Richtung:    Eingehend
    Profile:     Domaene, Privat, Oeffentlich
    Remote-IP:   Beliebig
    Aktion:      Zulassen

Das ist kein Spielport. Ueber ServerQuery verwaltet man einen TeamSpeak-Server
komplett -- Rechte, Konten, Kennwoerter. Im Panel nebenan ist derselbe Port
deshalb ausdruecklich an 127.0.0.1 gebunden und bekommt KEINE Firewallregel.

DER WAECHTER SCHWIEG DAZU, weil 10011 beim Uebernehmen des Standes schon
dastand -- also genau der Fall, fuer den die HEIKEL-Liste gedacht ist: "Port
3000 war auch schon immer so."

Dazu drei weitere aus derselben Familie, bevor sie hier auftauchen: Minecraft
RCON (25575), Rust RCON (28016) und die Palworld-REST-API (8212, kann kicken
und bannen). Im Panel stehen alle drei auf `veroeffentlichen: 'lokal'`; wenn
einer von ihnen je auf allen Adressen lauscht, ist etwas an einem Server von
Hand eingerichtet worden.

Gemessen nach der Aenderung (-Still): der Waechter meldet 10011 jetzt neben
RPC, SMB, MySQL, RDP und WinRM. Was er weiterhin NICHT sieht, ist UDP -- und
die meisten Spielports sind UDP. Das steht als naechstes an.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 23:03:12 +02:00
3 changed files with 52 additions and 4 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
# Arbeitsweise in diesem Projekt
c# Arbeitsweise in diesem Projekt
## Prüfen statt raten
+34 -3
View File
@@ -35,6 +35,13 @@ export function neuerSchluessel(): string {
return Array.from(roh, (b) => ZEICHEN[b % ZEICHEN.length]).join('')
}
/** Wieviele Dateien liegen unter diesem Ordner -- die WAHRE Zahl.
*
* Dieselbe Bedingung wie die Liste darunter, nur ohne Grenze. Zwei Abfragen
* statt einer, weil `zeilen.length` nach einem `LIMIT` eben nicht die Anzahl
* ist, sondern die Anzahl der geholten Zeilen. */
const GEZAEHLT = `SELECT COUNT(*) AS n FROM media WHERE path LIKE ? ESCAPE '\\'`
/** Die Liste eines freigegebenen Ordners.
*
* OHNE ANMELDUNG, und deshalb wird hier genau abgemessen, was hinausgeht:
@@ -56,12 +63,32 @@ freigabeRoutes.get('/:schluessel', (c) => {
)
const maskiert = eintrag.ordner.replace(/[\\%_]/g, (z) => `\\${z}`)
// WIEVIELE ES WIRKLICH SIND -- getrennt gezaehlt, nicht aus der Liste
// abgeleitet.
//
// GEMESSEN am 22.08.2026: der Ordner "items" enthaelt 3685 Dateien, die
// Freigabeseite meldete 2000. Der Grund stand eine Zeile weiter unten --
// `LIMIT 2000` -- und `anzahl: zeilen.length` machte aus der Kappung eine
// Aussage: die Seite behauptete eine Vollstaendigkeit, die sie nicht hatte.
//
// Genau der Fall aus CLAUDE.md: eine Auskunft, die nicht alles sehen kann,
// meldet nicht die halbe Zahl als ganze, sondern sagt, dass sie kappt.
const gesamt = (
db
.prepare(GEZAEHLT)
.get(`${maskiert}/%`) as { n: number }
).n
// Die Grenze bleibt -- eine Freigabe auf einen Ordner mit 200000 Dateien
// soll den Dienst nicht in die Knie zwingen. Sie ist nur nicht mehr
// stillschweigend: was darueber liegt, wird unten benannt.
const GRENZE = 20000
const zeilen = db
.prepare(
`SELECT path, size, mime, dauer FROM media
WHERE path LIKE ? ESCAPE '\\' ORDER BY path COLLATE NOCASE LIMIT 2000`,
WHERE path LIKE ? ESCAPE '\\' ORDER BY path COLLATE NOCASE LIMIT ?`,
)
.all(`${maskiert}/%`) as Pick<Media, 'path' | 'size' | 'mime' | 'dauer'>[]
.all(`${maskiert}/%`, GRENZE) as Pick<Media, 'path' | 'size' | 'mime' | 'dauer'>[]
return c.json({
// Auch hier der Name aus derselben Einstellung -- die Freigabeseite ist
@@ -72,7 +99,11 @@ freigabeRoutes.get('/:schluessel', (c) => {
// Der Praefix, den die Oberflaeche abschneidet -- damit dort
// "adder.webp" steht und nicht "vehicles/adder.webp". Wer den ganzen
// Pfad sehen will, sieht ihn in der Adresse.
anzahl: zeilen.length,
// Die WIRKLICHE Zahl, nicht die der ausgelieferten Zeilen.
anzahl: gesamt,
// Und wieviele davon hier stehen. Sind beide gleich, ist die Liste
// vollstaendig; sonst weiss die Oberflaeche, dass sie es sagen muss.
gezeigt: zeilen.length,
items: zeilen.map((r) => ({
name: r.path.slice(eintrag.ordner.length + 1),
size: r.size,
+17
View File
@@ -57,6 +57,23 @@ $HEIKEL = @{
6379 = 'Redis'
27017 = 'MongoDB'
47001 = 'WinRM-Listener'
# VERWALTUNGSZUGAENGE VON SPIELESERVERN. Sie sehen harmloser aus als sie
# sind, weil ein Spieleserver ja erreichbar sein SOLL -- aber über diese
# Ports verwaltet man ihn komplett, nicht spielt man auf ihm.
#
# Am 14.08.2026 gemessen: auf dieser Maschine lauschte 10011 auf allen
# Adressen (ts3server.exe aus C:\Server\TS3, läuft seit dem 09.07.2026),
# und eine handangelegte Regel "TS3_10011 (TCP)" ließ beliebige
# Gegenstellen in allen Profilen herein. Der Wächter schwieg, weil der Port
# beim Übernehmen des Standes schon dastand -- genau der Fall, für den es
# diese Liste gibt ("Port 3000 war auch schon immer so").
#
# Im Panel (d4rk_gameserver) ist derselbe Port deshalb ausdrücklich an
# 127.0.0.1 gebunden und bekommt KEINE Firewallregel.
10011 = 'TeamSpeak ServerQuery (Vollzugriff auf den Server)'
25575 = 'Minecraft RCON (Fernsteuerung der Konsole)'
28016 = 'Rust RCON (Fernsteuerung der Konsole)'
8212 = 'Palworld REST-API (Verwaltung, inkl. Kick und Bann)'
}
# Was nachgerechnet wird. Änderungen daran sind entweder deine -- dann