Eine Runde per Ein-Befehl -- und das gruene Licht log
docs/tp25-runde.sh startet Konsole und Messung zusammen, friert die AP-Karte ein, sagt die vom Interface GELESENE Adresse fuers Telefon an und loest beim Beenden den Pin. Grund: beide 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. Der Probelauf hat dabei sofort einen Fehler in der eigenen Anzeige aufgedeckt: die Seite meldete "✅ beide angemeldet, auf verschiedenen APs", waehrend beide Telefone auf ap2 hingen. Das Kriterium prueft "beide angemeldet" -- nicht, ob sie auf VERSCHIEDENEN APs sitzen. Das ist ein gruenes Licht fuer einen Messpunkt, den es nicht gibt: Piep, weitergehen, kein Gegen-AP gemessen. Wieder dieselbe Klasse wie der 14-h-Ausfall -- Anzeige geprueft statt Wirkung. Jetzt vier Zustaende, gegen sechs Faelle geprueft (inkl. "gleicher AP, anderes Band" -> zaehlt NICHT): bereit verschiedene APs -> Piep, weitergehen wird nachgezogen gleicher AP, Automatik -> warten kein Gegen-AP gleicher AP, ohne Auto -> Warnung statt gruen S22 sucht S22 nicht angemeldet -> stehenbleiben teilprojekte.md: Passwort-Rotation als offener Follow-up eingetragen (User: "machen wir, aber erst spaeter") -- inkl. der noch offenen sshpass -p in tp6-monitor-core.sh und tp25-pin-s22.sh, die vorher nachgezogen gehoeren. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -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-<name>/` 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`.
|
||||
|
||||
67
docs/tp25-runde.sh
Executable file
67
docs/tp25-runde.sh
Executable file
@@ -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
|
||||
@@ -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 <b>%s</b> hier nicht — <b>das ist das Messergebnis</b>, "
|
||||
"Raum markieren und weitergehen.<br>%s" % (_auto["aufgegeben"], doppel))
|
||||
elif bereit:
|
||||
pinstatus = "✅ beide angemeldet, auf verschiedenen APs<br>%s" % doppel
|
||||
pinstatus = "✅ beide angemeldet, <b>verschiedene APs</b> — Messpunkt zählt<br>%s" % doppel
|
||||
elif gleich and _auto["an"]:
|
||||
pinstatus = ("⏳ beide auf <b>%s</b> — Gegen-AP wird gerade nachgezogen, "
|
||||
"noch nicht weitergehen<br>%s" % (ip_ap, doppel))
|
||||
elif gleich:
|
||||
pinstatus = ("⚠️ beide auf <b>%s</b> — <b>kein Gegen-AP-Messpunkt.</b> "
|
||||
"Automatik einschalten oder S22 von Hand pinnen.<br>%s" % (ip_ap, doppel))
|
||||
elif wartet:
|
||||
pinstatus = "⏳ S22 sucht <b>%s</b> …<br>%s" % (ziel or "?", doppel)
|
||||
elif ziel in ("ap1", "ap2"):
|
||||
|
||||
Reference in New Issue
Block a user