Initial import from bf-network-r6.opencode — opencode migration

This commit is contained in:
2026-08-26 12:44:21 +02:00
commit 5ee0716dda
297 changed files with 72324 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
# Transaktionen — Teständerungen mit Ablaufdatum
Hier liegen die Akten offener und geschlossener **Config-Transaktionen**. Werkzeug:
[`nautobot/gc-transaktion.py`](../../nautobot/gc-transaktion.py).
## Wozu
Eine Änderung, die am Gerät steht, aber nicht in der SoT, ist **Drift** — und Drift sieht bisher immer
gleich aus, egal ob er ein Versehen ist oder ein laufender Versuch. Wer testen wollte, hatte die Wahl
zwischen „Compliance kaputt" und „gar nicht testen".
Eine Transaktion macht die Absicht sichtbar, ohne die Governance aufzuweichen: **der Change geht
weiterhin ausschließlich über Golden Config** (`gc-manual-plan.py`), und die Compliance meldet den
Drift weiterhin. Neu ist nur, dass `status` ihn **zuordnen** kann.
| SQL | hier |
|---|---|
| `BEGIN` | Snapshot des Scope-Abschnitts + Akte mit Gerät, Scope, Grund und **Ablaufdatum** |
| *uncommitted* | Change ist am Gerät wirksam und im Testumfeld sichtbar, aber nicht in der SoT |
| `COMMIT` | Template/Config-Context nachziehen → Compliance grün → Akte schließen |
| `ROLLBACK` | Rückbau-**Vorschlag** aus dem Snapshot, prüfen, deployen, Akte schließen |
## Drei Regeln, die das Werkzeug erzwingt
1. **`--expires` ist Pflicht.** Eine offene Transaktion ohne Frist ist undokumentierter Drift mit
besserem Gewissen. `status` markiert überfällige Akten.
2. **Der Scope ist eine ComplianceRule**, kein Freibrief. Driftet etwas *außerhalb* des Scopes, meldet
`status` das ausdrücklich als **nicht abgedeckt**.
3. **Eine offene Transaktion je Gerät** — sonst ist beim Rollback nicht mehr entscheidbar, wohin zurück.
## Zwei bewusste Grenzen
- **Der Rollback pusht nicht selbst.** Er schreibt einen Vorschlag aus dem Snapshot; `add`-Zeilen aus
einem `/export` legen neu an, statt zu ändern, und brauchen meist ein `set [find …]`. Ein Rückbau,
den niemand gelesen hat, ist genau die Sorte Automatik, die hier schon zweimal teuer war.
- **Der Snapshot enthält nur den Scope-Abschnitt.** Ein voller `/export` enthält Firewall, Adressen,
Benutzerliste und Skriptquellen — nichts davon wird für den Rückbau gebraucht, und diese Akten liegen
im Git. Für den Ernstfall gibt es das binäre `/system backup` auf dem Gerät (`--device-backup`).
## Dateien je Transaktion
| Datei | Inhalt |
|---|---|
| `<change-id>.json` | die Akte: Gerät, Scope, Grund, Fristen, Status |
| `<change-id>.snapshot.rsc` | der Scope-Abschnitt **vor** der Änderung |
| `<change-id>.commands.rsc` | was deployt wurde |
| `<change-id>.rollback.rsc` | erst nach `rollback` — der Vorschlag zum Prüfen |

View File

@@ -0,0 +1 @@
/ip firewall mangle disable [find where comment="TEST-cake-global-htb"]

View File

@@ -0,0 +1,2 @@
/ip firewall mangle add action=mark-packet chain=postrouting comment="TEST-cake-global-htb" new-packet-mark=wanup out-interface=vlan100 passthrough=no
/queue tree add comment="TEST-cake-global-htb" name=qostestglobal packet-mark=wanup parent=global queue=cake-wan-up

View File

@@ -0,0 +1,16 @@
{
"change_id": "TEST-cake-global-htb",
"device": "crs326-core",
"scope": "queue",
"match_config": [
"/queue type",
"/queue tree"
],
"reason": "TP6: prueft Global-HTB + Mangle-Mark statt Interface-HTB (letztere ist laut MikroTik-Doku bei hw-offloaded out-interface unwirksam). Enthaelt eine temporaere mangle-Regel ausserhalb des queue-Scopes, wird im Rueckbau mitentfernt.",
"started": "2026-08-23",
"expires": "2026-08-24",
"state": "rolledback",
"snapshot": "docs/transaktionen/TEST-cake-global-htb.snapshot.rsc",
"device_backup": "",
"closed": "2026-08-23"
}

View File

@@ -0,0 +1,11 @@
# Rueckbau-VORSCHLAG fuer TEST-cake-global-htb (crs326-core, Scope queue)
# Aus dem Snapshot vom 2026-08-23. NICHT ungeprueft deployen:
# `add`-Zeilen legen neu an, statt zu aendern — was hier gebraucht wird,
# ist in der Regel ein `set [find ...]`. Zeilen entsprechend anpassen.
/queue type
add cake-bandwidth=8.5Mbps cake-diffserv=diffserv4 cake-nat=yes kind=cake \
name=cake-wan-up
/queue tree
add comment="TP6: CAKE auf der Senderichtung (WAN-Egress)" name=qos-wan-up \
parent=vlan100 queue=cake-wan-up

View File

@@ -0,0 +1,3 @@
/queue tree remove [find where name="qostestglobal"]
/ip firewall mangle remove [find where comment="TEST-cake-global-htb"]
/queue type set [find where name="cake-wan-up"] cake-bandwidth=8.5Mbps

View File

@@ -0,0 +1,9 @@
# Snapshot des Scopes 'queue' auf crs326-core, 2026-08-23 (Transaktion TEST-cake-global-htb)
# Bewusst NUR dieser Abschnitt — der Vollexport gehoert nicht ins Repo.
/queue type
add cake-bandwidth=8.5Mbps cake-diffserv=diffserv4 cake-nat=yes kind=cake \
name=cake-wan-up
/queue tree
add comment="TP6: CAKE auf der Senderichtung (WAN-Egress)" name=qos-wan-up \
parent=vlan100 queue=cake-wan-up

View File

@@ -0,0 +1,2 @@
/ip firewall mangle enable [find where comment="TEST-cake-global-htb"]
/queue type set [find where name="cake-wan-up"] cake-bandwidth=7000000

View File

@@ -0,0 +1 @@
/queue type set [find where name="cake-wan-up"] cake-bandwidth=5000000

View File

@@ -0,0 +1,16 @@
{
"change_id": "TEST-cake-parameter-probe",
"device": "crs326-core",
"scope": "queue",
"match_config": [
"/queue type",
"/queue tree"
],
"reason": "TP6: CAKE-Parameternamen und Defaults am Geraet auslesen statt raten (Type ohne Queue-Tree = wirkungslos)",
"started": "2026-08-23",
"expires": "2026-08-24",
"state": "rolledback",
"snapshot": "docs/transaktionen/TEST-cake-parameter-probe.snapshot.rsc",
"device_backup": "",
"closed": "2026-08-23"
}

View File

@@ -0,0 +1,6 @@
# Rueckbau-VORSCHLAG fuer TEST-cake-parameter-probe (crs326-core, Scope queue)
# Aus dem Snapshot vom 2026-08-23. NICHT ungeprueft deployen:
# `add`-Zeilen legen neu an, statt zu aendern — was hier gebraucht wird,
# ist in der Regel ein `set [find ...]`. Zeilen entsprechend anpassen.

View File

@@ -0,0 +1,4 @@
# Snapshot des Scopes 'queue' auf crs326-core, 2026-08-23 (Transaktion TEST-cake-parameter-probe)
# Bewusst NUR dieser Abschnitt — der Vollexport gehoert nicht ins Repo.

View File

@@ -0,0 +1,4 @@
# Nachtrag zum ether3-Trunk: VLAN 40 hatte ether3 als UNTAGGED-Mitglied.
# Ein Port kann in derselben VLAN nicht zugleich tagged und untagged sein — deshalb ist
# genau diese eine Zeile im ersten Deploy gescheitert, waehrend die sechs anderen liefen.
/interface bridge vlan set [find where vlan-ids=40 and !dynamic] tagged=ether1,ether3,ether8,ether13,ether15 untagged=ether2,ether4,ether5

View File

@@ -0,0 +1,7 @@
/interface bridge vlan set [find where vlan-ids=10 and !dynamic] tagged=ether1,ether3,ether8,ether13,ether15
/interface bridge vlan set [find where vlan-ids=20 and !dynamic] tagged=ether3,ether8,ether13,ether15
/interface bridge vlan set [find where vlan-ids=30 and !dynamic] tagged=ether1,ether3,ether8,ether15
/interface bridge vlan set [find where vlan-ids=40 and !dynamic] tagged=ether1,ether3,ether8,ether13,ether15
/interface bridge vlan set [find where vlan-ids=50 and !dynamic] tagged=ether1,ether3,ether8,ether15
/interface bridge vlan set [find where vlan-ids=90 and !dynamic] tagged=ether1,ether3,ether8,ether15
/interface bridge vlan set [find where vlan-ids=99 and !dynamic] tagged=ether3,ether8,ether15,bridge

View File

@@ -0,0 +1,15 @@
{
"change_id": "TEST-ether3-trunk-ap1-sideboard",
"device": "crs326-core",
"scope": "bridge-vlan",
"match_config": [
"/interface bridge vlan"
],
"reason": "ap1 testweise am Sideboard, Uplink auf core ether3 statt ether15 (TP25 Standorttest)",
"started": "2026-08-21",
"expires": "2026-09-04",
"state": "rolledback",
"snapshot": "docs/transaktionen/TEST-ether3-trunk-ap1-sideboard.snapshot.rsc",
"device_backup": "vor-ether3-trunk-20260821.backup",
"closed": "2026-08-22"
}

View File

@@ -0,0 +1,15 @@
# TATSAECHLICH DEPLOYT am 2026-08-22 (Plan 55ff3f32-3bc6-4c16-9ddb-613e335474df, Status Completed,
# am Geraet gegengeprueft). Beleg fuer den Rueckbau von TEST-ether3-trunk-ap1-sideboard.
# Abgeleitet aus dem Snapshot vom 2026-08-21, aber angepasst:
# - `add` -> `set [find ... and !dynamic]` (der Generator-Vorschlag haette neu angelegt)
# - Backslash-Fortsetzungen aufgeloest (Netmiko bricht daran)
# - VLAN 1 und 100 ausgelassen: ether3 kommt dort nicht vor
# Hinweis: `gc-transaktion.py rollback` ueberschreibt die .rollback.rsc bei jedem Aufruf neu —
# deshalb liegt der Beleg hier unter eigenem Namen.
/interface bridge vlan set [find where vlan-ids=10 and !dynamic] tagged=ether1,ether8,ether13,ether15
/interface bridge vlan set [find where vlan-ids=20 and !dynamic] tagged=ether8,ether13,ether15
/interface bridge vlan set [find where vlan-ids=30 and !dynamic] tagged=ether1,ether8,ether15
/interface bridge vlan set [find where vlan-ids=40 and !dynamic] tagged=ether1,ether8,ether13,ether15 untagged=ether2,ether3,ether4,ether5
/interface bridge vlan set [find where vlan-ids=50 and !dynamic] tagged=ether1,ether8,ether15
/interface bridge vlan set [find where vlan-ids=90 and !dynamic] tagged=ether1,ether8,ether15
/interface bridge vlan set [find where vlan-ids=99 and !dynamic] tagged=ether8,ether15,bridge

View File

@@ -0,0 +1,16 @@
# Rueckbau-VORSCHLAG fuer TEST-ether3-trunk-ap1-sideboard (crs326-core, Scope bridge-vlan)
# Aus dem Snapshot vom 2026-08-21. NICHT ungeprueft deployen:
# `add`-Zeilen legen neu an, statt zu aendern — was hier gebraucht wird,
# ist in der Regel ein `set [find ...]`. Zeilen entsprechend anpassen.
/interface bridge vlan
add bridge=bridge untagged=ether1,ether2 vlan-ids=1
add bridge=bridge tagged=ether1,ether8,ether13,ether15 vlan-ids=10
add bridge=bridge tagged=ether8,ether13,ether15 vlan-ids=20
add bridge=bridge tagged=ether1,ether8,ether15 untagged=ether14 vlan-ids=30
add bridge=bridge tagged=ether1,ether8,ether13,ether15 untagged=\
ether2,ether3,ether4,ether5 vlan-ids=40
add bridge=bridge tagged=ether1,ether8,ether15 vlan-ids=50
add bridge=bridge tagged=ether1,ether8,ether15 vlan-ids=90
add bridge=bridge tagged=ether8,ether15,bridge vlan-ids=99
add bridge=bridge tagged=ether1 untagged=ether16 vlan-ids=100

View File

@@ -0,0 +1,14 @@
# Snapshot des Scopes 'bridge-vlan' auf crs326-core, 2026-08-21 (Transaktion TEST-ether3-trunk-ap1-sideboard)
# Bewusst NUR dieser Abschnitt — der Vollexport gehoert nicht ins Repo.
/interface bridge vlan
add bridge=bridge untagged=ether1,ether2 vlan-ids=1
add bridge=bridge tagged=ether1,ether8,ether13,ether15 vlan-ids=10
add bridge=bridge tagged=ether8,ether13,ether15 vlan-ids=20
add bridge=bridge tagged=ether1,ether8,ether15 untagged=ether14 vlan-ids=30
add bridge=bridge tagged=ether1,ether8,ether13,ether15 untagged=\
ether2,ether3,ether4,ether5 vlan-ids=40
add bridge=bridge tagged=ether1,ether8,ether15 vlan-ids=50
add bridge=bridge tagged=ether1,ether8,ether15 vlan-ids=90
add bridge=bridge tagged=ether8,ether15,bridge vlan-ids=99
add bridge=bridge tagged=ether1 untagged=ether16 vlan-ids=100

View File

@@ -0,0 +1,6 @@
# dirtyvader-infra (VLAN20) temporaer als Slave-VAP auf ap2 ausstrahlen.
# Zweck: iPhone fuer EIN Matter-Commissioning auf denselben L2-Link wie der OTBR bringen (TP12.1).
# ap2 statt ap1, weil ap1 am 2026-08-22 auf ether11 (VLAN10-Access) haengt und kein CAP ist.
# Kommen ap1s Radios zurueck, dieselben zwei Zeilen fuer "ap1 5GHz"/"ap1 2.4GHz" ergaenzen.
/interface wifi provisioning set [find where comment="ap2 5GHz"] slave-configurations=cfg-media,cfg-untrusted,cfg-guest,cfg-infra
/interface wifi provisioning set [find where comment="ap2 2.4GHz"] slave-configurations=cfg-iot,cfg-media,cfg-untrusted,cfg-guest,cfg-infra

View File

@@ -0,0 +1,15 @@
{
"change_id": "TEST-infra-ssid-matter-pairing",
"device": "crs326-core",
"scope": "wifi-provisioning",
"match_config": [
"/interface wifi provisioning"
],
"reason": "dirtyvader-infra temporaer auf ap2: iPhone fuer Matter-Commissioning auf VLAN20 (TP12.1)",
"started": "2026-08-22",
"expires": "2026-08-29",
"state": "rolledback",
"snapshot": "docs/transaktionen/TEST-infra-ssid-matter-pairing.snapshot.rsc",
"device_backup": "",
"closed": "2026-08-22"
}

View File

@@ -0,0 +1,6 @@
# TATSAECHLICH DEPLOYT am 2026-08-22 (Plan 1469f0f7-fc52-47e1-bd65-a83ac709d89c, Completed).
# Danach ZWINGEND: /interface wifi capsman remote-cap provision [find where identity="ap2"]
# Ohne die Re-Provisionierung bleiben die VAPs am CAP bestehen und senden weiter.
# Rueckbau: dirtyvader-infra wieder von ap2 nehmen. Stand vor dem Change (live gelesen 2026-08-22).
/interface wifi provisioning set [find where comment="ap2 5GHz"] slave-configurations=cfg-media,cfg-untrusted,cfg-guest
/interface wifi provisioning set [find where comment="ap2 2.4GHz"] slave-configurations=cfg-iot,cfg-media,cfg-untrusted,cfg-guest

View File

@@ -0,0 +1,18 @@
# Rueckbau-VORSCHLAG fuer TEST-infra-ssid-matter-pairing (crs326-core, Scope wifi-provisioning)
# Aus dem Snapshot vom 2026-08-22. NICHT ungeprueft deployen:
# `add`-Zeilen legen neu an, statt zu aendern — was hier gebraucht wird,
# ist in der Regel ein `set [find ...]`. Zeilen entsprechend anpassen.
/interface wifi provisioning
add action=create-dynamic-enabled comment="ap1 5GHz" master-configuration=\
cfg-main-5g-ap1 radio-mac=D0:EA:11:4D:40:E5 slave-configurations=\
cfg-media,cfg-untrusted,cfg-guest
add action=create-dynamic-enabled comment="ap1 2.4GHz" master-configuration=\
cfg-main-2g-ap1 radio-mac=D0:EA:11:4D:40:E6 slave-configurations=\
cfg-iot,cfg-media,cfg-untrusted,cfg-guest
add action=create-dynamic-enabled comment="ap2 5GHz" master-configuration=\
cfg-main-5g-ap2 radio-mac=D0:EA:11:4D:40:3E slave-configurations=\
cfg-media,cfg-untrusted,cfg-guest
add action=create-dynamic-enabled comment="ap2 2.4GHz" master-configuration=\
cfg-main-2g-ap2 radio-mac=D0:EA:11:4D:40:3F slave-configurations=\
cfg-iot,cfg-media,cfg-untrusted,cfg-guest

View File

@@ -0,0 +1,16 @@
# Snapshot des Scopes 'wifi-provisioning' auf crs326-core, 2026-08-22 (Transaktion TEST-infra-ssid-matter-pairing)
# Bewusst NUR dieser Abschnitt — der Vollexport gehoert nicht ins Repo.
/interface wifi provisioning
add action=create-dynamic-enabled comment="ap1 5GHz" master-configuration=\
cfg-main-5g-ap1 radio-mac=D0:EA:11:4D:40:E5 slave-configurations=\
cfg-media,cfg-untrusted,cfg-guest
add action=create-dynamic-enabled comment="ap1 2.4GHz" master-configuration=\
cfg-main-2g-ap1 radio-mac=D0:EA:11:4D:40:E6 slave-configurations=\
cfg-iot,cfg-media,cfg-untrusted,cfg-guest
add action=create-dynamic-enabled comment="ap2 5GHz" master-configuration=\
cfg-main-5g-ap2 radio-mac=D0:EA:11:4D:40:3E slave-configurations=\
cfg-media,cfg-untrusted,cfg-guest
add action=create-dynamic-enabled comment="ap2 2.4GHz" master-configuration=\
cfg-main-2g-ap2 radio-mac=D0:EA:11:4D:40:3F slave-configurations=\
cfg-iot,cfg-media,cfg-untrusted,cfg-guest

View File

@@ -0,0 +1,2 @@
/queue simple remove [find where name="probelan"]
/queue tree remove [find where name="probeglobal"]

View File

@@ -0,0 +1,16 @@
{
"change_id": "TEST-queue-global-zaehlprobe",
"device": "crs326-core",
"scope": "queue",
"match_config": [
"/queue type",
"/queue tree"
],
"reason": "TP6: prueft, ob parent=global auf dem CRS326 ueberhaupt zaehlt (queue=default, KEIN Limit, drosselt nichts)",
"started": "2026-08-23",
"expires": "2026-08-24",
"state": "rolledback",
"snapshot": "docs/transaktionen/TEST-queue-global-zaehlprobe.snapshot.rsc",
"device_backup": "",
"closed": "2026-08-23"
}

View File

@@ -0,0 +1,11 @@
# Rueckbau-VORSCHLAG fuer TEST-queue-global-zaehlprobe (crs326-core, Scope queue)
# Aus dem Snapshot vom 2026-08-23. NICHT ungeprueft deployen:
# `add`-Zeilen legen neu an, statt zu aendern — was hier gebraucht wird,
# ist in der Regel ein `set [find ...]`. Zeilen entsprechend anpassen.
/queue type
add cake-bandwidth=8.5Mbps cake-diffserv=diffserv4 cake-nat=yes kind=cake \
name=cake-wan-up
/queue tree
add comment="TP6: CAKE auf der Senderichtung (WAN-Egress)" name=qos-wan-up \
parent=vlan100 queue=cake-wan-up

View File

@@ -0,0 +1,9 @@
# Snapshot des Scopes 'queue' auf crs326-core, 2026-08-23 (Transaktion TEST-queue-global-zaehlprobe)
# Bewusst NUR dieser Abschnitt — der Vollexport gehoert nicht ins Repo.
/queue type
add cake-bandwidth=8.5Mbps cake-diffserv=diffserv4 cake-nat=yes kind=cake \
name=cake-wan-up
/queue tree
add comment="TP6: CAKE auf der Senderichtung (WAN-Egress)" name=qos-wan-up \
parent=vlan100 queue=cake-wan-up

View File

@@ -0,0 +1,15 @@
{
"change_id": "TP17.1-dtu-pin-ap2",
"device": "crs326-core",
"scope": "wifi-access-list",
"match_config": [
"/interface wifi access-list"
],
"reason": "DTU/Wechselrichter (54:F2:9F:12:51:F0) per access-list an ap2 binden. Grund: ein ESP hat EIN Radio, AP und STA teilen den Kanal -- der nicht abschaltbare DTU-AP sitzt auf ch1 (ap1) und stoert dort mit -59 dBm. Ueber ap2 wandert er auf ch11. Ist der Kanalplan nach dem Einbau der zwei neuen APs entschieden, wird das neu bewertet: entweder committen oder zurueckrollen.",
"started": "2026-08-23",
"expires": "2026-09-06",
"state": "rolledback",
"snapshot": "docs/transaktionen/TP17.1-dtu-pin-ap2.snapshot.rsc",
"device_backup": "",
"closed": "2026-08-23"
}

View File

@@ -0,0 +1,6 @@
# Rueckbau-VORSCHLAG fuer TP17.1-dtu-pin-ap2 (crs326-core, Scope wifi-access-list)
# Aus dem Snapshot vom 2026-08-23. NICHT ungeprueft deployen:
# `add`-Zeilen legen neu an, statt zu aendern — was hier gebraucht wird,
# ist in der Regel ein `set [find ...]`. Zeilen entsprechend anpassen.

View File

@@ -0,0 +1,4 @@
# Snapshot des Scopes 'wifi-access-list' auf crs326-core, 2026-08-23 (Transaktion TP17.1-dtu-pin-ap2)
# Bewusst NUR dieser Abschnitt — der Vollexport gehoert nicht ins Repo.