TP45: pool-v20 auf .200-.249 verengt -- Schema-Baender .100-.199 freigegeben
Die 7 DHCP-Pools starteten alle bei .100 und ueberlappten damit die beiden Oktett-Baender, die dieses TP gerade belegt: .100-.149 (Server-Hosts) und .150-.199 (App-Services). In VLAN20 ist das eine echte Kollisionsflaeche -- nautobot .154-.158, gitea .157, pve-mcp .173 und shelly-mcp .180 tragen ihre IP GERAETELOKAL und stehen in keinem Lease-Eintrag, der Core kann sie also nicht schuetzen und einem DHCP-Client .154 anbieten. Entscheid 2026-09-21: nur pool-v20 und pool-v30 werden verengt, v20 zuerst. VLAN10/40/50/90/99 bleiben bei .100-.200 -- dort gibt es kein Schema-Band, das etwas gewoenne, und VLAN40/VLAN10 haetten sonst 11 Sonos (.191-.201), den iPhone (.196) und den Mac (.82) mitgezogen. VLAN20 kostet die Verengung nichts: eine statische Reservierung (nas-bf .20.10, in .10x) und 0 dynamische Leases. pool-v30 bleibt bewusst unangetastet -- dort liegen 35 statische Reservierungen IM Fenster .200-.249 (26 Shellys .202-.226/.233, SwitchBot .227, Twinkly .228, Withings .230/.231, lichterketten .236/.237, Nuki .241/.244, CCU .232). Erst Schicht B zieht die um, dann pool-v30. Nebenbei faellt damit die .30.250-Kollision: der Sonoff Dongle-M sitzt dort statisch, der Pool reicht heute bis .250. Neuer Job `tp45-pool-v20` (gc-configplan.py) mit gezaehltem Selektor: ein `find where`, das 0 trifft, sieht wie "nicht vorhanden" aus statt wie "kaputt" -- ein blankes `set [find where name=...]` liefe ins Leere und der Job meldete Erfolg. 🔴 Lehre aus dem ersten Fehlversuch: jedes config_set-Statement muss auf EINER Zeile klammer-vollstaendig sein. Mit `:if (...) do={` am Zeilenende geht RouterOS in den Fortsetzungs-Modus und zeigt einen anderen Prompt, der netmiko-Treiber verliert sein Muster und der Deploy stirbt mit `E1015: Pattern not detected: ...@crs326\-core\].*$|#.*$)` -- Plan auf Failed, ohne etwas geschrieben zu haben. Abnahme: Gerate-Read pool-v20 = 10.40.20.200-10.40.20.249 (total=50, used=0); DHCPOFFER-Probe auf vmbr0.20 -> 10.40.20.200 mit Domain Name Server 10.40.20.30, 10.40.20.31; Probe-Lease wieder entfernt; Compliance 140/140 ohne Drift. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -546,6 +546,56 @@ def job_tp45_agh_dhcp():
|
||||
return [(["crs326-core"], core_set, "TP45-agh-dhcp")]
|
||||
|
||||
|
||||
def _pool_set(vlan, ranges):
|
||||
"""Zeilen, die `pool-v<vlan>` auf `ranges` ziehen -- mit gezaehltem Selektor.
|
||||
|
||||
MODIFY, kein add: der Pool existiert, die `add`-Zeile der intended config
|
||||
wuerfe `already have such name`. Gleiche Form wie `job_tp45_agh_dhcp`.
|
||||
|
||||
🔴 Der Selektor wird GEZAEHLT, nicht geglaubt (Lehre vom 2026-09-21): ein
|
||||
`find where`, das 0 trifft, sieht wie „nicht vorhanden" aus und nicht wie
|
||||
„kaputt" -- ein blankes `set [find where name=…]` liefe ins Leere und der
|
||||
Job meldete trotzdem Erfolg (dieselbe Klasse wie `dst-address=<bare IP>`
|
||||
in TP23-agh-firewall.commands.rsc:7, das seit dem 08-25 immer 0 meldete).
|
||||
|
||||
🔴🔴 **JEDES Statement muss auf EINER Zeile klammer-vollstaendig sein.**
|
||||
Erste Fassung hatte `:if (...) do={` am Zeilenende -- RouterOS geht dann in
|
||||
den Fortsetzungs-Modus und zeigt einen ANDEREN Prompt, der netmiko-Treiber
|
||||
verliert sein Muster und der Deploy stirbt mit
|
||||
`E1015: Pattern not detected: (redacted)@crs326\\-core\\].*$|#.*$)`.
|
||||
Der Plan stand danach auf `Failed`, **ohne** etwas geschrieben zu haben.
|
||||
Deshalb ist jede Zeile hier ein vollstaendiges `… do={ …; … } else={ … }`.
|
||||
"""
|
||||
pool = f"pool-v{vlan}"
|
||||
return "\n".join([
|
||||
f':if ([:len [/ip pool find where name="{pool}"]] = 1) do={{ '
|
||||
f'/ip pool set [find where name="{pool}"] ranges={ranges}; '
|
||||
f':log info ("tp45-pool: {pool} -> " . [/ip pool get [find where name="{pool}"] ranges]) }} '
|
||||
f'else={{ :log info ("tp45-pool: ABBRUCH, {pool} nicht eindeutig") }}',
|
||||
])
|
||||
|
||||
|
||||
def job_tp45_pool_v20():
|
||||
"""TP45 (2026-09-21): pool-v20 von .100-.200 auf .200-.249 verengen.
|
||||
|
||||
Damit werden die Schema-Baender .100-.149 (Server-Hosts) und .150-.199
|
||||
(App-Services) in VLAN20 echt frei. VLAN20 traegt KEINE DHCP-Reservierung
|
||||
im alten Fenster (live geprueft: nur `nas-bf .20.10` in .10x) und 0
|
||||
dynamische Leases -- die Verengung kostet hier nichts.
|
||||
|
||||
🔴 Warum ueberhaupt: `nautobot .154-.158`, `gitea .157`, `pve-mcp .173` und
|
||||
`shelly-mcp .180` tragen ihre IP GERAETELOKAL und stehen in KEINEM
|
||||
Lease-Eintrag -- der Core kann sie nicht schuetzen und einem DHCP-Client
|
||||
.154 anbieten. Die Verengung ist hier sofort wirksam.
|
||||
|
||||
⚠️ VLAN30 gehoert NICHT hierher: dort liegen 35 statische Reservierungen IM
|
||||
Fenster .200-.249 (26 Shellys .202-.226/.233, SwitchBot .227, Twinkly .228,
|
||||
Withings .230/.231, lichterketten .236/.237, Nuki .241/.244, CCU .232).
|
||||
Erst Schicht B zieht die um, DANN pool-v30.
|
||||
"""
|
||||
return [(["crs326-core"], _pool_set(20, "10.40.20.200-10.40.20.249"), "TP45-pool-v20")]
|
||||
|
||||
|
||||
JOBS = {
|
||||
"drift-cleanup": job_drift_cleanup,
|
||||
"mgmt-acl": job_mgmt_acl,
|
||||
@@ -553,6 +603,7 @@ JOBS = {
|
||||
"tp38-oob": job_tp38_oob,
|
||||
"tp45-agh-fw": job_tp45_agh_fw,
|
||||
"tp45-agh-dhcp": job_tp45_agh_dhcp,
|
||||
"tp45-pool-v20": job_tp45_pool_v20,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
{#- VLAN-Tabelle: Site-Konstante. name = RouterOS-comment, lease/pool je VLAN. -#}
|
||||
{%- set vlans = [
|
||||
{"id": 10, "name": "MAIN", "pool": "10.40.10.100-10.40.10.200", "lease": "1d"},
|
||||
{"id": 20, "name": "INFRA", "pool": "10.40.20.100-10.40.20.200", "lease": "1d"},
|
||||
{"id": 20, "name": "INFRA", "pool": "10.40.20.200-10.40.20.249", "lease": "1d"},
|
||||
{"id": 30, "name": "IOT", "pool": "10.40.30.100-10.40.30.250", "lease": "1d"},
|
||||
{"id": 40, "name": "MEDIA", "pool": "10.40.40.100-10.40.40.200", "lease": "1d"},
|
||||
{"id": 50, "name": "UNTRUSTED", "pool": "10.40.50.100-10.40.50.200", "lease": "1d"},
|
||||
|
||||
Reference in New Issue
Block a user