diff --git a/docs/teilprojekte.md b/docs/teilprojekte.md index ca58a2f..df90d84 100644 --- a/docs/teilprojekte.md +++ b/docs/teilprojekte.md @@ -1394,6 +1394,10 @@ FT kaschierte das bisher als „Roaming" statt „schwache Abdeckung". > des Rundgangs Stille. Die Konsole schlägt deshalb mit Ton, Vibration und Vollbanner Alarm, > sobald das gepinnte Gerät nirgends hängt, und schreibt nach 45 s vergeblicher Suche > `UNERREICHBAR=apX` — denn „der Gegen-AP trägt hier nicht" **ist das Messergebnis**. +> ▶️ **Start ohne Werkzeugkette: `bash docs/tp25-runde.sh [name]`.** Legt den Lauf unter +> `docs/messdaten/tp25-runde-/` an, friert die AP-Karte ein, startet Konsole (Port 3031) +> und Messung, sagt die **vom Interface gelesene** Adresse fürs Telefon an und löst beim +> Beenden (Ctrl-C) den Pin wieder. Auswertung danach mit `tp25-gehweg-auswertung.py --dir …`. > ⏸️ **Stand bei Sitzungsende 2026-08-22: Rundgang noch nicht gegangen.** Pin gelöst, > Automatik aus, `crs326-core` unverändert (die `access-list` steht unter keiner > ComplianceRule, es gibt also nichts zu committen). Erster Messwert nebenbei: am Arbeitsplatz @@ -1958,6 +1962,16 @@ den Weg, über den man den Fehler zurücknehmen wollte. Re-Walk + Dead-Spot-Kartierung laufen als Schritt 5 von TP25 — und zwar erst **nach** den Funkparameter-Fixes, weil vorher gemessene Werte wertlos sind. - **TP10 —** DDNS-Auto-Updater für `bf4.emsenhuber.net` (auf dem Core möglich, `device-mode` erlaubt scheduler). +- 🔑 **Admin-Passwort der vier MikroTik rotieren (offen seit 2026-08-22, User: „machen wir, + aber erst später").** Anlass: das Core-Passwort ist bei einer Debug-Ausgabe im Klartext in + ein Sitzungstranskript geraten. Ursache war `sshpass -p`, das es in die **Kommandozeile** + schreibt — sichtbar in `ps` und in jedem argv-Trace. `docs/tp6-marker/server.py` ist auf + `sshpass -e` umgestellt (Passwort nur in der Umgebung des Kindprozesses); **`docs/tp6-monitor-core.sh` + und `docs/tp25-pin-s22.sh` haben dieselbe Schwäche noch** und gehören vor der Rotation + nachgezogen — sonst ist die Rotation nach dem nächsten Messlauf wieder wertlos. + Weg: `manage_user set-password` (⚠️ `/user set*` ist per Deny-Policy blockiert), danach + `~/.secrets/credentials.env` (`ROUTER_*_PASS`/`CRS326_*_PASS`) und `~/.claude.json` nachziehen. + Es ist **ein** Passwort für alle vier Geräte — die „Überlebensversicherung" aus CLAUDE.md. - **TP14.4 —** CF-Access-Service-Token rotieren. - **Doku-Aufräumen** (`docs/doku-cleanup-session.md`) — Punkte A–D am 2026-08-16 abgearbeitet, E teilweise. 📌 **Läuft in einer eigenen Session** — Übergabe: `docs/handoff-doku-session-20260818.md`. diff --git a/docs/tp25-runde.sh b/docs/tp25-runde.sh new file mode 100755 index 0000000..ddb8ecb --- /dev/null +++ b/docs/tp25-runde.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +# +# TP25 — eine komplette Runde. Ein Befehl, ohne Claude. +# +# bash docs/tp25-runde.sh # Verzeichnis wird nach Datum/Uhrzeit benannt +# bash docs/tp25-runde.sh ap2-hoehe # eigener Name +# +# Startet die Klick-Konsole (Port 3031) und die Messung, sagt die Adresse fuer das Telefon +# an und raeumt beim Beenden auf. Zum Beenden: Ctrl-C in diesem Fenster. +# +# 🔴 Der Grund fuer dieses Skript: die beiden Einzelteile hatten als Standard-Laufverzeichnis +# einen Pfad in ein Sitzungs-Scratchpad. Wer sie ohne die passende Umgebungsvariable +# startete, mass in ein totes Verzeichnis -- und merkte es erst bei der Auswertung. +# Hier wird das Verzeichnis EINMAL bestimmt und an beide durchgereicht. + +set -uo pipefail +HERE="$(cd "$(dirname "$0")/.." && pwd)" +cd "$HERE" + +NAME="${1:-$(date +%Y%m%d-%H%M)}" +export TP6_RUN_DIR="$HERE/docs/messdaten/tp25-runde-$NAME" +export TP25_PHONE_IP="${TP25_PHONE_IP:-10.40.10.178}" # S22 -- wird gepingt +export TP25_PHONE_MAC="${TP25_PHONE_MAC:-2A:0D:B0:5D:AD:A7}" +export TP25_IPHONE_MAC="${TP25_IPHONE_MAC:-F2:62:4C:E1:AF:09}" + +mkdir -p "$TP6_RUN_DIR" + +# Konsole: nur starten, wenn der Port frei ist -- eine zweite Instanz wuerde sofort sterben +# und die Marker der ersten waeren weg. +KONSOLE="" +if lsof -nP -iTCP:3031 -sTCP:LISTEN >/dev/null 2>&1; then + echo "Konsole laeuft bereits auf 3031 -- wird weiterverwendet." +else + python3 docs/tp6-marker/server.py > "$TP6_RUN_DIR/konsole.log" 2>&1 & + KONSOLE=$! + sleep 2 +fi + +echo +echo "════════════════════════════════════════════════════════════" +echo " Konsole am Telefon oeffnen:" +# 🔴 Adresse vom Interface lesen, nicht hartkodieren (Fehler vom 2026-08-22: die angesagte +# IP gehoerte einem Geraet, das seit 22 h nicht mehr im Netz war). +ifconfig | awk '/^[a-z0-9]+:/{i=substr($1,1,length($1)-1)} + /inet /{if ($2 !~ /^127\.|^169\.254\./) printf " http://%s:3031/ (%s)\n", $2, i}' +echo +echo " 1) Auf dem Telefon einmal irgendwo tippen -> schaltet den Signalton frei" +echo " 2) '🔁 Gegen-AP automatisch' einschalten -> S22 folgt dem iPhone spiegelverkehrt" +echo " 3) Losgehen. Doppelton = beide angemeldet -> Raum antippen, weiter" +echo +echo " Lauf: $TP6_RUN_DIR" +echo "════════════════════════════════════════════════════════════" +echo + +aufraeumen() { + echo + echo "Runde beendet. Aufraeumen …" + bash docs/tp25-pin-s22.sh off >/dev/null 2>&1 && echo " AP-Pin geloest." + [[ -n "$KONSOLE" ]] && kill "$KONSOLE" 2>/dev/null && echo " Konsole beendet." + pkill -f 'sshpass -e ssh.*10.40.99.1' 2>/dev/null + echo + echo "Auswertung:" + echo " python3 docs/tp25-gehweg-auswertung.py --dir $TP6_RUN_DIR" +} +trap aufraeumen EXIT + +bash docs/tp25-walk-messung.sh diff --git a/docs/tp6-marker/server.py b/docs/tp6-marker/server.py index bd3a303..dd4049d 100644 --- a/docs/tp6-marker/server.py +++ b/docs/tp6-marker/server.py @@ -417,7 +417,14 @@ def render(st): # Drei Zustaende, nicht zwei. "S22 kommt nicht rein" ist ein ERGEBNIS (der Gegen-AP # traegt hier nicht), kein Defekt -- es darf deshalb nicht wie ein Fehler aussehen und # nicht ewig Alarm schlagen. - bereit = bool(frisch and ip_ap and s22_ap) + # 🔴 "beide angemeldet" ist NICHT das Kriterium -- der Messpunkt taugt nur, wenn die + # beiden Telefone auf VERSCHIEDENEN APs sitzen. Am 2026-08-22 meldete die Seite + # "✅ beide angemeldet, auf verschiedenen APs", waehrend beide auf ap2 hingen: ein + # gruenes Licht fuer eine Messung, die es gar nicht gab. Wieder derselbe Fehler -- + # die Anzeige geprueft statt der Wirkung. + getrennt = bool(ip_ap and s22_ap and ip_ap != s22_ap) + bereit = bool(frisch and getrennt) + gleich = bool(frisch and ip_ap and s22_ap and ip_ap == s22_ap) wartet = bool(frisch and ip_ap and not s22_ap and not _auto["aufgegeben"]) if wartet and _auto["seit_weg"] and time.time() - _auto["seit_weg"] > 45: _auto["aufgegeben"] = ziel or "?" @@ -438,7 +445,13 @@ def render(st): pinstatus = ("🚫 S22 bekommt %s hier nicht — das ist das Messergebnis, " "Raum markieren und weitergehen.
%s" % (_auto["aufgegeben"], doppel)) elif bereit: - pinstatus = "✅ beide angemeldet, auf verschiedenen APs
%s" % doppel + pinstatus = "✅ beide angemeldet, verschiedene APs — Messpunkt zählt
%s" % doppel + elif gleich and _auto["an"]: + pinstatus = ("⏳ beide auf %s — Gegen-AP wird gerade nachgezogen, " + "noch nicht weitergehen
%s" % (ip_ap, doppel)) + elif gleich: + pinstatus = ("⚠️ beide auf %s — kein Gegen-AP-Messpunkt. " + "Automatik einschalten oder S22 von Hand pinnen.
%s" % (ip_ap, doppel)) elif wartet: pinstatus = "⏳ S22 sucht %s …
%s" % (ziel or "?", doppel) elif ziel in ("ap1", "ap2"):