Das Skript endete bisher mit `vlan-filtering=yes` und einer Log-Zeile -- ohne jede Pruefung, ob der CAP wirklich CAP geworden ist. Neu, Punkt (6) VOR dem Scharfschalten: das Skript zaehlt seine eigenen wifi-Objekte und schreibt das Ergebnis per `:log info`. Bewusst nicht `:put` und bewusst nicht danach -- nach `vlan-filtering=yes` kann die Sitzung abreissen, eine Konsolenausgabe waere dann verloren. Das Log ueberlebt und ist ueber `/log print where message~"tp28-ap3"` nachlesbar. Sollwerte am Geraet gemessen, nicht angenommen (ap3 live, 2026-08-30): security=0 configuration=0 channel=0 datapath=1 radios-mit-manager=2 🔴 Erwartet ist ausdruecklich NICHT "alles 0": datapath MUSS 1 sein (dp-caps-slaves). Ein CAP mit 0 Datapaths ist der 14-Stunden-Ausfall vom 2026-08-18 -- Clients assoziieren und bekommen nie DHCP. security/configuration/channel=0 ist der harte Beleg, dass die Werks-Inline- Overrides weg sind: CAPsMAN haelt die Credentials, das Geraet haelt nichts. Gegenprobe am Bestand: ap2 zeigt dieselben 0/0. Dazu ein Abnahmeblock am Dateiende mit dem Schritt, der sich nicht im Skript pruefen laesst: `/interface wifi radio print` AM MANAGER muss zwei Zeilen mit CAP ap3@... zeigen (live: cap-wifi5 + cap-wifi6). Ohne diesen Schritt ist die Abnahme wertlos, denn `remote-cap print` meldet state=Ok schon beim blossen Verbinden -- ap1 steht seit 2026-08-30 genau so da: verbunden, gelistet, und trotzdem funkstill, weil keine Provisioning-Regel matcht. Am Geraet gegengeprueft: RouterOS kennt KEINEN ternaeren Operator, `a ? b : c` ist ein syntax error. Verdikt laeuft deshalb ueber :if/:set. Der komplette Block wurde am ap3 mit :put durchlaufen und meldet "=> OK". Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
124 lines
8.1 KiB
Plaintext
124 lines
8.1 KiB
Plaintext
# =====================================================================================
|
|
# ap3 (cAP ax) — PHASE 2: aus dem Standalone-Werksgeraet einen reinen CAP machen.
|
|
# TP28-Nachtrag, 2026-08-30.
|
|
#
|
|
# LAEUFT UEBER vlan99 (10.40.99.13), NICHT ueber das Werks-WLAN -- denn hier stirbt das
|
|
# Werks-WLAN. Erst ausfuehren, wenn `ping 10.40.99.13` vom Core sauber durchgeht.
|
|
# =====================================================================================
|
|
|
|
# --- (1) Werks-WLAN und Standalone-Reste abraeumen.
|
|
# 🔴 REIHENFOLGE IST PFLICHT: `configuration` referenziert security/datapath/channel.
|
|
# Wer die Referenzierten zuerst loescht, bekommt einen Fehler und laesst einen
|
|
# Teil-Zustand zurueck.
|
|
# 🔴 `[find !dynamic]` waere hier ein SYNTAXFEHLER -- diese Objekte haben gar keine
|
|
# `dynamic`-Eigenschaft, die gibt es nur auf /interface wifi selbst. Ein frueherer
|
|
# Versuch lief deshalb komplett in die on-error-Zweige, aenderte NICHTS und meldete
|
|
# trotzdem Erfolg (Lehre aus tp28-ap-wifi-reste-abraeumen.rsc, 2026-08-18).
|
|
/interface wifi capsman set enabled=no
|
|
/interface wifi remove [find where !(name=wifi1 || name=wifi2)]
|
|
/interface wifi configuration remove [find]
|
|
/interface wifi steering remove [find]
|
|
/interface wifi security remove [find]
|
|
/interface wifi datapath remove [find]
|
|
/interface wifi channel remove [find]
|
|
# Werks-Inline-Overrides auf den Master-Radios loeschen, sonst gewinnen sie gegen den Manager.
|
|
/interface wifi set [find name=wifi1] !configuration.ssid !security.authentication-types !security.passphrase !security.ft-over-ds
|
|
/interface wifi set [find name=wifi2] !configuration.ssid !security.authentication-types !security.passphrase !security.ft-over-ds
|
|
|
|
# --- (2) L3-Reste des Werks-Routers weg (jetzt gefahrlos: die WLAN-Sitzung ist ohnehin tot) ---
|
|
/ip dhcp-server remove [find]
|
|
/ip dhcp-server network remove [find]
|
|
/ip pool remove [find]
|
|
/ip firewall nat remove [find]
|
|
/ipv6 dhcp-client remove [find]
|
|
/ip address remove [find where interface=bridge]
|
|
|
|
# --- (3) Bridge-Ports. cAP ax hat nur ZWEI Ethernet-Ports; ether2 traegt PoE-out und
|
|
# haengt nichts -> aus, wie ap1/ap2 es mit ihrem PoE-Port halten. ether2 wird
|
|
# KEIN Bridge-Port (Zielzustand identisch zu ap2) -> ap.extra_ports = [].
|
|
/interface ethernet set [find name=ether2] poe-out=off
|
|
/interface bridge port remove [find where interface=ether2]
|
|
:if ([:len [/interface bridge port find where interface=wifi1]]=0) do={ /interface bridge port add bridge=bridge comment=defconf interface=wifi1 }
|
|
:if ([:len [/interface bridge port find where interface=wifi2]]=0) do={ /interface bridge port add bridge=bridge comment=defconf interface=wifi2 }
|
|
|
|
# --- (4) Bridge-VLAN-Tabelle, Muster = ap2 live (2026-08-30 gelesen).
|
|
# IOT (30) nur auf wifi2: die Zone hat bands=["2g"] (ConfigContext ap-common).
|
|
# MGMT (99) liegt auf der Bridge, NICHT auf den Radios -- sonst waere Management
|
|
# over-the-air.
|
|
/interface bridge vlan remove [find where !dynamic]
|
|
/interface bridge vlan add bridge=bridge untagged=bridge,ether1 vlan-ids=1
|
|
/interface bridge vlan add bridge=bridge tagged=ether1,wifi1,wifi2 vlan-ids=10
|
|
/interface bridge vlan add bridge=bridge tagged=ether1,wifi1,wifi2 vlan-ids=20
|
|
/interface bridge vlan add bridge=bridge tagged=ether1,wifi2 vlan-ids=30
|
|
/interface bridge vlan add bridge=bridge tagged=ether1,wifi1,wifi2 vlan-ids=40
|
|
/interface bridge vlan add bridge=bridge tagged=ether1,wifi1,wifi2 vlan-ids=50
|
|
/interface bridge vlan add bridge=bridge tagged=ether1,wifi1,wifi2 vlan-ids=90
|
|
/interface bridge vlan add bridge=bridge tagged=ether1,bridge vlan-ids=99
|
|
|
|
# --- (5) CAP-Modus.
|
|
# 🔴🔴 `slaves-datapath` IST NICHT OPTIONAL. Der Manager schickt `datapath.bridge=bridge`
|
|
# zwar mit, der CAP uebernimmt davon aber NUR die vlan-id -- die Bridge-Mitgliedschaft
|
|
# bleibt lokal. Fehlt das Objekt, assoziieren Clients auf iot/media/untrusted/guest
|
|
# sauber und bekommen NIE DHCP, waehrend dirtyvader-main (Master-Radios = statische
|
|
# Bridge-Ports) weiterlaeuft. Genau so lagen IOT+MEDIA am 2026-08-18 rund 14 Stunden.
|
|
# Das Objekt traegt bewusst KEINE vlan-id: die liefert der Manager pro VAP.
|
|
/interface wifi datapath add name=dp-caps-slaves bridge=bridge comment="TP28-fix: bridge fuer CAPsMAN-Slave-VAPs"
|
|
/interface wifi cap set enabled=yes discovery-interfaces=vlan99 slaves-datapath=dp-caps-slaves
|
|
# 🔴 `cap enabled=yes` REICHT NICHT. Jedes Master-Radio muss zusaetzlich selbst auf
|
|
# `configuration.manager=capsman` stehen, sonst BIETET der CAP seine Radios dem
|
|
# Manager gar nicht an. Symptom (2026-08-30 live aufgeschlagen): `remote-cap print`
|
|
# zeigt `state=Ok`, aber `/interface wifi radio print` am Manager listet fuer dieses
|
|
# Geraet NICHTS -- und weil die Provisioning-Regel dann nicht matcht, sucht man den
|
|
# Fehler in der radio-mac statt an dieser Stelle. ap1/ap2 tragen es seit dem
|
|
# TP28-Cutover, im Werkszustand ist es leer (= local).
|
|
/interface wifi set [find name=wifi1] configuration.manager=capsman
|
|
/interface wifi set [find name=wifi2] configuration.manager=capsman
|
|
|
|
# --- (6) Selbstabnahme INS LOG, nicht auf die Konsole. ---
|
|
# Sie steht bewusst VOR dem vlan-filtering: danach kann die Sitzung abreissen, und
|
|
# eine `:put`-Ausgabe waere dann verloren. `:log info` ueberlebt und ist spaeter
|
|
# ueber `/log print where message~"tp28-ap3"` nachlesbar.
|
|
# 🔴 Erwartet ist NICHT "alles 0": `datapath` MUSS 1 sein (dp-caps-slaves, s. Punkt 5).
|
|
# Ein CAP, der 0 Datapaths hat, ist der 14-Stunden-Ausfall vom 2026-08-18.
|
|
:local sec [:len [/interface wifi security find]]
|
|
:local cfg [:len [/interface wifi configuration find]]
|
|
:local dpt [:len [/interface wifi datapath find]]
|
|
:local chn [:len [/interface wifi channel find]]
|
|
:local mgr [:len [/interface wifi find where name~"^wifi[12]\$" and configuration.manager=capsman]]
|
|
# ⚠️ RouterOS kennt KEINEN ternaeren Operator (`a ? b : c` = syntax error, am
|
|
# 2026-08-30 am Geraet gegengeprueft). Verdikt deshalb ueber :if/:set.
|
|
:local verdikt "OK"
|
|
:if ($sec!=0 || $cfg!=0 || $chn!=0) do={ :set verdikt "ABWEICHUNG-lokale-wifi-objekte" }
|
|
:if ($dpt!=1) do={ :set verdikt "ABWEICHUNG-slaves-datapath" }
|
|
:if ($mgr!=2) do={ :set verdikt "ABWEICHUNG-manager-nicht-auf-radios" }
|
|
:log info ("tp28-ap3 abnahme: security=$sec/0 configuration=$cfg/0 channel=$chn/0 datapath=$dpt/1 radios-mit-manager=$mgr/2 => $verdikt")
|
|
|
|
# --- (7) ZULETZT scharf schalten. Vorher waere der Rest der Datei nicht angekommen. ---
|
|
/interface bridge set [find name=bridge] vlan-filtering=yes
|
|
|
|
:log info "tp28-ap3 phase2: CAP aktiv, Manager-Suche auf vlan99, vlan-filtering=yes"
|
|
|
|
# =====================================================================================
|
|
# ABNAHME NACH DEM IMPORT -- zwei Orte, und der zweite ist der eigentliche Beweis.
|
|
#
|
|
# (a) AM ap3 selbst, das Ergebnis von Punkt (6):
|
|
# /log print where message~"tp28-ap3 abnahme"
|
|
# Sollwerte: security=0 configuration=0 channel=0 datapath=1 radios-mit-manager=2
|
|
# security/configuration/channel = 0 belegt, dass die Werks-Inline-Overrides weg sind
|
|
# und der CAP nichts Eigenes haelt -- CAPsMAN haelt die Credentials, nicht das Geraet.
|
|
# Gegenprobe am Bestand (2026-08-30 gelesen): ap2 zeigt security=0, configuration=0.
|
|
#
|
|
# (b) 🔴 AM MANAGER crs326-core -- OHNE DIESEN SCHRITT IST DIE ABNAHME WERTLOS:
|
|
# /interface wifi radio print
|
|
# Erwartet sind ZWEI Zeilen mit CAP `ap3@...`, z.B. cap-wifi5 + cap-wifi6.
|
|
# Grund: `remote-cap print` meldet `state=Ok`, SOBALD der CAP verbunden ist -- auch
|
|
# dann, wenn er seine Radios gar nicht anbietet. Genau diese Verwechslung hat am
|
|
# 2026-08-30 in die radio-mac statt in `configuration.manager` schauen lassen.
|
|
# Und `state=Ok` ohne Provisioning-Regel bedeutet weiterhin Funkstille: so steht ap1
|
|
# seit dem 2026-08-30 da -- verbunden, gelistet, und trotzdem sendet er nicht.
|
|
#
|
|
# (c) Erst danach die WLAN-Abnahme, die wirklich zaehlt: eine frische DHCP-Lease
|
|
# PRO SSID -- nicht die Registration-Table. Waehrend des Ausfalls am 2026-08-18
|
|
# zeigte die 25 zufriedene IOT-Clients, die keine Adresse hatten.
|
|
# =====================================================================================
|