Initial commit: BF Core-Switch-Prep + VLAN-Architektur + Delegations-Übergabe
- ALL-SG8316M auf FW 2.2.1.2956 geflasht; VLAN-DB 10/20/30/40/100 via Telnet-CLI (non-disruptiv) - CLI-Tooling: run-cli.exp + .cli-Files + CLI-REFERENCE (FW 2.2.1, IOS-artig) - Kanonisches Inventar: bf.csv/md + build.py (Doku-Motor), Core-Port-Map - Finaler VLAN-/Adressplan (10.40.<vlanid>.0/24), Firmware-Runbooks, Recovery-Assets - Secrets/Firmware/State/DS_Store via .gitignore ausgeschlossen Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.DS_Store
|
||||||
|
.secrets
|
||||||
4
README.md
Normal file
4
README.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# bf-network-r6
|
||||||
|
|
||||||
|
BF-Netzwerk-Migration (Variante R6+C2). 2× MikroTik hAP ax² + Core ALL-SG8316M.
|
||||||
|
Plan-SSOT: ~/.claude/plans/welche-kosteng-nstigen-alternativen-zu-memoized-sparkle.md
|
||||||
104
docs/core-switch-prep.md
Normal file
104
docs/core-switch-prep.md
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
# Core-Switch ALL-SG8316M — Vorbereitung (heute) + Cutover (morgen)
|
||||||
|
|
||||||
|
> Status: **DRAFT** — Port-Map + Subnetze müssen vom User bestätigt werden (markierte `??`).
|
||||||
|
> Switch: ALLNET ALL-SG8316M, 16× Gigabit, Smart-Managed (Web + SNMP), lüfterlos.
|
||||||
|
|
||||||
|
## 0. Capability-Check (verifiziert)
|
||||||
|
|
||||||
|
Laut Hersteller-Handbuch erfüllt der ALL-SG8316M alle R6-Anforderungen:
|
||||||
|
|
||||||
|
| Anforderung | ALL-SG8316M | Quelle |
|
||||||
|
|---|---|---|
|
||||||
|
| IEEE 802.1Q VLAN tagged | ✅ | UM, VLAN-Kapitel |
|
||||||
|
| Port-Modus **Trunk** (1 untagged + n tagged) | ✅ | UM: "Trunk = untagged member of one VLAN at most, tagged member of zero or more" |
|
||||||
|
| Port-Modus **Access** (nur untagged) | ✅ | UM |
|
||||||
|
| Port-Modus **Hybrid** | ✅ | UM |
|
||||||
|
| PVID je Port (1–4094) | ✅ | UM |
|
||||||
|
| STP/RSTP, LACP, Port-Mirroring, 802.3x | ✅ | UM |
|
||||||
|
|
||||||
|
→ **Kein Switch-Tausch nötig.** Core bleibt als VLAN-Trunk-Verteiler.
|
||||||
|
|
||||||
|
## 1. VLAN-Schema (User-bestätigt 2026-06-05)
|
||||||
|
|
||||||
|
| VLAN | Zweck | Subnetz | Gateway (hAP #1) | DHCP-Pool |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **10** | **Server/Main (bestehend, unangetastet)** | **10.40.41.0/24** | .1 (neu, war FB) | #1: .50–.150 / #2: .151–.250 |
|
||||||
|
| 20 | Docker/Container (`default_internal`-Ziel) | 172.20.0.0/24 | .1 | später (Container-Migration) |
|
||||||
|
| 30 | IoT | 172.30.0.0/24 | .1 | später (Phase 2) |
|
||||||
|
| 40 | Guest (*mit Vorbehalt*) | 172.40.0.0/24 | .1 | später (Phase 2) |
|
||||||
|
| 100 | WAN (→ FB) | FB-Subnetz (z.B. 192.168.178.0/24) | — (DHCP-Client der hAP#1 zur FB) | von FB |
|
||||||
|
| 1 | **Lifeboat/Default** | nur Switch-Mgmt-Zugang während Transition | — | — |
|
||||||
|
|
||||||
|
**Schlüssel-Vereinfachung:** vlan10 = **das bestehende 10.40.41.0/24**. Geräte behalten ihre IPs;
|
||||||
|
Cutover = reiner **Gateway-Wechsel** FB→hAP#1, **kein Re-IP**. Switch-Mgmt-IP kann auf 10.40.41.x
|
||||||
|
bleiben → Lockout-Risiko stark reduziert (Mgmt-VLAN wechselt 1→10, IP-Subnetz bleibt gleich).
|
||||||
|
|
||||||
|
**Gateway-Konvention (User-Entscheid):** **.1 wird Standard** für alle Netze → hAP#1 = **10.40.41.1**.
|
||||||
|
Heute ist die **FB Gateway/DHCP auf 10.40.41.254** (suboptimal, aber heute unangetastet). Beim Cutover
|
||||||
|
verlässt die FB das LAN-Subnetz (→ WAN/vlan100), .254 wird frei. Switch-Mgmt = **10.40.41.2** (statisch).
|
||||||
|
|
||||||
|
Phase 1 (morgen) nutzt **nur vlan10 aktiv**; 20/30/40 werden definiert, aber ohne Clients.
|
||||||
|
|
||||||
|
### vlan20 / Docker — eigener Workstream (NICHT Switch-Prep heute)
|
||||||
|
Die Container (`default_internal` u.a. auf pve/fm) sollen perspektivisch auf 172.20.0.0/24 (vlan20).
|
||||||
|
Übergangs-**Brücke** nötig, damit Container vorerst unter alten IPs erreichbar bleiben; Migration
|
||||||
|
schrittweise. → Eigenes Doc/Phase, hier nur vermerkt. Switch muss vlan20 nur **definiert** haben.
|
||||||
|
|
||||||
|
## 2. Port-Map (16 Ports) — DRAFT, vom User zu bestätigen
|
||||||
|
|
||||||
|
| Port | Heute (flach VLAN1) | Ziel (nach Cutover) | Modus Ziel |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 1 | FB-Uplink (Gateway) `??` | WAN ↔ FB | **Access untagged vlan100** |
|
||||||
|
| 2 | — | Trunk ↔ hAP ax² #1 | **Trunk: tagged 10,20,30,40,100** `??` |
|
||||||
|
| 3 | — | Trunk ↔ hAP ax² #2 | **Trunk: tagged 10,20,30,40** |
|
||||||
|
| 4–15 | lokale Geräte `??` | lokale Geräte | **Access untagged vlan10** |
|
||||||
|
| 16 | **Mgmt-Lifeboat** (PC für Switch-Zugang) | Mgmt-Lifeboat | **Access vlan1** bis Mgmt sicher auf vlan10 |
|
||||||
|
|
||||||
|
> ⚠️ **FÜLLE DIESE TABELLE MIT DER ECHTEN BELEGUNG.** Welcher Port = FB? Welche Ports haben kritische Dauer-Geräte (NAS, Drucker, AV)? Das entscheidet, welche Ports beim Cutover umgehängt werden.
|
||||||
|
|
||||||
|
> **Trunk-native-VLAN-Frage:** Auf hAP#1-Trunk liegt zusätzlich das WAN. Sauberste Variante: WAN als **eigenes Tag (vlan100)** auch über den Trunk zu hAP#1 führen statt als native — dann ist auf dem Switch _kein_ Port untagged-WAN nötig und Port 1 (FB) wird Access-untagged-vlan100, der Trunk trägt vlan100 **tagged**. RouterOS macht tagged-WAN problemlos. → Bevorzugt: **Port1 Access-untagged-vlan100 (zur FB), Trunk zu #1 tagged 10,20,30,40,100.**
|
||||||
|
|
||||||
|
## 3. HEUTE — non-disruptive Vorbereitung (Reihenfolge!)
|
||||||
|
|
||||||
|
Alles hier ändert **nichts** am laufenden Flach-Netz (FB bleibt Gateway, alle Live-Ports bleiben VLAN1 untagged).
|
||||||
|
|
||||||
|
1. **Config-Backup ZUERST** — aktuelle Konfig exportieren/sichern (Web-UI → Maintenance/Backup). Datei nach `bf-network-r6/switch/all-sg8316m-backup-PRE.cfg`.
|
||||||
|
2. **Mgmt-IP dokumentieren** — aktuelle Switch-IP + Login notieren (heute auf FB-Subnetz, z.B. 192.168.178.x). **Nicht ändern** — sonst Zugang weg.
|
||||||
|
3. **Firmware-Update HEUTE** (User-Entscheid: voll inkl. FW). Aktuelle FW von ALLNET ziehen (Produktseite ALL-SG8316M → Downloads), Version notieren, in ruhigem Zeitfenster flashen. ⚠️ **Reboot = ~1–2 Min Gesamtausfall** fürs BF-Netz → ankündigen. Backup (Schritt 1) MUSS davor liegen. Nach Reboot Config-Integrität prüfen (VLAN-DB ggf. neu anlegen, falls FW Settings resettet).
|
||||||
|
4. **VLAN-DB anlegen**: VLANs 10, 20, 30, 100 erstellen — **ohne** Port-Membership-Änderungen an Live-Ports. Reines Anlegen im VLAN-Table ist forwarding-neutral, solange alle aktiven Ports untagged member von VLAN1 bleiben.
|
||||||
|
5. **Leere Trunk-Ports vorkonfigurieren**: Die _für die hAPs vorgesehenen, aktuell unbelegten_ Ports (z.B. 2 & 3) schon auf **Trunk** stellen (tagged 10,20,30,100). Kein Link dran → keine Disruption. Morgen nur noch hAP einstecken.
|
||||||
|
6. **Physisch vorbereiten**: 2× Cat6e-Trunk-Kabel zu den hAP-Standorten ziehen + Ports labeln (FB / Trunk#1 / Trunk#2 / Lifeboat).
|
||||||
|
7. **Lifeboat-Port festlegen** (z.B. Port 16, VLAN1) — bleibt während der ganzen Transition als Notzugang zum Switch-Mgmt.
|
||||||
|
|
||||||
|
**Heute NICHT anfassen:** PVID/Membership der Live-Geräte-Ports, FB-Port, Mgmt-IP/Mgmt-VLAN, Global-VLAN-Filtering-Enable falls es Live-Traffic bricht (Verhalten gerätespezifisch → im Backup-Zustand testen).
|
||||||
|
|
||||||
|
## 4. ⚠️ Mgmt-VLAN-Lockout — Gotcha (Cutover-kritisch)
|
||||||
|
|
||||||
|
Entschärft durch vlan10=10.40.41.0/24 (= bestehendes Subnetz): die Mgmt-**IP** muss **nicht** wechseln,
|
||||||
|
nur die Mgmt-**VLAN-Zuordnung** 1→10. Trotzdem Reihenfolge-kritisch.
|
||||||
|
**Regel:** Switch-Mgmt **am Cutover** auf **vlan10**, IP bleibt z.B. 10.40.41.2 (statisch, außerhalb DHCP-Pool .50–.250) `??` — und **erst nachdem** Zugang über vlan10 bestätigt ist, den Lifeboat-Port (VLAN1) ziehen. Reset-Button ist die einzige Fallback-Option (kein serieller Konsolen-Port) → langsam & sorgfältig.
|
||||||
|
|
||||||
|
## 5. MORGEN — Cutover-Klickliste (Phase 1, Ziel < 30 Min Ausfall)
|
||||||
|
|
||||||
|
Voraussetzung: hAP #1 & #2 geflasht + Basis-Config (siehe `routeros/`), Technitium läuft (pve+fm).
|
||||||
|
|
||||||
|
1. hAP #1 per Trunk an Switch-Port 2 (schon Trunk-konfiguriert) → Link prüfen.
|
||||||
|
2. hAP #2 per Trunk an Switch-Port 3 → Link prüfen.
|
||||||
|
3. **hAP#1 als Gateway**: vlan10-IP = **10.40.41.1**, DHCP-Server an (.50–.150), Option-6 = Technitium (pve+fm).
|
||||||
|
⚠️ **Gateway-Migration-Gotcha (.254→.1):** Bestehende Clients haben per alter FB-Lease noch **Gateway .254** —
|
||||||
|
die FB ist nach Schritt 4 aber weg → Clients tot bis Lease-Renew. **Mitigation:** hAP#1 temporär **2. Adresse
|
||||||
|
10.40.41.254/24** geben (Secondary-IP), damit Alt-Lease-Clients weiterrouten; nach Renew aller Leases auf .1 wieder entfernen.
|
||||||
|
(Alternativ: DHCP-Lease-Time vorher kurz stellen / Clients renewen/rebooten — passt ins 30-Min-Fenster.)
|
||||||
|
4. **FB umstellen**: FB-DHCP aus, "Exposed Host" → hAP#1-WAN-IP. FB-Port am Switch (Port 1) → **Access untagged vlan100**. FB verlässt damit 10.40.41.0/24 (.254 frei).
|
||||||
|
5. **Lokale Geräte-Ports** (4–15) → **Access untagged vlan10** (PVID 10). _Disruptiver Moment_ → zügig durchziehen.
|
||||||
|
6. **Switch-Mgmt** → vlan10, IP **10.40.41.2** statisch. Zugang vom neuen LAN testen, **dann** Lifeboat ziehen.
|
||||||
|
7. Verifikation: DHCP von hAP#1 (.50–.150), Gateway .1, DNS via Technitium, Internet, CAKE/Bufferbloat-Test, WLAN-Roaming #1↔#2.
|
||||||
|
|
||||||
|
## 6. Offene Punkte (vom User)
|
||||||
|
|
||||||
|
- [x] Subnetz-Schema: vlan10=10.40.41.0/24 (bestehend), 20=172.20/24 (Docker), 30=172.30/24 (IoT), 40=172.40/24 (Guest, Vorbehalt)
|
||||||
|
- [x] Firmware: heute updaten (User-Entscheid, Reboot akzeptiert)
|
||||||
|
- [ ] **Echte Port-Belegung** (Tabelle §2 füllen) — v.a. FB-Port + kritische Dauer-Geräte
|
||||||
|
- [ ] **Switch-Mgmt-Zugang**: aktuelle IP + Login (für Backup/FW/VLAN-Anlage heute)
|
||||||
|
- [ ] **Zugriffsweg**: Web-UI Klick-für-Klick mit meiner Anleitung (Default für Smart-Switch) — ok?
|
||||||
|
- [x] **Aktuelles BF-Gateway**: FB = 10.40.41.254 (heute). Künftig Standard **.1** → hAP#1=10.40.41.1. Gateway-Migration-Gotcha in §5 erfasst.
|
||||||
84
docs/firmware-flash-runbook.md
Normal file
84
docs/firmware-flash-runbook.md
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
# Firmware-Flash ALL-SG8316M (1.0 → 2.2.1) + Plan-B-Recovery
|
||||||
|
|
||||||
|
> ⚠️ Erst ausführen, wenn ALLE Pre-Flight-Punkte erfüllt sind. Flash = Werks-Reset der Config.
|
||||||
|
> Quelle Defaults: ALLNET QIG. Annahme: Flash setzt Switch auf Werk → **192.168.1.1 / admin / admin**.
|
||||||
|
|
||||||
|
## Werks-Defaults (Recovery-Anker)
|
||||||
|
| | |
|
||||||
|
|---|---|
|
||||||
|
| Default-IP nach Flash | **192.168.1.1** /24 |
|
||||||
|
| Default-Login | **admin / admin** |
|
||||||
|
| FW-Image | `switch/firmware/2.2.1/all-sg8316m-version_2.2.1_vmlinux.bix` (5,1 MB) |
|
||||||
|
| Aktuell (PRE) | IP 10.40.41.239, FW 1.0, nur VLAN1, Ports Hybrid/PVID1 |
|
||||||
|
|
||||||
|
## Warum „du bist dann auch offline"
|
||||||
|
Claude erreicht den Switch über **10.40.41.239**. Nach dem Flash lebt er auf **192.168.1.1** in einem
|
||||||
|
anderen Subnetz → für Claude nicht mehr erreichbar, **bis** jemand physisch eine Verbindung ins
|
||||||
|
192.168.1.x-Netz herstellt. **Recovery ist daher bewusst menschen-ausführbar** (GUI), Skript optional danach.
|
||||||
|
|
||||||
|
## Pre-Flight-Checkliste (HARTE Voraussetzungen)
|
||||||
|
- [ ] **Physisch am Switch** (Reset-Knopf erreichbar, Konsole-Zugang am Standort).
|
||||||
|
- [ ] **Direkt angestöpselter Laptop** an einem Switch-Port (nicht über WLAN/Remote).
|
||||||
|
- [ ] Laptop kann **Zweit-IP `192.168.1.2/24`** setzen (macOS: `sudo ifconfig en0 alias 192.168.1.2 255.255.255.0`).
|
||||||
|
- [ ] **Stabile Stromversorgung** des Switches (idealerweise USV) — Stromausfall **während** des Flashs = Brick-Risiko #1.
|
||||||
|
- [ ] FW-Image lokal vorhanden ✅ + Hash notiert (s.u.).
|
||||||
|
- [ ] PRE-Scrape vorhanden ✅ (`switch/state-PRE/`) → Soll-Config bekannt.
|
||||||
|
- [ ] Recovery-Skript bereit: `sg8316m.sh` kann Mgmt-IP zurücksetzen + VLANs/Ports anlegen (set_ip/add_vlans/…).
|
||||||
|
- [ ] **Zeitfenster** angekündigt: BF-LAN droppt ~1–2 Min beim Reboot; Re-Config danach wenige Min.
|
||||||
|
- [ ] Mentaler Worst-Case akzeptiert: €~96-Switch, im äußersten Notfall Ersatz.
|
||||||
|
|
||||||
|
## Flash-Durchführung (GUI empfohlen — sichtbarer Fortschritt)
|
||||||
|
1. Browser auf `http://10.40.41.239` → **Maintenance → Upgrade Manager** (cmd=4363).
|
||||||
|
2. Upgrade Method = **HTTP**, Upgrade Type = **Image**, Datei = `…2.2.1_vmlinux.bix` → **Upgrade**.
|
||||||
|
3. **NICHT** Strom/Netz trennen, bis der Switch von selbst neu startet. Geduld (mehrere Minuten).
|
||||||
|
- Scripted-Alternative (nur wenn bewusst gewählt):
|
||||||
|
`curl -F "type=0" -F "http_file=@switch/firmware/2.2.1/all-sg8316m-version_2.2.1_vmlinux.bix" -F "cmd=4364" http://10.40.41.239/cgi-bin/httpupload.cgi`
|
||||||
|
|
||||||
|
## Post-Flash — erwarteter Zustand
|
||||||
|
- Switch auf **192.168.1.1**, Login **admin/admin**, **leere Config** (nur VLAN1, Ports default).
|
||||||
|
- 10.40.41.239 weg (erwartet, kein Fehler).
|
||||||
|
|
||||||
|
## Recovery-Szenarien
|
||||||
|
|
||||||
|
### A) Normalfall: Flash OK, Switch auf 192.168.1.1 (= erwartet) — RECOVERY ÜBER MAC MINI
|
||||||
|
Voraussetzung: Mac mini trägt Zweit-IP **192.168.1.2/24** auf en0 (L2-benachbart, verifiziert).
|
||||||
|
Siehe `switch/recovery/README.md`. Claude führt **vom Mac mini aus** (per SSH-Tunnel) aus — **kein**
|
||||||
|
manuelles IP-Suchen, kein Laptop:
|
||||||
|
```
|
||||||
|
ssh 10.40.41.167 "curl -sS -X POST \
|
||||||
|
--data mode=0 --data ip=10.40.41.239 --data netmask=255.255.255.0 \
|
||||||
|
--data gateway=10.40.41.254 --data cmd=518 \
|
||||||
|
http://192.168.1.1/cgi-bin/dispatcher.cgi"
|
||||||
|
```
|
||||||
|
Danach Switch wieder auf .239 → Claude fährt VLANs/Ports/Mgmt-VLAN auf + `save`.
|
||||||
|
(Repo muss dafür NICHT auf dem Mac mini liegen — der curl-Einzeiler reicht via SSH.)
|
||||||
|
|
||||||
|
### B) Switch reagiert NICHT auf 192.168.1.1 (Loader/Recovery)
|
||||||
|
1. **30 Sek warten**, erneut pingen (Boot dauert).
|
||||||
|
2. **Factory-Reset-Knopf** ~10 Sek halten → erneut 192.168.1.1 prüfen.
|
||||||
|
3. Manche Realtek-Loader haben **TFTP-Recovery**: PC auf feste IP, TFTP-Server mit dem Image bereithalten,
|
||||||
|
Switch beim Boot ziehen lassen. (Für SG8316M nicht dokumentiert → nur als letzter Versuch; Setup s.u.)
|
||||||
|
4. Wenn weiterhin tot → Hardware-Defekt, Ersatz.
|
||||||
|
|
||||||
|
### C) Flash bricht mit Fehler ab, Switch noch auf 10.40.41.239 / FW 1.0
|
||||||
|
- Kein Reboot passiert → alte FW läuft weiter. Image-Datei/Hash prüfen, ggf. erneut versuchen oder abbrechen.
|
||||||
|
|
||||||
|
## TFTP-Recovery vorbereiten (optional, für Szenario B)
|
||||||
|
- macOS hat `launchctl`-tftpd, oder `dnsmasq --enable-tftp`. Image in TFTP-Root legen.
|
||||||
|
- **Nur** relevant, wenn der Loader es unterstützt — vorher recherchieren, nicht blind versuchen.
|
||||||
|
|
||||||
|
## Image-Integrität
|
||||||
|
- SHA256 (verifiziert 2026-06-05):
|
||||||
|
`e3f160983e8b17962dc70a52360b7f560c92da8197928d702f5266027a0fc7fc`
|
||||||
|
- Vor Flash erneut prüfen: `shasum -a 256 switch/firmware/2.2.1/all-sg8316m-version_2.2.1_vmlinux.bix`
|
||||||
|
|
||||||
|
## Recovery-Skript (Felder verifiziert)
|
||||||
|
- IP setzen (cmd=518): `POST mode=0 ip=<ip> netmask=<mask> gateway=<gw> cmd=518` → in `sg8316m.sh set-ip`.
|
||||||
|
- Schnell-Recovery nach Flash:
|
||||||
|
`SW_HOST=192.168.1.1 SW_USER=admin SW_PASS=admin ./sg8316m.sh set-ip 10.40.41.239`
|
||||||
|
danach `.secrets` zurück auf .239, dann `add-vlans 10,20,30,40,100` + Port-Config + `save`.
|
||||||
|
|
||||||
|
## Abbruch-Kriterien (lieber nicht flashen)
|
||||||
|
- Kein physischer Zugang ODER kein direkt-gekabelter Laptop → **verschieben**.
|
||||||
|
- Switch an instabilem Strom (kein USV, Gewitter, Bauarbeiten) → **verschieben**.
|
||||||
|
- Kein Zeitpuffer für ~15–30 Min Bastel-Risiko → **verschieben**.
|
||||||
35
docs/manual-flash-howto.md
Normal file
35
docs/manual-flash-howto.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Manuelles Firmware-Update ALL-SG8316M (1.0 → 2.2.1) via GUI
|
||||||
|
|
||||||
|
Ausgangslage: Switch sauber auf FW 1.0 @ 10.40.41.239 (scripted Versuch hat nur den Auto-Reboot
|
||||||
|
verpasst — Image-Write wird in der GUI vom Browser-JS korrekt zu Ende geführt inkl. Reboot).
|
||||||
|
|
||||||
|
## 1. Firmware holen
|
||||||
|
- Download (ZIP): https://www.allnet.de/ftp-downloads/allnet/switches/all-sg8316m/all-sg8316m-version_2.2.1.zip
|
||||||
|
- Entpacken → Datei **`all-sg8316m-version_2.2.1_vmlinux.bix`** (5,1 MB)
|
||||||
|
- SHA256 (optional prüfen): `e3f160983e8b17962dc70a52360b7f560c92da8197928d702f5266027a0fc7fc`
|
||||||
|
- (Liegt auch schon auf dem Mac mini: `~/bf-switch-flash/all-sg8316m-version_2.2.1_vmlinux.bix`)
|
||||||
|
|
||||||
|
## 2. Flashen
|
||||||
|
1. Browser → `http://10.40.41.239` (ggf. Login).
|
||||||
|
2. Menü **Maintenance → Upgrade Manager**.
|
||||||
|
3. **Upgrade Method = HTTP**, **Upgrade Type = Image**, Datei = die `.bix`.
|
||||||
|
4. **Upgrade** klicken.
|
||||||
|
5. Seite zeigt **„Writing image to FLASH… Do not power down…"** → **Strom NICHT trennen, warten**.
|
||||||
|
Der Browser pollt selbst und rebootet danach.
|
||||||
|
6. Falls die Seite „fertig" zeigt **ohne** Reboot → oben **REBOOT** klicken.
|
||||||
|
|
||||||
|
## 3. Nach dem Reboot (~1–2 min)
|
||||||
|
Switch kommt vermutlich auf **Werks-Default** hoch:
|
||||||
|
- IP **192.168.1.1**, Login **admin / admin**
|
||||||
|
1. Falls nicht erreichbar: Notebook-NIC temporär auf `192.168.1.50 /24` setzen (oder Mac mini, hat schon `192.168.1.2`).
|
||||||
|
2. Browser `http://192.168.1.1`, admin/admin.
|
||||||
|
3. **Network → IP Address**: Static, IP `10.40.41.239`, Maske `255.255.255.0`, Gateway `10.40.41.254` → Apply.
|
||||||
|
4. **SAVE → Save Configuration to FLASH → Apply** (damit es den nächsten Reboot übersteht!).
|
||||||
|
|
||||||
|
## 4. Fertig
|
||||||
|
- Prüfen: System Information zeigt **Firmware Version 2.2.1**.
|
||||||
|
- Mir „durch" sagen → ich verifiziere + übernehme (Mac-mini-Alias `192.168.1.2` ist noch aktiv).
|
||||||
|
|
||||||
|
## Hinweise
|
||||||
|
- Kommt der Switch auf `.239` statt `192.168.1.1` zurück (FW bewahrt IP) → Schritt 3 entfällt, nur prüfen + Save.
|
||||||
|
- Reagiert er gar nicht: 30 s warten, dann Reset-Knopf 10 s → wieder `192.168.1.1`.
|
||||||
44
docs/vlan-plan.md
Normal file
44
docs/vlan-plan.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# BF — VLAN- & Adressplan (final, 2026-06-06)
|
||||||
|
|
||||||
|
## VLAN-Modell
|
||||||
|
| VLAN | Name | Subnetz (Ziel) | Interim | Zweck |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 10 | **MAIN** | 10.40.10.0/24 | **vorerst 10.40.41.0/24** | Trusted-Clients + Media (Sonos/AppleTV/TV/SAT/Drucker) |
|
||||||
|
| 20 | **INFRA** | 10.40.20.0/24 | **vorerst vorhandene 172.x** | Server, VMs, Docker, NAS-Workloads, HA |
|
||||||
|
| 30 | **IOT** | 10.40.30.0/24 | — | Smart-Home (HA-managed) |
|
||||||
|
| 40 | **UNTRUSTED** | 10.40.40.0/24 | — | Spielekonsole & Low-Trust-Internet |
|
||||||
|
| 90 | **GUEST** | 10.40.90.0/24 | — | nur Internet (abgesetzt; 50–89 frei für künftige VLANs) |
|
||||||
|
| 99 | **MGMT** | 10.40.99.0/24 | Switch vorerst 10.40.41.239 | Switch/AP/Hypervisor-Mgmt-Interfaces |
|
||||||
|
| 100 | **WAN** | (FB-Transfer) | — | zur Fritzbox |
|
||||||
|
|
||||||
|
**Konventionen:** Gateway je VLAN = `.1` (hAP#1). Switch-Mgmt = `10.40.99.2`. 3. Oktet = VLAN-ID (Mnemonik). Alles RFC1918 (10/8).
|
||||||
|
|
||||||
|
## Firewall — Least-Privilege (nicht „Main→alle")
|
||||||
|
- Default **deny** inter-VLAN, dann gezielt erlauben.
|
||||||
|
- **Main → Infra:** nur Whitelist-Dienste (NAS-Shares, HA-UI, Proxmox-UI auf definierten Ports). Kein Vollzugriff.
|
||||||
|
- **Infra → Main:** grundsätzlich deny (Ausnahmen: Backups/Notifications gezielt).
|
||||||
|
- **IoT / Guest / Untrusted → intern:** deny — nur Internet.
|
||||||
|
- **Mgmt (99):** aus Main nicht erreichbar; nur dedizierter Admin-Zugang.
|
||||||
|
|
||||||
|
## Discovery / Usability (Sonos & Co.)
|
||||||
|
- mDNS/SSDP queren VLANs **nicht** von allein → discovery-abhängige Media-Geräte (Sonos, AppleTV, AirPrint, TV/SAT)
|
||||||
|
liegen bewusst **auf MAIN** mit den steuernden Handys → funktioniert ohne Reflector.
|
||||||
|
- Nicht-Discovery-Zugriff (NAS-UI, HA-Web) aus Main: per Firewall-Regel + DNS/Hostname, kein mDNS nötig.
|
||||||
|
- Most-IoT-Steuerung läuft eh **Handy → HA → IoT** → IoT (30) kann hart dichtgemacht werden.
|
||||||
|
|
||||||
|
## Geräte-Einordnung
|
||||||
|
| Gerät | VLAN |
|
||||||
|
|---|---|
|
||||||
|
| Handy, Laptop (du) | 10 MAIN |
|
||||||
|
| Sonos, AppleTV, Smart-TV, SAT-Receiver, Drucker | 10 MAIN (Discovery) |
|
||||||
|
| Sensoren/Plugs/Kameras/Smart-Home | 30 IOT |
|
||||||
|
| Spielekonsole | 40 UNTRUSTED |
|
||||||
|
| NAS, Proxmox-VMs, Docker, HA | 20 INFRA |
|
||||||
|
| Netz-Mgmt (sw1, hAPs, Hypervisor-Mgmt) | 99 MGMT |
|
||||||
|
|
||||||
|
## Migrations-Notizen
|
||||||
|
- **MAIN-Re-IP** 10.40.41 → 10.40.10: groß (DHCP/Statics/Referenzen) → später, geplant.
|
||||||
|
- **INFRA**: erst vorhandene 172er weiterfahren, dann behutsam auf 10.40.20.0/24.
|
||||||
|
- **NAS .10**: bleibt vorerst auf 10.40.41.10/MAIN; Umzug nach INFRA später.
|
||||||
|
- **VPNchristoph**: muss von `.1` weg (wird Gateway); IP egal.
|
||||||
|
- **Switch-Mgmt**: heute 10.40.41.239; nach Cutover → vlan99 / 10.40.99.2 (`management-vlan vlan 99` + `ip address`).
|
||||||
BIN
inventory/IPs.xlsx
Normal file
BIN
inventory/IPs.xlsx
Normal file
Binary file not shown.
19
inventory/README.md
Normal file
19
inventory/README.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Inventory — kanonische Netzwerk-Doku (Single Source of Truth)
|
||||||
|
|
||||||
|
**Regel:** Niemand editiert die CSV von Hand im Alltag. Du nennst Änderungen,
|
||||||
|
Claude pflegt CSV + generierte Markdown-Ansicht und committet → Git-History = Änderungs-Log.
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
1. Quell-Excel hier ablegen (`*.xlsx`) → Claude liest sie direkt.
|
||||||
|
2. Claude spiegelt die vorhandene Struktur 1:1 in versionierte CSV (nichts wegnormalisieren).
|
||||||
|
3. `*.md` = menschenlesbare Ansicht, aus CSV generiert.
|
||||||
|
4. Verfeinerung Port-für-Port: Ist-Zustand + Soll-Zustand (geplante Belegung).
|
||||||
|
|
||||||
|
## Geplant (Baustein 3, nach hAP-Go-Live)
|
||||||
|
Reconcile-Routine: SNMP (Switch MAC/Port-Tabelle) + RouterOS-API (ARP/DHCP-Leases)
|
||||||
|
→ Diff gegen diese CSV → meldet Drift / ergänzt Funde.
|
||||||
|
|
||||||
|
## Status
|
||||||
|
- [ ] Quell-Excel erhalten
|
||||||
|
- [ ] In CSV gespiegelt
|
||||||
|
- [ ] Markdown-Ansicht generiert
|
||||||
5
inventory/bf-core-ports.csv
Normal file
5
inventory/bf-core-ports.csv
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
port,ist,downstream,behalten,soll,notiz
|
||||||
|
4,Uplink Wohnzimmer-Switch (smart managed),,bis neue Switches produktiv,neues Gerät,interim — wird ersetzt
|
||||||
|
8,Uplink Arbeitszimmer-Switch (smart managed),10.40.41.10; 10.40.41.167; 10.40.41.247,bis neue Switches produktiv,neues Gerät,interim — wird ersetzt
|
||||||
|
15,pve,,ja,beibehalten,
|
||||||
|
16,Fritzbox (WAN/Gateway),10.40.41.246 (FB LAN4),ja,beibehalten,FB bleibt Modem+Telefon
|
||||||
|
11
inventory/bf-core-ports.md
Normal file
11
inventory/bf-core-ports.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Core-Switch ALL-SG8316M (sw1, 10.40.41.239) — Port-Map
|
||||||
|
|
||||||
|
> Ist-Belegung. Ports 4/8/15/16 **behalten** (4+8 interim bis neue Switches produktiv).
|
||||||
|
> Übrige Ports (1–3, 5–7, 9–14): noch nicht erfasst — gemeinsam ergänzen.
|
||||||
|
|
||||||
|
| port | ist | downstream | behalten | soll | notiz |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| 4 | Uplink Wohnzimmer-Switch (smart managed) | | bis neue Switches produktiv | neues Gerät | interim — wird ersetzt |
|
||||||
|
| 8 | Uplink Arbeitszimmer-Switch (smart managed) | 10.40.41.10; 10.40.41.167; 10.40.41.247 | bis neue Switches produktiv | neues Gerät | interim — wird ersetzt |
|
||||||
|
| 15 | pve | | ja | beibehalten | |
|
||||||
|
| 16 | Fritzbox (WAN/Gateway) | 10.40.41.246 (FB LAN4) | ja | beibehalten | FB bleibt Modem+Telefon |
|
||||||
254
inventory/bf.csv
Normal file
254
inventory/bf.csv
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
section,ip,hostname,mac,pve_ct,server_ip,server_mac,note
|
||||||
|
VPN,10.40.41.1,VPNchristoph,,,,,Fallback bis CF One überall läuft; IP umziehbar/unwichtig
|
||||||
|
VPN,10.40.41.3,,,,,,
|
||||||
|
"srv, infra",10.40.41.4,MFC,30:5:5c:78:86:20,,,,
|
||||||
|
"srv, infra",10.40.41.5,P750W,4C:EB:BD:E3:25:F2,,,,Brother PT-P750W Printer
|
||||||
|
"srv, infra",10.40.41.6,iHost,D0:27:03:C8:CB:36,,,,
|
||||||
|
"srv, infra",10.40.41.7,odroid-m1,00:1E:06:51:31:C9,,,,
|
||||||
|
"srv, infra",10.40.41.8,DTUBI-414392337823,54:F2:9F:12:51:F0,,,,
|
||||||
|
"srv, infra",10.40.41.9,,,,,,
|
||||||
|
"srv, infra",10.40.41.10,nas-bf,90:9:d0:58:20:f9,,,,
|
||||||
|
"srv, infra",10.40.41.11,tv,70:AF:24:B8:C9:86,,,,
|
||||||
|
"srv, infra",10.40.41.12,virtualdsm,,,,,
|
||||||
|
"srv, infra",10.40.41.13,sysrecue,,,,,
|
||||||
|
"srv, infra",10.40.41.14,AppleTV,,,,,
|
||||||
|
"srv, infra",10.40.41.15,,,,,,docker:synology
|
||||||
|
docker,10.40.41.16,pve:docker:adguard_bf1,BC:24:11:10:3A:98,130,,,dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923)
|
||||||
|
docker,10.40.41.17,pve:docker:adguard_fm1,,,,,dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923)
|
||||||
|
docker,10.40.41.18,pve:docker:adguard_dw1,,,,,dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923)
|
||||||
|
docker,10.40.41.19,docker:iob_exposed,BC:24:11:E4:DC:AB,150,172.16.0.150,BC:24:11:3A:62:43,
|
||||||
|
docker,10.40.41.20,docker-fm:nginx-proxy-manager,,,,,
|
||||||
|
docker,10.40.41.21,docker:ldapsyno,,,,,
|
||||||
|
docker,10.40.41.22,docker:ccu,,,,,
|
||||||
|
docker,10.40.41.23,docker:pihole_dw1,02:42:0A:28:29:17,,,,
|
||||||
|
docker,10.40.41.24,docker:,,,,,
|
||||||
|
docker,10.40.41.25,docker:,,,,,
|
||||||
|
docker,10.40.41.26,docker:,,,,,
|
||||||
|
docker,10.40.41.27,docker:,,,,,
|
||||||
|
docker,10.40.41.28,docker:,,,,,
|
||||||
|
docker,10.40.41.29,docker:,,,,,
|
||||||
|
docker,10.40.41.30,docker:cloudflared,,,,,
|
||||||
|
docker,10.40.41.31,docker:,,,,,
|
||||||
|
docker,10.40.41.32,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.33,docker_ds923+:iob_slave,,,,,
|
||||||
|
docker,10.40.41.34,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.35,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.36,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.37,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.38,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.39,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.40,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.41,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.42,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.43,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.44,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.45,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.46,res docker2bf,,,,,
|
||||||
|
docker,10.40.41.47,res docker2bf,,,,,
|
||||||
|
DHCP (reservations),10.40.41.48,ds415+,00:11:32:4F:E2:12,,,,
|
||||||
|
DHCP (reservations),10.40.41.49,ds415play,00:11:32:4C:72:7E,,,,
|
||||||
|
DHCP (reservations),10.40.41.50,win11enterprise,02:11:32:2f:1f:cc,,,,
|
||||||
|
DHCP (reservations),10.40.41.51,ds207,00:11:32:04:57:66,,,,
|
||||||
|
DHCP (reservations),10.40.41.52,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.53,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.54,vuplus,,,,,
|
||||||
|
DHCP (reservations),10.40.41.55,AppleTV,,,,,
|
||||||
|
DHCP (reservations),10.40.41.56,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.57,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.58,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.59,MobilMarven,,,,,
|
||||||
|
DHCP (reservations),10.40.41.60,MobilGeli,8c:b8:4a:56:d0:0b,,,,Note10+
|
||||||
|
DHCP (reservations),10.40.41.61,MobilChristoph,08:C7:B5:91:BA:61,,,,"S22 / dhcp-host=08:C7:B5:91:BA:61,10.40.41.33,MobilChristoph"
|
||||||
|
DHCP (reservations),10.40.41.62,MobilChristophAlt,7C:D6:61:B7:93:99,,,,"dhcp-host=7C:D6:61:B7:93:99,10.40.41.31,MobilChristophAlt"
|
||||||
|
DHCP (reservations),10.40.41.63,MobilSara,4A:11:58:B5:15:E1,,,,"A34 / dhcp-host=4A:11:58:B5:15:E1,10.40.41.26,MobilSara"
|
||||||
|
DHCP (reservations),10.40.41.64,MobilTanja,44:16:FA:CE:27:D3,,,,"dhcp-host=44:16:FA:CE:27:D3,10.40.41.30,MobilTanja"
|
||||||
|
DHCP (reservations),10.40.41.65,MobilChristophA35,B0:54:76:46:BC:1C,,,,A35
|
||||||
|
DHCP (reservations),10.40.41.66,MobilOma,DE:44:85:63:51:4A,,,,"dhcp-host=DE:44:85:63:51:4A,10.40.41.29,MobilOma"
|
||||||
|
DHCP (reservations),10.40.41.67,MobilOpa,02:8C:4F:B8:FC:8E,,,,"dhcp-host=02:8C:4F:B8:FC:8E,10.40.41.28,MobilOpa"
|
||||||
|
DHCP (reservations),10.40.41.68,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.69,iPadChristoph,34:2B:6E:6F:1F:EF,,,,
|
||||||
|
DHCP (reservations),10.40.41.70,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.71,wwan,3C:B2:33:ED:FC:03,,,,
|
||||||
|
DHCP (reservations),10.40.41.72,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.73,Forerunner965,38:F9:F5:8F:CC:69,,,,
|
||||||
|
DHCP (reservations),10.40.41.74,iHostWIFI,,,,,
|
||||||
|
DHCP (reservations),10.40.41.75,KindleVoyage,00:BB:3A:2C:0E:E6,,,,"dhcp-host=00:BB:3A:2C:0E:E6,10.40.41.39,KindleVoyage"
|
||||||
|
DHCP (reservations),10.40.41.76,SmartwatchChristoph935,14:8F:21:E7:45:2C,,,,"dhcp-host=14:8F:21:E7:45:2C,10.40.41.40,SmartwatchChristoph935"
|
||||||
|
DHCP (reservations),10.40.41.77,SmartwatchChristoph945,B4:C2:6A:57:0B:BB,,,,"dhcp-host=B4:C2:6A:57:0B:BB,10.40.41.41,SmartwatchChristoph945"
|
||||||
|
DHCP (reservations),10.40.41.78,Garmin Edge 820,14:8F:21:CB:BC:EA,,,,"dhcp-host=14:8F:21:CB:BC:EA,10.40.41.217,GarminEdge820"
|
||||||
|
DHCP (reservations),10.40.41.79,ubuntu-desktop,02:11:32:2c:3c:b1,,,,
|
||||||
|
DHCP (reservations),10.40.41.80,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.81,MacBook LAN,B8:B4:09:1A:EC:AB,,,,"dhcp-host=B8:B4:09:1A:EC:AB,10.40.41.23,MacBookLAN"
|
||||||
|
DHCP (reservations),10.40.41.82,MacBook WLAN,3c:a6:f6:02:3e:83,,,,"dhcp-host=3c:a6:f6:02:3e:83,10.40.41.24,MacBookWLAN"
|
||||||
|
DHCP (reservations),10.40.41.83,KindleTanja,a0:02:dc:5d:5d:d2,,,,
|
||||||
|
DHCP (reservations),10.40.41.84,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.85,iPadTanja,EC:73:79:C0:66:E7,,,,"dhcp-host=EC:73:79:C0:66:E7,10.40.41.35,iPadTanja"
|
||||||
|
DHCP (reservations),10.40.41.86,TvSara (zauberkatze),CC:4B:73:75:7C:4A,,,,"dhcp-host=CC:4B:73:75:7C:4A,10.40.41.43,TvSara(zauberkatze)"
|
||||||
|
DHCP (reservations),10.40.41.87,NotebookSara_alt (galadriel),00:E1:8C:9B:27:BA,,,,
|
||||||
|
DHCP (reservations),10.40.41.88,NotebookSara (celeborn),,,,,
|
||||||
|
DHCP (reservations),10.40.41.89,NotebookOpa (pluto),08:71:90:EA:0A:56,,,,"dhcp-host=08:71:90:EA:0A:56,10.40.41.44,NotebookOpa(pluto)"
|
||||||
|
DHCP (reservations),10.40.41.90,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.91,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.92,NintendoSwitchLAN,00:23:55:0C:86:59,,,,
|
||||||
|
DHCP (reservations),10.40.41.93,NintendoSwitchWLAN,94:58:CB:B1:63:BC,,,,
|
||||||
|
DHCP (reservations),10.40.41.94,EOS6Rm2,A0:CD:F3:93:FF:E4,,,,
|
||||||
|
DHCP (reservations),10.40.41.95,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.96,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.97,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.98,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.99,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.100,pve,00:D0:B4:04:19:24,,,,
|
||||||
|
DHCP (reservations),10.40.41.101,ubuntu-server,02:11:32:24:3D:EC,,,,
|
||||||
|
DHCP (reservations),10.40.41.102,ubuntu-desktop,02:11:32:2b:b6:08,,,,
|
||||||
|
DHCP (reservations),10.40.41.103,airfryer,E4:BC:96:1F:B2:81,,,,
|
||||||
|
DHCP (reservations),10.40.41.104,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.105,pve:homeassistant,BC:24:11:11:A9:B3,100,172.16.0.18,BC:24:11:1E:12:19,
|
||||||
|
DHCP (reservations),10.40.41.106,z2m25,BC:24:11:A2:B5:0F,112,172.16.0.12,BC:24:11:F3:42:01,
|
||||||
|
DHCP (reservations),10.40.41.107,iob_master,BC:24:11:4D:26:96,101,172.16.0.19,BC:24:11:B4:3E:41,172.24.0.19 / BC:24:11:6F:9A:86
|
||||||
|
DHCP (reservations),10.40.41.108,mqtt5,BC:24:11:B0:46:53,102,172.16.0.10,BC:24:11:53:DA:7D,
|
||||||
|
DHCP (reservations),10.40.41.109,grafana,BC:24:11:8A:4D:F1,104,172.16.0.9,BC:24:11:D9:A4:AC,
|
||||||
|
DHCP (reservations),10.40.41.110,SONOFF-NSPanelPro,7C:88:99:06:07:EC,,,,
|
||||||
|
DHCP (reservations),10.40.41.111,redis,BC:24:11:41:CA:A1,107,172.16.0.7,BC:24:11:5F:6B:EE,172.24.0.7 / BC:24:11:C0:35:39
|
||||||
|
DHCP (reservations),10.40.41.112,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.113,pve:influxdb2,BC:24:11:9A:F2:5E,106,172.16.0.8,,
|
||||||
|
DHCP (reservations),10.40.41.114,minarca,BC:24:11:3C:E2:3E,103,,,
|
||||||
|
DHCP (reservations),10.40.41.115,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.116,adguard-bf1,BC:24:11:B3:FC:52,120,,,
|
||||||
|
DHCP (reservations),10.40.41.117,adguard-bf2,BC:24:11:69:61:69,121,,,
|
||||||
|
DHCP (reservations),10.40.41.118,caddy,BC:24:11:3D:5A:5A,129,172.16.0.118,BC:24:11:A7:C9:6F,
|
||||||
|
DHCP (reservations),10.40.41.119,node-red,BC:24:11:0D:0C:FE,109,,,
|
||||||
|
DHCP (reservations),10.40.41.120,openproject,BC:24:11:94:83:5C,201,,,
|
||||||
|
DHCP (reservations),10.40.41.121,vaultwarden,BC:24:11:5A:DC:A0,301,172.18.0.127,BC:24:11:17:CA:26,
|
||||||
|
DHCP (reservations),10.40.41.122,mariadb,BC:24:11:52:78:0D,302,172.16.0.23,BC:24:11:B4:09:E4,
|
||||||
|
DHCP (reservations),10.40.41.123,nginx,BC:24:11:CC:13:0B,128,,BC:24:11:7D:DD:F1,
|
||||||
|
DHCP (reservations),10.40.41.124,pve:docker:hms-mqtt,,,,,
|
||||||
|
DHCP (reservations),10.40.41.125,docker_ds923+:openspeedtest,,,,,
|
||||||
|
DHCP (reservations),10.40.41.126,pve:docker,BC:24:11:C2:72:A2,400,172.16.0.126,BC:24:11:62:69:D7,
|
||||||
|
DHCP (reservations),10.40.41.127,docker:vaultwarden,,,172.16.0.127,,
|
||||||
|
DHCP (reservations),10.40.41.128,pve:docker:portainer,,,172.18.0.2,,
|
||||||
|
DHCP (reservations),10.40.41.129,pve:ollama,BC:24:11:2C:B8:0F,170,172.16.0.129,BC:24:11:E7:42:55,
|
||||||
|
DHCP (reservations),10.40.41.130,docker_ds923+:openclaw,,,172.18.0.130,,
|
||||||
|
DHCP (reservations),10.40.41.131,pihole2,BC:24:11:5B:FF:8A,131,172.16.0.131,BC:24:11:4F:9F:81,
|
||||||
|
DHCP (reservations),10.40.41.132,docker_ds923+:openclaw_cloudflared,,,,,
|
||||||
|
DHCP (reservations),10.40.41.133,ds923+:coolify,,,,,
|
||||||
|
DHCP (reservations),10.40.41.134,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.135,synodocker:pbs,02:11:32:2e:15:25,,172.16.0.135,02:11:32:21:b6:4a,
|
||||||
|
DHCP (reservations),10.40.41.136,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.137,Dongle-M-10E8,94:54:C5:28:10:EB,,,,
|
||||||
|
DHCP (reservations),10.40.41.138,Dongle-M-10E8_wifi,94:54:C5:28:10:E8,,,,
|
||||||
|
DHCP (reservations),10.40.41.139,drawio,,,,,
|
||||||
|
DHCP (reservations),10.40.41.140,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.141,wmbusmeters,BC:24:11:25:1E:DE,,,,
|
||||||
|
DHCP (reservations),10.40.41.142,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.143,openclawnginx2_dummy,,,,,
|
||||||
|
DHCP (reservations),10.40.41.144,openclaw2,,,,,
|
||||||
|
DHCP (reservations),10.40.41.145,pve:docker:cloudflared,,,,,
|
||||||
|
DHCP (reservations),10.40.41.146,ollama,,,,,
|
||||||
|
DHCP (reservations),10.40.41.147,n8n,,,,,johnny claw
|
||||||
|
DHCP (reservations),10.40.41.148,docker_ds923+:nginx,,,,,johnny claw
|
||||||
|
DHCP (reservations),10.40.41.149,gitea,,,,,
|
||||||
|
DHCP (reservations),10.40.41.150,Ender3V3KE-3226,FC:EE:11:03:32:26,,,,
|
||||||
|
DHCP (reservations),10.40.41.151,prometheus,,,,,
|
||||||
|
DHCP (reservations),10.40.41.152,mcp,,,,,
|
||||||
|
DHCP (reservations),10.40.41.153,alertmanager,,,,,
|
||||||
|
DHCP (reservations),10.40.41.154,node-exporter,,,,,
|
||||||
|
DHCP (reservations),10.40.41.155,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.156,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.157,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.158,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.159,openclaw-oc-qdrant-central,,,,,
|
||||||
|
DHCP (reservations),10.40.41.160,openclaw,,,,,
|
||||||
|
DHCP (reservations),10.40.41.161,openclaw-johnny2,,,,,
|
||||||
|
DHCP (reservations),10.40.41.162,openclaw-tzcharlie,,,,,
|
||||||
|
DHCP (reservations),10.40.41.163,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.164,oc-jonny2-redis,,,172.18.0.164,,
|
||||||
|
DHCP (reservations),10.40.41.165,oc-charlie-redis,,,172.18.0.165,,
|
||||||
|
DHCP (reservations),10.40.41.166,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.167,macmini-LAN,d0:11:e5:b9:a7:48,,,,
|
||||||
|
DHCP (reservations),10.40.41.168,macmini-WLAN,d0:11:e5:c9:08:0a,,,,
|
||||||
|
DHCP (reservations),10.40.41.169,macmini-cloudflared,,,,,
|
||||||
|
DHCP (reservations),10.40.41.170,ms365-mcp,,,,,
|
||||||
|
DHCP (reservations),10.40.41.171,hostinger-mcp,,,,,
|
||||||
|
DHCP (reservations),10.40.41.172,woocommerce-mcp,,,,,
|
||||||
|
DHCP (reservations),10.40.41.173,billbee-mcp,,,,,
|
||||||
|
DHCP (reservations),10.40.41.174,sevdesk-mcp,,,,,
|
||||||
|
DHCP (reservations),10.40.41.175,wordpress-mcp,,,,,
|
||||||
|
DHCP (reservations),10.40.41.176,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.177,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.178,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.179,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.180,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.181,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.182,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.183,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.184,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.185,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.186,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.187,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.188,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.189,,,,,,
|
||||||
|
DHCP (reservations),10.40.41.190,,,,,,
|
||||||
|
Sonos,10.40.41.191,SonosArbeitszimmer1,34:7e:5c:32:37:96,,,,"dhcp-host=34:7e:5c:32:37:96,10.40.41.191,SonosArbeitszimmer1"
|
||||||
|
Sonos,10.40.41.192,SonosArbeitszimmer2,34:7e:5c:32:33:b8,,,,"dhcp-host=34:7e:5c:32:33:b8,10.40.41.192,SonosArbeitszimmer2"
|
||||||
|
Sonos,10.40.41.193,SonosSchlafzimmer1,78:28:ca:80:2a:f6,,,,"dhcp-host=78:28:ca:80:2a:f6,10.40.41.193,SonosSchlafzimmer1"
|
||||||
|
Sonos,10.40.41.194,SonosSchlafzimmer2,48:a6:b8:14:fe:d0,,,,"dhcp-host=48:a6:b8:14:fe:d0,10.40.41.194,SonosSchlafzimmer2"
|
||||||
|
Sonos,10.40.41.195,SonosBad,48:A6:B8:14:FE:D0,,,,"dhcp-host=48:A6:B8:14:FE:D0,10.40.41.195,SonosBad"
|
||||||
|
Sonos,10.40.41.196,SonosKinderzimmer,48:A6:B8:16:38:AE,,,,"dhcp-host=48:A6:B8:16:38:AE,10.40.41.196,SonosKinderzimmer"
|
||||||
|
Sonos,10.40.41.197,SonosKueche,48:A6:B8:14:FE:F2,,,,"dhcp-host=48:A6:B8:14:FE:F2,10.40.41.197,SonosKueche"
|
||||||
|
Sonos,10.40.41.198,SonosTerrasse,48:a6:b8:16:38:ae,,,,"dhcp-host=48:a6:b8:16:38:ae,10.40.41.198,SonosTerrasse"
|
||||||
|
Sonos,10.40.41.199,SonosWohnzimmer1,48:A6:B8:0B:63:10,,,,"48:A6:B8:01:13:EE / dhcp-host=48:A6:B8:0B:63:10,10.40.41.199,SonosWohnzimmer1"
|
||||||
|
Sonos,10.40.41.200,SonosWohnzimmer2,48:a6:b8:14:fe:f2,,,,"dhcp-host=48:a6:b8:14:fe:f2,10.40.41.200,SonosWohnzimmer2"
|
||||||
|
Sonos,10.40.41.201,SonosWohnzimmer3,78:28:ca:d2:0d:ac,,,,"dhcp-host=78:28:ca:d2:0d:ac,10.40.41.201,SonosWohnzimmer3"
|
||||||
|
Sonos,10.40.41.202,shelly: s22,a0:85:e3:c8:65:34,,,,kueche_steckdose3-2
|
||||||
|
Sonos,10.40.41.203,shelly: s23,ac:15:18:7b:62:20,,,,dieleug-wohnzimmer_licht
|
||||||
|
Sonos,10.40.41.204,shelly: s24,,,,,bad_spielgelschrank
|
||||||
|
Sonos,10.40.41.205,shelly: s25,98:a3:16:79:38:50,,,,bad_lichtschalter
|
||||||
|
IOT,10.40.41.206,shelly: s20,98:a3:16:7c:5f:ec,,,,kueche_steckdosen2
|
||||||
|
IOT,10.40.41.207,shelly: s21,20:6e:f1:01:f9:f8,,,,kueche_steckdosen4
|
||||||
|
IOT,10.40.41.208,shelly: s1,E4:B0:63:D7:C7:A4,,,,weihnachten_kueche
|
||||||
|
IOT,10.40.41.209,shelly: s2,28:37:2F:36:F4:7C,,,,weihnachten_terrasse
|
||||||
|
IOT,10.40.41.210,shelly: s3,E4:B0:63:E4:EF:7C,,,,weihnachten_kinderzimmer
|
||||||
|
IOT,10.40.41.211,shelly: s4,E4:B0:63:E4:0F:30,,,,kueche_mikrowelle
|
||||||
|
IOT,10.40.41.212,shelly: s5,D8:85:AC:0C:5C:C8,,,,kueche_backofen
|
||||||
|
IOT,10.40.41.213,shelly: s6,0c:72:74:36:90:9e,,,,kueche_kuehlschrank
|
||||||
|
IOT,10.40.41.214,shelly: s7,D0:CF:13:D9:94:E8,,,,kueche_tiefkuehlschrank
|
||||||
|
IOT,10.40.41.215,shelly: s8,E4:B0:63:FA:FD:E0,,,,kueche_geschirrspueler
|
||||||
|
IOT,10.40.41.216,shelly: s9,E8:F6:0A:61:88:08,,,,wohnzimmer_sideboard
|
||||||
|
IOT,10.40.41.217,shelly: s10,E4:B0:63:FC:57:E4,,,,bad_sonos
|
||||||
|
IOT,10.40.41.218,shelly: s11,E4:B0:63:FA:6C:00,,,,kinderzimmer_sonos
|
||||||
|
IOT,10.40.41.219,shelly: s12,48:f6:ee:c8:e6:ac,,,,dieleug_steckdosen
|
||||||
|
IOT,10.40.41.220,shelly: s13,48:F6:EE:DD:6A:F4,,,,arbeitszimmer_technik
|
||||||
|
IOT,10.40.41.221,shelly: s14,E4:B0:63:FC:59:48,,,,schlafzimmer_bett
|
||||||
|
IOT,10.40.41.222,shelly: s15,E4:B0:63:FA:D5:34,,,,technik_pve
|
||||||
|
IOT,10.40.41.223,shelly: s16,10:20:ba:fa:f5:40,,,,wohnzimmer_steckdosen
|
||||||
|
IOT,10.40.41.224,shelly: s17,10:20:ba:fb:6d:64,,,,bad_steckdosen
|
||||||
|
IOT,10.40.41.225,shelly: s18,48:f6:ee:cc:16:e4,,,,kueche_steckdosen1
|
||||||
|
IOT,10.40.41.226,shelly: s19,10:20:ba:fb:70:fc,,,,kueche_steckdosen3
|
||||||
|
IOT,10.40.41.227,switchbot-floorlamp,B8:F8:62:09:F2:04,,,,
|
||||||
|
IOT,10.40.41.228,Twinkly Weihnachtsgirlande,98:F4:AB:2C:A7:88,,,,"dhcp-host=98:F4:AB:2C:A7:88,10.40.41.223,TwinklyWeihnachtsgirlande"
|
||||||
|
IOT,10.40.41.229,tuya smartlife TK,,,,,
|
||||||
|
IOT,10.40.41.230,Withings_waage,00:24:e4:40:2a:72,,,,
|
||||||
|
IOT,10.40.41.231,Withings_blutdruck,A4:7E:FA:18:2C:64,,,,
|
||||||
|
IOT,10.40.41.232,pve:homematic-raspi (ccu),BC:24:11:8E:0A:57,330,172.16.0.232,BC:24:11:D3:B3:F4,
|
||||||
|
IOT,10.40.41.233,shelly: s26,98:a3:16:7a:a3:54,,,,bad_luefter
|
||||||
|
IOT,10.40.41.234,,,,,,
|
||||||
|
IOT,10.40.41.235,,,,,,
|
||||||
|
IOT,10.40.41.236,lichterkette,A4:F0:0F:5F:D0:EC,,,,
|
||||||
|
IOT,10.40.41.237,lichterkette-mini,24:DC:C3:9B:89:64,,,,
|
||||||
|
IOT,10.40.41.238,,,,,,
|
||||||
|
IOT,10.40.41.239,sw1,00:08:54:71:98:2D,,,,"allnet core switch / dhcp-host=00:08:54:71:98:2D,10.40.41.239,sw1"
|
||||||
|
IOT,10.40.41.240,,,,,,
|
||||||
|
IOT,10.40.41.241,NukiSmartlock,28:DB:A7:09:7B:54,,,,
|
||||||
|
IOT,10.40.41.242,,,,,,
|
||||||
|
IOT,10.40.41.243,,,,,,
|
||||||
|
IOT,10.40.41.244,NukiBridge,24:62:ab:b1:63:f4,,,,"dhcp-host=24:62:ab:b1:63:f4,10.40.41.244,NukiBridge"
|
||||||
|
IOT,10.40.41.245,,,,,,
|
||||||
|
Netzwerk,10.40.41.246,fritzrepeater1,12:72:74:9c:66:49,,,,"Arbeitszimmer / dhcp-host=12:72:74:9c:66:49,10.40.41.246,fritzrepeater1"
|
||||||
|
Netzwerk,10.40.41.247,,,,,,
|
||||||
|
Netzwerk,10.40.41.248,,,,,,
|
||||||
|
Netzwerk,10.40.41.249,,,,,,
|
||||||
|
Netzwerk,10.40.41.250,,,,,,
|
||||||
|
Netzwerk,10.40.41.251,,,,,,
|
||||||
|
Netzwerk,10.40.41.252,,,,,,
|
||||||
|
Netzwerk,10.40.41.253,openwrt,,700,,,
|
||||||
|
Netzwerk,10.40.41.254,gateway-bf,0c:72:74:36:90:9c,,,,
|
||||||
|
293
inventory/bf.md
Normal file
293
inventory/bf.md
Normal file
@@ -0,0 +1,293 @@
|
|||||||
|
# Inventar — Standort BF (kanonisch)
|
||||||
|
|
||||||
|
> Generiert aus `bf.csv` via `build.py`. **Quelle der Wahrheit = bf.csv.** Seed: `IPs.xlsx`.
|
||||||
|
> ⚠️ Manche `pve_ct`/Einträge können Doku-Leichen sein (z.B. re-dockerisierte Container).
|
||||||
|
|
||||||
|
|
||||||
|
## VPN
|
||||||
|
|
||||||
|
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 10.40.41.1 | VPNchristoph | | | | | Fallback bis CF One überall läuft; IP umziehbar/unwichtig |
|
||||||
|
| 10.40.41.3 | | | | | | |
|
||||||
|
|
||||||
|
## srv, infra
|
||||||
|
|
||||||
|
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 10.40.41.4 | MFC | 30:5:5c:78:86:20 | | | | |
|
||||||
|
| 10.40.41.5 | P750W | 4C:EB:BD:E3:25:F2 | | | | Brother PT-P750W Printer |
|
||||||
|
| 10.40.41.6 | iHost | D0:27:03:C8:CB:36 | | | | |
|
||||||
|
| 10.40.41.7 | odroid-m1 | 00:1E:06:51:31:C9 | | | | |
|
||||||
|
| 10.40.41.8 | DTUBI-414392337823 | 54:F2:9F:12:51:F0 | | | | |
|
||||||
|
| 10.40.41.9 | | | | | | |
|
||||||
|
| 10.40.41.10 | nas-bf | 90:9:d0:58:20:f9 | | | | |
|
||||||
|
| 10.40.41.11 | tv | 70:AF:24:B8:C9:86 | | | | |
|
||||||
|
| 10.40.41.12 | virtualdsm | | | | | |
|
||||||
|
| 10.40.41.13 | sysrecue | | | | | |
|
||||||
|
| 10.40.41.14 | AppleTV | | | | | |
|
||||||
|
| 10.40.41.15 | | | | | | docker:synology |
|
||||||
|
|
||||||
|
## docker
|
||||||
|
|
||||||
|
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 10.40.41.16 | pve:docker:adguard_bf1 | BC:24:11:10:3A:98 | 130 | | | dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923) |
|
||||||
|
| 10.40.41.17 | pve:docker:adguard_fm1 | | | | | dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923) |
|
||||||
|
| 10.40.41.18 | pve:docker:adguard_dw1 | | | | | dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923) |
|
||||||
|
| 10.40.41.19 | docker:iob_exposed | BC:24:11:E4:DC:AB | 150 | 172.16.0.150 | BC:24:11:3A:62:43 | |
|
||||||
|
| 10.40.41.20 | docker-fm:nginx-proxy-manager | | | | | |
|
||||||
|
| 10.40.41.21 | docker:ldapsyno | | | | | |
|
||||||
|
| 10.40.41.22 | docker:ccu | | | | | |
|
||||||
|
| 10.40.41.23 | docker:pihole_dw1 | 02:42:0A:28:29:17 | | | | |
|
||||||
|
| 10.40.41.24 | docker: | | | | | |
|
||||||
|
| 10.40.41.25 | docker: | | | | | |
|
||||||
|
| 10.40.41.26 | docker: | | | | | |
|
||||||
|
| 10.40.41.27 | docker: | | | | | |
|
||||||
|
| 10.40.41.28 | docker: | | | | | |
|
||||||
|
| 10.40.41.29 | docker: | | | | | |
|
||||||
|
| 10.40.41.30 | docker:cloudflared | | | | | |
|
||||||
|
| 10.40.41.31 | docker: | | | | | |
|
||||||
|
| 10.40.41.32 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.33 | docker_ds923+:iob_slave | | | | | |
|
||||||
|
| 10.40.41.34 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.35 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.36 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.37 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.38 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.39 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.40 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.41 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.42 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.43 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.44 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.45 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.46 | res docker2bf | | | | | |
|
||||||
|
| 10.40.41.47 | res docker2bf | | | | | |
|
||||||
|
|
||||||
|
## DHCP (reservations)
|
||||||
|
|
||||||
|
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 10.40.41.48 | ds415+ | 00:11:32:4F:E2:12 | | | | |
|
||||||
|
| 10.40.41.49 | ds415play | 00:11:32:4C:72:7E | | | | |
|
||||||
|
| 10.40.41.50 | win11enterprise | 02:11:32:2f:1f:cc | | | | |
|
||||||
|
| 10.40.41.51 | ds207 | 00:11:32:04:57:66 | | | | |
|
||||||
|
| 10.40.41.52 | | | | | | |
|
||||||
|
| 10.40.41.53 | | | | | | |
|
||||||
|
| 10.40.41.54 | vuplus | | | | | |
|
||||||
|
| 10.40.41.55 | AppleTV | | | | | |
|
||||||
|
| 10.40.41.56 | | | | | | |
|
||||||
|
| 10.40.41.57 | | | | | | |
|
||||||
|
| 10.40.41.58 | | | | | | |
|
||||||
|
| 10.40.41.59 | MobilMarven | | | | | |
|
||||||
|
| 10.40.41.60 | MobilGeli | 8c:b8:4a:56:d0:0b | | | | Note10+ |
|
||||||
|
| 10.40.41.61 | MobilChristoph | 08:C7:B5:91:BA:61 | | | | S22 / dhcp-host=08:C7:B5:91:BA:61,10.40.41.33,MobilChristoph |
|
||||||
|
| 10.40.41.62 | MobilChristophAlt | 7C:D6:61:B7:93:99 | | | | dhcp-host=7C:D6:61:B7:93:99,10.40.41.31,MobilChristophAlt |
|
||||||
|
| 10.40.41.63 | MobilSara | 4A:11:58:B5:15:E1 | | | | A34 / dhcp-host=4A:11:58:B5:15:E1,10.40.41.26,MobilSara |
|
||||||
|
| 10.40.41.64 | MobilTanja | 44:16:FA:CE:27:D3 | | | | dhcp-host=44:16:FA:CE:27:D3,10.40.41.30,MobilTanja |
|
||||||
|
| 10.40.41.65 | MobilChristophA35 | B0:54:76:46:BC:1C | | | | A35 |
|
||||||
|
| 10.40.41.66 | MobilOma | DE:44:85:63:51:4A | | | | dhcp-host=DE:44:85:63:51:4A,10.40.41.29,MobilOma |
|
||||||
|
| 10.40.41.67 | MobilOpa | 02:8C:4F:B8:FC:8E | | | | dhcp-host=02:8C:4F:B8:FC:8E,10.40.41.28,MobilOpa |
|
||||||
|
| 10.40.41.68 | | | | | | |
|
||||||
|
| 10.40.41.69 | iPadChristoph | 34:2B:6E:6F:1F:EF | | | | |
|
||||||
|
| 10.40.41.70 | | | | | | |
|
||||||
|
| 10.40.41.71 | wwan | 3C:B2:33:ED:FC:03 | | | | |
|
||||||
|
| 10.40.41.72 | | | | | | |
|
||||||
|
| 10.40.41.73 | Forerunner965 | 38:F9:F5:8F:CC:69 | | | | |
|
||||||
|
| 10.40.41.74 | iHostWIFI | | | | | |
|
||||||
|
| 10.40.41.75 | KindleVoyage | 00:BB:3A:2C:0E:E6 | | | | dhcp-host=00:BB:3A:2C:0E:E6,10.40.41.39,KindleVoyage |
|
||||||
|
| 10.40.41.76 | SmartwatchChristoph935 | 14:8F:21:E7:45:2C | | | | dhcp-host=14:8F:21:E7:45:2C,10.40.41.40,SmartwatchChristoph935 |
|
||||||
|
| 10.40.41.77 | SmartwatchChristoph945 | B4:C2:6A:57:0B:BB | | | | dhcp-host=B4:C2:6A:57:0B:BB,10.40.41.41,SmartwatchChristoph945 |
|
||||||
|
| 10.40.41.78 | Garmin Edge 820 | 14:8F:21:CB:BC:EA | | | | dhcp-host=14:8F:21:CB:BC:EA,10.40.41.217,GarminEdge820 |
|
||||||
|
| 10.40.41.79 | ubuntu-desktop | 02:11:32:2c:3c:b1 | | | | |
|
||||||
|
| 10.40.41.80 | | | | | | |
|
||||||
|
| 10.40.41.81 | MacBook LAN | B8:B4:09:1A:EC:AB | | | | dhcp-host=B8:B4:09:1A:EC:AB,10.40.41.23,MacBookLAN |
|
||||||
|
| 10.40.41.82 | MacBook WLAN | 3c:a6:f6:02:3e:83 | | | | dhcp-host=3c:a6:f6:02:3e:83,10.40.41.24,MacBookWLAN |
|
||||||
|
| 10.40.41.83 | KindleTanja | a0:02:dc:5d:5d:d2 | | | | |
|
||||||
|
| 10.40.41.84 | | | | | | |
|
||||||
|
| 10.40.41.85 | iPadTanja | EC:73:79:C0:66:E7 | | | | dhcp-host=EC:73:79:C0:66:E7,10.40.41.35,iPadTanja |
|
||||||
|
| 10.40.41.86 | TvSara (zauberkatze) | CC:4B:73:75:7C:4A | | | | dhcp-host=CC:4B:73:75:7C:4A,10.40.41.43,TvSara(zauberkatze) |
|
||||||
|
| 10.40.41.87 | NotebookSara_alt (galadriel) | 00:E1:8C:9B:27:BA | | | | |
|
||||||
|
| 10.40.41.88 | NotebookSara (celeborn) | | | | | |
|
||||||
|
| 10.40.41.89 | NotebookOpa (pluto) | 08:71:90:EA:0A:56 | | | | dhcp-host=08:71:90:EA:0A:56,10.40.41.44,NotebookOpa(pluto) |
|
||||||
|
| 10.40.41.90 | | | | | | |
|
||||||
|
| 10.40.41.91 | | | | | | |
|
||||||
|
| 10.40.41.92 | NintendoSwitchLAN | 00:23:55:0C:86:59 | | | | |
|
||||||
|
| 10.40.41.93 | NintendoSwitchWLAN | 94:58:CB:B1:63:BC | | | | |
|
||||||
|
| 10.40.41.94 | EOS6Rm2 | A0:CD:F3:93:FF:E4 | | | | |
|
||||||
|
| 10.40.41.95 | | | | | | |
|
||||||
|
| 10.40.41.96 | | | | | | |
|
||||||
|
| 10.40.41.97 | | | | | | |
|
||||||
|
| 10.40.41.98 | | | | | | |
|
||||||
|
| 10.40.41.99 | | | | | | |
|
||||||
|
| 10.40.41.100 | pve | 00:D0:B4:04:19:24 | | | | |
|
||||||
|
| 10.40.41.101 | ubuntu-server | 02:11:32:24:3D:EC | | | | |
|
||||||
|
| 10.40.41.102 | ubuntu-desktop | 02:11:32:2b:b6:08 | | | | |
|
||||||
|
| 10.40.41.103 | airfryer | E4:BC:96:1F:B2:81 | | | | |
|
||||||
|
| 10.40.41.104 | | | | | | |
|
||||||
|
| 10.40.41.105 | pve:homeassistant | BC:24:11:11:A9:B3 | 100 | 172.16.0.18 | BC:24:11:1E:12:19 | |
|
||||||
|
| 10.40.41.106 | z2m25 | BC:24:11:A2:B5:0F | 112 | 172.16.0.12 | BC:24:11:F3:42:01 | |
|
||||||
|
| 10.40.41.107 | iob_master | BC:24:11:4D:26:96 | 101 | 172.16.0.19 | BC:24:11:B4:3E:41 | 172.24.0.19 / BC:24:11:6F:9A:86 |
|
||||||
|
| 10.40.41.108 | mqtt5 | BC:24:11:B0:46:53 | 102 | 172.16.0.10 | BC:24:11:53:DA:7D | |
|
||||||
|
| 10.40.41.109 | grafana | BC:24:11:8A:4D:F1 | 104 | 172.16.0.9 | BC:24:11:D9:A4:AC | |
|
||||||
|
| 10.40.41.110 | SONOFF-NSPanelPro | 7C:88:99:06:07:EC | | | | |
|
||||||
|
| 10.40.41.111 | redis | BC:24:11:41:CA:A1 | 107 | 172.16.0.7 | BC:24:11:5F:6B:EE | 172.24.0.7 / BC:24:11:C0:35:39 |
|
||||||
|
| 10.40.41.112 | | | | | | |
|
||||||
|
| 10.40.41.113 | pve:influxdb2 | BC:24:11:9A:F2:5E | 106 | 172.16.0.8 | | |
|
||||||
|
| 10.40.41.114 | minarca | BC:24:11:3C:E2:3E | 103 | | | |
|
||||||
|
| 10.40.41.115 | | | | | | |
|
||||||
|
| 10.40.41.116 | adguard-bf1 | BC:24:11:B3:FC:52 | 120 | | | |
|
||||||
|
| 10.40.41.117 | adguard-bf2 | BC:24:11:69:61:69 | 121 | | | |
|
||||||
|
| 10.40.41.118 | caddy | BC:24:11:3D:5A:5A | 129 | 172.16.0.118 | BC:24:11:A7:C9:6F | |
|
||||||
|
| 10.40.41.119 | node-red | BC:24:11:0D:0C:FE | 109 | | | |
|
||||||
|
| 10.40.41.120 | openproject | BC:24:11:94:83:5C | 201 | | | |
|
||||||
|
| 10.40.41.121 | vaultwarden | BC:24:11:5A:DC:A0 | 301 | 172.18.0.127 | BC:24:11:17:CA:26 | |
|
||||||
|
| 10.40.41.122 | mariadb | BC:24:11:52:78:0D | 302 | 172.16.0.23 | BC:24:11:B4:09:E4 | |
|
||||||
|
| 10.40.41.123 | nginx | BC:24:11:CC:13:0B | 128 | | BC:24:11:7D:DD:F1 | |
|
||||||
|
| 10.40.41.124 | pve:docker:hms-mqtt | | | | | |
|
||||||
|
| 10.40.41.125 | docker_ds923+:openspeedtest | | | | | |
|
||||||
|
| 10.40.41.126 | pve:docker | BC:24:11:C2:72:A2 | 400 | 172.16.0.126 | BC:24:11:62:69:D7 | |
|
||||||
|
| 10.40.41.127 | docker:vaultwarden | | | 172.16.0.127 | | |
|
||||||
|
| 10.40.41.128 | pve:docker:portainer | | | 172.18.0.2 | | |
|
||||||
|
| 10.40.41.129 | pve:ollama | BC:24:11:2C:B8:0F | 170 | 172.16.0.129 | BC:24:11:E7:42:55 | |
|
||||||
|
| 10.40.41.130 | docker_ds923+:openclaw | | | 172.18.0.130 | | |
|
||||||
|
| 10.40.41.131 | pihole2 | BC:24:11:5B:FF:8A | 131 | 172.16.0.131 | BC:24:11:4F:9F:81 | |
|
||||||
|
| 10.40.41.132 | docker_ds923+:openclaw_cloudflared | | | | | |
|
||||||
|
| 10.40.41.133 | ds923+:coolify | | | | | |
|
||||||
|
| 10.40.41.134 | | | | | | |
|
||||||
|
| 10.40.41.135 | synodocker:pbs | 02:11:32:2e:15:25 | | 172.16.0.135 | 02:11:32:21:b6:4a | |
|
||||||
|
| 10.40.41.136 | | | | | | |
|
||||||
|
| 10.40.41.137 | Dongle-M-10E8 | 94:54:C5:28:10:EB | | | | |
|
||||||
|
| 10.40.41.138 | Dongle-M-10E8_wifi | 94:54:C5:28:10:E8 | | | | |
|
||||||
|
| 10.40.41.139 | drawio | | | | | |
|
||||||
|
| 10.40.41.140 | | | | | | |
|
||||||
|
| 10.40.41.141 | wmbusmeters | BC:24:11:25:1E:DE | | | | |
|
||||||
|
| 10.40.41.142 | | | | | | |
|
||||||
|
| 10.40.41.143 | openclawnginx2_dummy | | | | | |
|
||||||
|
| 10.40.41.144 | openclaw2 | | | | | |
|
||||||
|
| 10.40.41.145 | pve:docker:cloudflared | | | | | |
|
||||||
|
| 10.40.41.146 | ollama | | | | | |
|
||||||
|
| 10.40.41.147 | n8n | | | | | johnny claw |
|
||||||
|
| 10.40.41.148 | docker_ds923+:nginx | | | | | johnny claw |
|
||||||
|
| 10.40.41.149 | gitea | | | | | |
|
||||||
|
| 10.40.41.150 | Ender3V3KE-3226 | FC:EE:11:03:32:26 | | | | |
|
||||||
|
| 10.40.41.151 | prometheus | | | | | |
|
||||||
|
| 10.40.41.152 | mcp | | | | | |
|
||||||
|
| 10.40.41.153 | alertmanager | | | | | |
|
||||||
|
| 10.40.41.154 | node-exporter | | | | | |
|
||||||
|
| 10.40.41.155 | | | | | | |
|
||||||
|
| 10.40.41.156 | | | | | | |
|
||||||
|
| 10.40.41.157 | | | | | | |
|
||||||
|
| 10.40.41.158 | | | | | | |
|
||||||
|
| 10.40.41.159 | openclaw-oc-qdrant-central | | | | | |
|
||||||
|
| 10.40.41.160 | openclaw | | | | | |
|
||||||
|
| 10.40.41.161 | openclaw-johnny2 | | | | | |
|
||||||
|
| 10.40.41.162 | openclaw-tzcharlie | | | | | |
|
||||||
|
| 10.40.41.163 | | | | | | |
|
||||||
|
| 10.40.41.164 | oc-jonny2-redis | | | 172.18.0.164 | | |
|
||||||
|
| 10.40.41.165 | oc-charlie-redis | | | 172.18.0.165 | | |
|
||||||
|
| 10.40.41.166 | | | | | | |
|
||||||
|
| 10.40.41.167 | macmini-LAN | d0:11:e5:b9:a7:48 | | | | |
|
||||||
|
| 10.40.41.168 | macmini-WLAN | d0:11:e5:c9:08:0a | | | | |
|
||||||
|
| 10.40.41.169 | macmini-cloudflared | | | | | |
|
||||||
|
| 10.40.41.170 | ms365-mcp | | | | | |
|
||||||
|
| 10.40.41.171 | hostinger-mcp | | | | | |
|
||||||
|
| 10.40.41.172 | woocommerce-mcp | | | | | |
|
||||||
|
| 10.40.41.173 | billbee-mcp | | | | | |
|
||||||
|
| 10.40.41.174 | sevdesk-mcp | | | | | |
|
||||||
|
| 10.40.41.175 | wordpress-mcp | | | | | |
|
||||||
|
| 10.40.41.176 | | | | | | |
|
||||||
|
| 10.40.41.177 | | | | | | |
|
||||||
|
| 10.40.41.178 | | | | | | |
|
||||||
|
| 10.40.41.179 | | | | | | |
|
||||||
|
| 10.40.41.180 | | | | | | |
|
||||||
|
| 10.40.41.181 | | | | | | |
|
||||||
|
| 10.40.41.182 | | | | | | |
|
||||||
|
| 10.40.41.183 | | | | | | |
|
||||||
|
| 10.40.41.184 | | | | | | |
|
||||||
|
| 10.40.41.185 | | | | | | |
|
||||||
|
| 10.40.41.186 | | | | | | |
|
||||||
|
| 10.40.41.187 | | | | | | |
|
||||||
|
| 10.40.41.188 | | | | | | |
|
||||||
|
| 10.40.41.189 | | | | | | |
|
||||||
|
| 10.40.41.190 | | | | | | |
|
||||||
|
|
||||||
|
## Sonos
|
||||||
|
|
||||||
|
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 10.40.41.191 | SonosArbeitszimmer1 | 34:7e:5c:32:37:96 | | | | dhcp-host=34:7e:5c:32:37:96,10.40.41.191,SonosArbeitszimmer1 |
|
||||||
|
| 10.40.41.192 | SonosArbeitszimmer2 | 34:7e:5c:32:33:b8 | | | | dhcp-host=34:7e:5c:32:33:b8,10.40.41.192,SonosArbeitszimmer2 |
|
||||||
|
| 10.40.41.193 | SonosSchlafzimmer1 | 78:28:ca:80:2a:f6 | | | | dhcp-host=78:28:ca:80:2a:f6,10.40.41.193,SonosSchlafzimmer1 |
|
||||||
|
| 10.40.41.194 | SonosSchlafzimmer2 | 48:a6:b8:14:fe:d0 | | | | dhcp-host=48:a6:b8:14:fe:d0,10.40.41.194,SonosSchlafzimmer2 |
|
||||||
|
| 10.40.41.195 | SonosBad | 48:A6:B8:14:FE:D0 | | | | dhcp-host=48:A6:B8:14:FE:D0,10.40.41.195,SonosBad |
|
||||||
|
| 10.40.41.196 | SonosKinderzimmer | 48:A6:B8:16:38:AE | | | | dhcp-host=48:A6:B8:16:38:AE,10.40.41.196,SonosKinderzimmer |
|
||||||
|
| 10.40.41.197 | SonosKueche | 48:A6:B8:14:FE:F2 | | | | dhcp-host=48:A6:B8:14:FE:F2,10.40.41.197,SonosKueche |
|
||||||
|
| 10.40.41.198 | SonosTerrasse | 48:a6:b8:16:38:ae | | | | dhcp-host=48:a6:b8:16:38:ae,10.40.41.198,SonosTerrasse |
|
||||||
|
| 10.40.41.199 | SonosWohnzimmer1 | 48:A6:B8:0B:63:10 | | | | 48:A6:B8:01:13:EE / dhcp-host=48:A6:B8:0B:63:10,10.40.41.199,SonosWohnzimmer1 |
|
||||||
|
| 10.40.41.200 | SonosWohnzimmer2 | 48:a6:b8:14:fe:f2 | | | | dhcp-host=48:a6:b8:14:fe:f2,10.40.41.200,SonosWohnzimmer2 |
|
||||||
|
| 10.40.41.201 | SonosWohnzimmer3 | 78:28:ca:d2:0d:ac | | | | dhcp-host=78:28:ca:d2:0d:ac,10.40.41.201,SonosWohnzimmer3 |
|
||||||
|
| 10.40.41.202 | shelly: s22 | a0:85:e3:c8:65:34 | | | | kueche_steckdose3-2 |
|
||||||
|
| 10.40.41.203 | shelly: s23 | ac:15:18:7b:62:20 | | | | dieleug-wohnzimmer_licht |
|
||||||
|
| 10.40.41.204 | shelly: s24 | | | | | bad_spielgelschrank |
|
||||||
|
| 10.40.41.205 | shelly: s25 | 98:a3:16:79:38:50 | | | | bad_lichtschalter |
|
||||||
|
|
||||||
|
## IOT
|
||||||
|
|
||||||
|
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 10.40.41.206 | shelly: s20 | 98:a3:16:7c:5f:ec | | | | kueche_steckdosen2 |
|
||||||
|
| 10.40.41.207 | shelly: s21 | 20:6e:f1:01:f9:f8 | | | | kueche_steckdosen4 |
|
||||||
|
| 10.40.41.208 | shelly: s1 | E4:B0:63:D7:C7:A4 | | | | weihnachten_kueche |
|
||||||
|
| 10.40.41.209 | shelly: s2 | 28:37:2F:36:F4:7C | | | | weihnachten_terrasse |
|
||||||
|
| 10.40.41.210 | shelly: s3 | E4:B0:63:E4:EF:7C | | | | weihnachten_kinderzimmer |
|
||||||
|
| 10.40.41.211 | shelly: s4 | E4:B0:63:E4:0F:30 | | | | kueche_mikrowelle |
|
||||||
|
| 10.40.41.212 | shelly: s5 | D8:85:AC:0C:5C:C8 | | | | kueche_backofen |
|
||||||
|
| 10.40.41.213 | shelly: s6 | 0c:72:74:36:90:9e | | | | kueche_kuehlschrank |
|
||||||
|
| 10.40.41.214 | shelly: s7 | D0:CF:13:D9:94:E8 | | | | kueche_tiefkuehlschrank |
|
||||||
|
| 10.40.41.215 | shelly: s8 | E4:B0:63:FA:FD:E0 | | | | kueche_geschirrspueler |
|
||||||
|
| 10.40.41.216 | shelly: s9 | E8:F6:0A:61:88:08 | | | | wohnzimmer_sideboard |
|
||||||
|
| 10.40.41.217 | shelly: s10 | E4:B0:63:FC:57:E4 | | | | bad_sonos |
|
||||||
|
| 10.40.41.218 | shelly: s11 | E4:B0:63:FA:6C:00 | | | | kinderzimmer_sonos |
|
||||||
|
| 10.40.41.219 | shelly: s12 | 48:f6:ee:c8:e6:ac | | | | dieleug_steckdosen |
|
||||||
|
| 10.40.41.220 | shelly: s13 | 48:F6:EE:DD:6A:F4 | | | | arbeitszimmer_technik |
|
||||||
|
| 10.40.41.221 | shelly: s14 | E4:B0:63:FC:59:48 | | | | schlafzimmer_bett |
|
||||||
|
| 10.40.41.222 | shelly: s15 | E4:B0:63:FA:D5:34 | | | | technik_pve |
|
||||||
|
| 10.40.41.223 | shelly: s16 | 10:20:ba:fa:f5:40 | | | | wohnzimmer_steckdosen |
|
||||||
|
| 10.40.41.224 | shelly: s17 | 10:20:ba:fb:6d:64 | | | | bad_steckdosen |
|
||||||
|
| 10.40.41.225 | shelly: s18 | 48:f6:ee:cc:16:e4 | | | | kueche_steckdosen1 |
|
||||||
|
| 10.40.41.226 | shelly: s19 | 10:20:ba:fb:70:fc | | | | kueche_steckdosen3 |
|
||||||
|
| 10.40.41.227 | switchbot-floorlamp | B8:F8:62:09:F2:04 | | | | |
|
||||||
|
| 10.40.41.228 | Twinkly Weihnachtsgirlande | 98:F4:AB:2C:A7:88 | | | | dhcp-host=98:F4:AB:2C:A7:88,10.40.41.223,TwinklyWeihnachtsgirlande |
|
||||||
|
| 10.40.41.229 | tuya smartlife TK | | | | | |
|
||||||
|
| 10.40.41.230 | Withings_waage | 00:24:e4:40:2a:72 | | | | |
|
||||||
|
| 10.40.41.231 | Withings_blutdruck | A4:7E:FA:18:2C:64 | | | | |
|
||||||
|
| 10.40.41.232 | pve:homematic-raspi (ccu) | BC:24:11:8E:0A:57 | 330 | 172.16.0.232 | BC:24:11:D3:B3:F4 | |
|
||||||
|
| 10.40.41.233 | shelly: s26 | 98:a3:16:7a:a3:54 | | | | bad_luefter |
|
||||||
|
| 10.40.41.234 | | | | | | |
|
||||||
|
| 10.40.41.235 | | | | | | |
|
||||||
|
| 10.40.41.236 | lichterkette | A4:F0:0F:5F:D0:EC | | | | |
|
||||||
|
| 10.40.41.237 | lichterkette-mini | 24:DC:C3:9B:89:64 | | | | |
|
||||||
|
| 10.40.41.238 | | | | | | |
|
||||||
|
| 10.40.41.239 | sw1 | 00:08:54:71:98:2D | | | | allnet core switch / dhcp-host=00:08:54:71:98:2D,10.40.41.239,sw1 |
|
||||||
|
| 10.40.41.240 | | | | | | |
|
||||||
|
| 10.40.41.241 | NukiSmartlock | 28:DB:A7:09:7B:54 | | | | |
|
||||||
|
| 10.40.41.242 | | | | | | |
|
||||||
|
| 10.40.41.243 | | | | | | |
|
||||||
|
| 10.40.41.244 | NukiBridge | 24:62:ab:b1:63:f4 | | | | dhcp-host=24:62:ab:b1:63:f4,10.40.41.244,NukiBridge |
|
||||||
|
| 10.40.41.245 | | | | | | |
|
||||||
|
|
||||||
|
## Netzwerk
|
||||||
|
|
||||||
|
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 10.40.41.246 | fritzrepeater1 | 12:72:74:9c:66:49 | | | | Arbeitszimmer / dhcp-host=12:72:74:9c:66:49,10.40.41.246,fritzrepeater1 |
|
||||||
|
| 10.40.41.247 | | | | | | |
|
||||||
|
| 10.40.41.248 | | | | | | |
|
||||||
|
| 10.40.41.249 | | | | | | |
|
||||||
|
| 10.40.41.250 | | | | | | |
|
||||||
|
| 10.40.41.251 | | | | | | |
|
||||||
|
| 10.40.41.252 | | | | | | |
|
||||||
|
| 10.40.41.253 | openwrt | | 700 | | | |
|
||||||
|
| 10.40.41.254 | gateway-bf | 0c:72:74:36:90:9c | | | | |
|
||||||
144
inventory/build.py
Normal file
144
inventory/build.py
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Kanonischer Doku-Generator für das BF-Inventar.
|
||||||
|
|
||||||
|
Wahrheit = CSV. Markdown wird daraus generiert.
|
||||||
|
- `build.py --seed` : (einmalig) bf.csv aus IPs.xlsx erzeugen (mit Transform/Deltas)
|
||||||
|
- `build.py` : bf.md aus bf.csv + bf-core-ports.md aus bf-core-ports.csv rendern
|
||||||
|
|
||||||
|
Künftige Änderungen: bf.csv editieren -> `python3 build.py` -> bf.md aktuell.
|
||||||
|
"""
|
||||||
|
import sys, os, re, csv, zipfile
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
XLSX = os.path.join(HERE, 'IPs.xlsx')
|
||||||
|
BF_CSV = os.path.join(HERE, 'bf.csv')
|
||||||
|
BF_MD = os.path.join(HERE, 'bf.md')
|
||||||
|
PORTS_CSV = os.path.join(HERE, 'bf-core-ports.csv')
|
||||||
|
PORTS_MD = os.path.join(HERE, 'bf-core-ports.md')
|
||||||
|
|
||||||
|
IPRE = re.compile(r'^\d{1,3}(\.\d{1,3}){3}$')
|
||||||
|
MACRE = re.compile(r'^[0-9A-Fa-f]{1,2}(:[0-9A-Fa-f]{1,2}){5}$')
|
||||||
|
COLS = ['section', 'ip', 'hostname', 'mac', 'pve_ct', 'server_ip', 'server_mac', 'note']
|
||||||
|
|
||||||
|
|
||||||
|
def _strip(t): return re.sub(r'\{[^}]*\}', '', t)
|
||||||
|
|
||||||
|
|
||||||
|
def read_xlsx_sheet(path, sheet):
|
||||||
|
z = zipfile.ZipFile(path)
|
||||||
|
shared = []
|
||||||
|
if 'xl/sharedStrings.xml' in z.namelist():
|
||||||
|
for si in ET.fromstring(z.read('xl/sharedStrings.xml')):
|
||||||
|
shared.append(''.join(t.text or '' for t in si.iter() if _strip(t.tag) == 't'))
|
||||||
|
wb = ET.fromstring(z.read('xl/workbook.xml'))
|
||||||
|
rels = {r.get('Id'): r.get('Target') for r in ET.fromstring(z.read('xl/_rels/workbook.xml.rels'))}
|
||||||
|
tgt = None
|
||||||
|
for s in wb.iter():
|
||||||
|
if _strip(s.tag) == 'sheet' and s.get('name') == sheet:
|
||||||
|
rid = [v for k, v in s.attrib.items() if k.endswith('}id') or k == 'id'][0]
|
||||||
|
t = rels[rid]; tgt = t if t.startswith('xl/') else 'xl/' + t
|
||||||
|
ws = ET.fromstring(z.read(tgt))
|
||||||
|
|
||||||
|
def colnum(ref):
|
||||||
|
m = re.match(r'([A-Z]+)(\d+)', ref)
|
||||||
|
if not m: return 0, 0
|
||||||
|
c = 0
|
||||||
|
for ch in m.group(1): c = c * 26 + (ord(ch) - 64)
|
||||||
|
return c, int(m.group(2))
|
||||||
|
cells = {}; maxc = 0; maxr = 0
|
||||||
|
for c in ws.iter():
|
||||||
|
if _strip(c.tag) != 'c': continue
|
||||||
|
ref = c.get('r') or ''; t = c.get('t'); col, row = colnum(ref)
|
||||||
|
if not col: continue
|
||||||
|
vs = [x for x in c if _strip(x.tag) == 'v']; iss = [x for x in c if _strip(x.tag) == 'is']
|
||||||
|
val = ''
|
||||||
|
if t == 's' and vs:
|
||||||
|
try: val = shared[int(vs[0].text)]
|
||||||
|
except Exception: val = vs[0].text or ''
|
||||||
|
elif iss: val = ''.join(x.text or '' for x in iss[0].iter() if _strip(x.tag) == 't')
|
||||||
|
elif vs: val = vs[0].text or ''
|
||||||
|
if val != '':
|
||||||
|
cells.setdefault(row, {})[col] = val; maxc = max(maxc, col); maxr = max(maxr, row)
|
||||||
|
grid = [[cells.get(r, {}).get(c, '') for c in range(1, maxc + 1)] for r in range(1, maxr + 1)]
|
||||||
|
return grid
|
||||||
|
|
||||||
|
|
||||||
|
def seed_bf_csv():
|
||||||
|
grid = read_xlsx_sheet(XLSX, 'bf')
|
||||||
|
out = []
|
||||||
|
section = ''
|
||||||
|
for r in grid[1:]: # skip header row
|
||||||
|
nz = [x for x in r if x.strip()]
|
||||||
|
if not nz:
|
||||||
|
continue
|
||||||
|
# cols: A(0) empty | B(1) ip/section | C(2) host | D(3) mac | E(4) ct | F(5) sip | G(6) smac | H(7) note | I(8) note2
|
||||||
|
def g(i): return r[i].strip() if i < len(r) else ''
|
||||||
|
ipcell = g(1)
|
||||||
|
# section header row = single non-empty cell, not an IP
|
||||||
|
if len(nz) == 1 and not IPRE.match(nz[0].strip()):
|
||||||
|
section = nz[0].strip(); continue
|
||||||
|
ip = ipcell if IPRE.match(ipcell) else ''
|
||||||
|
host = g(2); mac = g(3) if MACRE.match(g(3)) else ''
|
||||||
|
ct = g(4); sip = g(5); smac = g(6)
|
||||||
|
notes = [g(7), g(8)]
|
||||||
|
# defensive: misplaced data -> note
|
||||||
|
if g(3) and not MACRE.match(g(3)): notes.append('mac?=' + g(3))
|
||||||
|
if ct and not ct.isdigit(): notes.append(ct); ct = ''
|
||||||
|
if sip and not IPRE.match(sip): notes.append(sip); sip = ''
|
||||||
|
if smac and not MACRE.match(smac): notes.append(smac); smac = ''
|
||||||
|
note = ' / '.join(n for n in notes if n.strip())
|
||||||
|
# --- deltas (User 2026-06-05) ---
|
||||||
|
if host == 'VPNjoernfuenfstueck':
|
||||||
|
continue # gekickt
|
||||||
|
if host == 'VPNchristoph':
|
||||||
|
note = 'Fallback bis CF One überall läuft; IP umziehbar/unwichtig'
|
||||||
|
out.append([section, ip, host, mac, ct, sip, smac, note])
|
||||||
|
with open(BF_CSV, 'w', newline='') as f:
|
||||||
|
w = csv.writer(f); w.writerow(COLS); w.writerows(out)
|
||||||
|
print(f'seed: wrote {BF_CSV} ({len(out)} rows)')
|
||||||
|
|
||||||
|
|
||||||
|
def render_bf_md():
|
||||||
|
with open(BF_CSV) as f:
|
||||||
|
rows = list(csv.DictReader(f))
|
||||||
|
lines = ['# Inventar — Standort BF (kanonisch)', '',
|
||||||
|
'> Generiert aus `bf.csv` via `build.py`. **Quelle der Wahrheit = bf.csv.** Seed: `IPs.xlsx`.',
|
||||||
|
'> ⚠️ Manche `pve_ct`/Einträge können Doku-Leichen sein (z.B. re-dockerisierte Container).', '']
|
||||||
|
cur = None
|
||||||
|
cols = ['ip', 'hostname', 'mac', 'pve_ct', 'server_ip', 'server_mac', 'note']
|
||||||
|
for row in rows:
|
||||||
|
if row['section'] != cur:
|
||||||
|
cur = row['section']
|
||||||
|
lines += ['', f'## {cur or "(ohne Sektion)"}', '',
|
||||||
|
'| ' + ' | '.join(cols) + ' |', '|' + '|'.join(['---'] * len(cols)) + '|']
|
||||||
|
if not any(row[c].strip() for c in cols):
|
||||||
|
continue
|
||||||
|
lines.append('| ' + ' | '.join(row[c].replace('|', '\\|') for c in cols) + ' |')
|
||||||
|
with open(BF_MD, 'w') as f:
|
||||||
|
f.write('\n'.join(lines) + '\n')
|
||||||
|
print(f'wrote {BF_MD} ({len(rows)} rows)')
|
||||||
|
|
||||||
|
|
||||||
|
def render_ports_md():
|
||||||
|
if not os.path.exists(PORTS_CSV):
|
||||||
|
return
|
||||||
|
with open(PORTS_CSV) as f:
|
||||||
|
rows = list(csv.DictReader(f))
|
||||||
|
cols = list(rows[0].keys()) if rows else []
|
||||||
|
lines = ['# Core-Switch ALL-SG8316M (sw1, 10.40.41.239) — Port-Map', '',
|
||||||
|
'> Ist-Belegung. Ports 4/8/15/16 **behalten** (4+8 interim bis neue Switches produktiv).',
|
||||||
|
'> Übrige Ports (1–3, 5–7, 9–14): noch nicht erfasst — gemeinsam ergänzen.', '',
|
||||||
|
'| ' + ' | '.join(cols) + ' |', '|' + '|'.join(['---'] * len(cols)) + '|']
|
||||||
|
for r in rows:
|
||||||
|
lines.append('| ' + ' | '.join((r[c] or '').replace('|', '\\|') for c in cols) + ' |')
|
||||||
|
with open(PORTS_MD, 'w') as f:
|
||||||
|
f.write('\n'.join(lines) + '\n')
|
||||||
|
print(f'wrote {PORTS_MD} ({len(rows)} ports)')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
if '--seed' in sys.argv or not os.path.exists(BF_CSV):
|
||||||
|
seed_bf_csv()
|
||||||
|
render_bf_md()
|
||||||
|
render_ports_md()
|
||||||
37
omada/docker-compose.yml
Normal file
37
omada/docker-compose.yml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Omada Software Controller — BF
|
||||||
|
# Ziel-Host: pve docker-LXC (10.40.41.126), Engine 28.x
|
||||||
|
# Image: mbentley/omada-controller (De-facto-Standard; TP-Link liefert kein offizielles Image)
|
||||||
|
#
|
||||||
|
# ES208G/ES216G = Omada "Easy Managed" → SDN-adoptierbar (verifiziert 2026-06).
|
||||||
|
# ABER: ES-Serie braucht Controller >= 6.1.x (SDN-Support kam erst mit 6.1.x-FW)
|
||||||
|
# + aktuelle Switch-Firmware. Tier "Easy Managed" = nur Basis-VLAN/QoS im Controller.
|
||||||
|
#
|
||||||
|
# network_mode: host = nötig für L2-Auto-Discovery der Switches (29810/udp Broadcast).
|
||||||
|
# Controller nutzt dann direkt die LXC-IP 10.40.41.126.
|
||||||
|
#
|
||||||
|
# Deploy:
|
||||||
|
# mkdir -p /opt/docker/omada/{data,logs}
|
||||||
|
# docker compose up -d
|
||||||
|
# UI: https://10.40.41.126:8043 (Erst-Setup-Wizard)
|
||||||
|
|
||||||
|
services:
|
||||||
|
omada-controller:
|
||||||
|
image: mbentley/omada-controller:6.1
|
||||||
|
# ^ >=6.1.x ist Pflicht für ES-Serie (5.x adoptiert sie NICHT).
|
||||||
|
# Tag-Existenz kurz prüfen: docker pull mbentley/omada-controller:6.1
|
||||||
|
# (sonst exakten 6.1.x-Tag von hub.docker.com/r/mbentley/omada-controller nehmen)
|
||||||
|
container_name: omada-controller
|
||||||
|
restart: unless-stopped
|
||||||
|
network_mode: host
|
||||||
|
environment:
|
||||||
|
- TZ=Europe/Vienna
|
||||||
|
- MANAGE_HTTP_PORT=8088
|
||||||
|
- MANAGE_HTTPS_PORT=8043
|
||||||
|
- PORTAL_HTTP_PORT=8088
|
||||||
|
- PORTAL_HTTPS_PORT=8843
|
||||||
|
- SHOW_SERVER_LOGS=true
|
||||||
|
- SHOW_MONGODB_LOGS=false
|
||||||
|
# - SMALL_FILES=true # nur falls MongoDB beim Start auf dem FS zickt
|
||||||
|
volumes:
|
||||||
|
- /opt/docker/omada/data:/opt/tplink/EAPController/data
|
||||||
|
- /opt/docker/omada/logs:/opt/tplink/EAPController/logs
|
||||||
5
switch/.gitignore
vendored
Normal file
5
switch/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
.secrets
|
||||||
|
cookies.txt
|
||||||
|
state-*/
|
||||||
|
firmware/
|
||||||
|
cli/running-*.txt
|
||||||
4
switch/.secrets.example
Normal file
4
switch/.secrets.example
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# copy to .secrets (gitignored). Account = Web/Telnet login on the switch.
|
||||||
|
export SW_HOST=10.40.41.239
|
||||||
|
export SW_USER=claudecode
|
||||||
|
export SW_PASS=changeme
|
||||||
8
switch/cli/01-vlan-db.cli
Normal file
8
switch/cli/01-vlan-db.cli
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# === BF Core-Switch sw1 (ALL-SG8316M, FW 2.2.1) — VLAN-Datenbank ===
|
||||||
|
# Reproduzierbar: . switch/.secrets && expect switch/cli/run-cli.exp switch/cli/01-vlan-db.cli
|
||||||
|
# NON-DISRUPTIV: legt nur VLANs an; ändert KEINE Port-Zugehörigkeit (alle Ports bleiben default VLAN1).
|
||||||
|
# VID-Plan: 10=Server/Main 20=Docker 30=IoT 40=Guest 100=WAN
|
||||||
|
configure
|
||||||
|
vlan 10,20,30,40,100
|
||||||
|
end
|
||||||
|
save
|
||||||
47
switch/cli/CLI-REFERENCE.md
Normal file
47
switch/cli/CLI-REFERENCE.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# ALL-SG8316M FW 2.2.1.2956 — CLI-Referenz (Telnet)
|
||||||
|
|
||||||
|
Switch `sw1` @ 10.40.41.239. **Kein SSH** → Telnet (Port 23). IOS-artige CLI. Login: `claudecode` (Creds in `switch/.secrets`).
|
||||||
|
Prompt-Ebenen: `sw1>` (user) → `sw1#` (enable) → `sw1(config)#` (config). `configure` rein, `end`/`exit` raus.
|
||||||
|
|
||||||
|
> ⚠️ **Nur EINE VTY-Line!** Der Switch reapt halb-offene Sessions schlecht (stale Session sperrt ~15 min).
|
||||||
|
> → Immer **serialisiert** arbeiten und **sauber ausloggen** (`exit` bis zur Verbindungstrennung). Bei „busy" **nicht hämmern**, paar Minuten warten.
|
||||||
|
|
||||||
|
Tooling (macOS): `telnet` (/opt/homebrew/bin) + `expect`. Python 3.14 hat KEIN telnetlib. Runner: `switch/cli/run-cli.exp <file.cli>`.
|
||||||
|
|
||||||
|
## Management-IP
|
||||||
|
- **Ansehen** (enable): `show ip` → IP / Subnet Netmask / Default Gateway.
|
||||||
|
- `show ip ?`: `dhcp dns http https igmp` (+ `<cr>` = Summary).
|
||||||
|
- **Statisch setzen** (config):
|
||||||
|
```
|
||||||
|
ip address <A.B.C.D>
|
||||||
|
ip default-gateway <A.B.C.D>
|
||||||
|
```
|
||||||
|
- ⚠️ **Netzmasken-Syntax noch zu bestätigen**: `ip address ?` zeigte nur `A.B.C.D`. Vor dem Commit
|
||||||
|
`ip address <ip> ?` prüfen ODER `show running-config` ansehen (wie die bestehende Zeile geschrieben ist) und spiegeln.
|
||||||
|
- DHCP statt statisch: `ip dhcp`.
|
||||||
|
- **NICHT vorhanden:** `interface vlan`, `show ip interface`, `show management`, `terminal datadump`.
|
||||||
|
|
||||||
|
## Management-VLAN
|
||||||
|
- **Setzen** (config): `management-vlan vlan <1-4094>` (`management` = Abk.)
|
||||||
|
- **Ansehen** (enable): `show management-vlan` → aktuell `default(1)`.
|
||||||
|
- Reihenfolge-Warnung: Ziel-VLAN muss existieren UND der Mgmt-Port muss es tragen, sonst Reachability weg.
|
||||||
|
|
||||||
|
## VLANs
|
||||||
|
- **Anlegen** (config): `vlan <liste>` z.B. `vlan 10,20,30,40,100` (Range 1–4094, `3,6-8` möglich).
|
||||||
|
- **Ansehen** (enable): `show vlan`.
|
||||||
|
- **Namen:** Syntax noch zu erkunden (config-vlan `name`? `vlan <id>` einzeln?) — beim nächsten Lauf via `?` prüfen.
|
||||||
|
|
||||||
|
## Ports (gi1-16, lag1-8) — Trunk/Access (für Cutover)
|
||||||
|
```
|
||||||
|
interface gi<n> (oder: interface range ...)
|
||||||
|
switchport mode {access|hybrid|trunk}
|
||||||
|
switchport access vlan <id>
|
||||||
|
switchport trunk native vlan <id>
|
||||||
|
switchport trunk allowed vlan ... (genaue add/remove-Syntax via `switchport trunk allowed ?` prüfen)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Speichern / Diverses
|
||||||
|
- **Persistieren:** `save` (enable) → „Success". (Sonst nach Reboot weg!)
|
||||||
|
- **Config-Dump:** `show running-config` / `show startup-config` (Paging `--More--` → Space).
|
||||||
|
- **Version:** `show version` → `Firmware Version : 2.2.1.2956`.
|
||||||
|
- Andere: `reboot`, `restore-defaults`, `copy`, `clock`, `ping`, `ssl`, `clear`, `disable`, `terminal`.
|
||||||
33
switch/cli/run-cli.exp
Normal file
33
switch/cli/run-cli.exp
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/expect -f
|
||||||
|
# Generischer Telnet-CLI-Runner für sw1 (ALL-SG8316M, FW 2.2.1, IOS-artige CLI).
|
||||||
|
# Nutzung: . switch/.secrets && expect switch/cli/run-cli.exp switch/cli/<datei>.cli
|
||||||
|
# Liest die .cli-Datei zeilenweise, loggt ein, sendet jeden Befehl, flaggt Fehler.
|
||||||
|
# Zeilen mit führendem '#' = Kommentar (übersprungen). Am Ende: show vlan zur Kontrolle.
|
||||||
|
set timeout 20
|
||||||
|
set user $env(SW_USER)
|
||||||
|
set pass $env(SW_PASS)
|
||||||
|
set host $env(SW_HOST)
|
||||||
|
if {[llength $argv] < 1} { puts "usage: run-cli.exp <file.cli>"; exit 1 }
|
||||||
|
set fh [open [lindex $argv 0] r]
|
||||||
|
log_user 1
|
||||||
|
spawn telnet $host
|
||||||
|
expect "Username:"; send "$user\r"
|
||||||
|
expect "Password:"; send "$pass\r"
|
||||||
|
expect -re {sw1[#>]}
|
||||||
|
while {[gets $fh line] >= 0} {
|
||||||
|
set line [string trim $line]
|
||||||
|
if {$line eq "" || [string match "#*" $line]} { continue }
|
||||||
|
send "$line\r"
|
||||||
|
expect {
|
||||||
|
"Incomplete command" { puts "\n>>> FEHLER (incomplete): $line" }
|
||||||
|
"Unknown command" { puts "\n>>> FEHLER (unknown): $line" }
|
||||||
|
-re {sw1\([^)]*\)[#>] ?$} {}
|
||||||
|
-re {sw1[#>] ?$} {}
|
||||||
|
timeout { puts "\n>>> TIMEOUT bei: $line" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close $fh
|
||||||
|
send "show vlan\r"
|
||||||
|
expect -re {sw1[#>]}
|
||||||
|
send "exit\r"
|
||||||
|
expect eof
|
||||||
41
switch/recovery/README.md
Normal file
41
switch/recovery/README.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Mac-mini Recovery-Anker für den Switch-Flash
|
||||||
|
|
||||||
|
**Zweck:** Der Mac mini (10.40.41.167, en0, L2-benachbart zum Switch) trägt dauerhaft eine
|
||||||
|
**Zweit-IP 192.168.1.2/24**. Nach einem Firmware-Flash kommt der Switch auf `192.168.1.1` hoch
|
||||||
|
(Werks-Default) — über die Zweit-IP erreicht Claude ihn **vom Mac mini aus** und setzt ihn
|
||||||
|
automatisch auf `10.40.41.239` zurück. Kein manuelles IP-Suchen, kein Laptop nötig.
|
||||||
|
|
||||||
|
## Variante A — nur für heute (transient, kein Reboot dazwischen)
|
||||||
|
Auf dem Mac mini (deine SSH-Session):
|
||||||
|
```
|
||||||
|
sudo ifconfig en0 alias 192.168.1.2 255.255.255.0
|
||||||
|
ifconfig en0 | grep 192.168.1 # prüfen
|
||||||
|
```
|
||||||
|
Entfernen: `sudo ifconfig en0 -alias 192.168.1.2`
|
||||||
|
|
||||||
|
## Variante B — persistent (übersteht Reboots, empfohlen wenn Dauer-Anker)
|
||||||
|
Auf dem Mac mini, aus diesem Repo-Ordner (`switch/recovery/`):
|
||||||
|
```
|
||||||
|
sudo cp switch-recovery-ip.sh /usr/local/sbin/switch-recovery-ip.sh
|
||||||
|
sudo chmod 755 /usr/local/sbin/switch-recovery-ip.sh
|
||||||
|
sudo cp com.bf.switchrecoveryip.plist /Library/LaunchDaemons/
|
||||||
|
sudo chown root:wheel /Library/LaunchDaemons/com.bf.switchrecoveryip.plist
|
||||||
|
sudo launchctl load -w /Library/LaunchDaemons/com.bf.switchrecoveryip.plist
|
||||||
|
ifconfig en0 | grep 192.168.1 # prüfen
|
||||||
|
```
|
||||||
|
Deinstallieren:
|
||||||
|
```
|
||||||
|
sudo launchctl unload -w /Library/LaunchDaemons/com.bf.switchrecoveryip.plist
|
||||||
|
sudo rm /Library/LaunchDaemons/com.bf.switchrecoveryip.plist /usr/local/sbin/switch-recovery-ip.sh
|
||||||
|
sudo ifconfig en0 -alias 192.168.1.2
|
||||||
|
```
|
||||||
|
|
||||||
|
## Recovery-Ablauf nach Flash (Claude führt aus, vom Mac mini)
|
||||||
|
```
|
||||||
|
ssh 10.40.41.167
|
||||||
|
cd ~/.../bf-network-r6/switch # Repo muss auf dem Mac mini liegen ODER Claude tunnelt
|
||||||
|
SW_HOST=192.168.1.1 SW_USER=admin SW_PASS=admin ./sg8316m.sh set-ip 10.40.41.239
|
||||||
|
# Switch nun wieder auf .239 → .secrets zurück, dann VLANs/Ports/save
|
||||||
|
```
|
||||||
|
> Hinweis: Claude erreicht den Switch nach Flash **nur** über den Mac mini (.1.1 ist L2-lokal am Mac mini).
|
||||||
|
> Der Treiber `sg8316m.sh` muss daher vom Mac mini aus laufen (Repo dorthin klonen/kopieren oder via SSH ausführen).
|
||||||
16
switch/recovery/com.bf.switchrecoveryip.plist
Normal file
16
switch/recovery/com.bf.switchrecoveryip.plist
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>Label</key>
|
||||||
|
<string>com.bf.switchrecoveryip</string>
|
||||||
|
<key>ProgramArguments</key>
|
||||||
|
<array>
|
||||||
|
<string>/usr/local/sbin/switch-recovery-ip.sh</string>
|
||||||
|
</array>
|
||||||
|
<key>RunAtLoad</key>
|
||||||
|
<true/>
|
||||||
|
<key>StandardErrorPath</key>
|
||||||
|
<string>/var/log/switch-recovery-ip.log</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
136
switch/recovery/flash-and-recover.sh
Normal file
136
switch/recovery/flash-and-recover.sh
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Autonome Flash- + Recovery-Orchestrierung für ALL-SG8316M.
|
||||||
|
# LÄUFT AUF DEM MAC MINI (10.40.41.167, en0, L2-lokal zum Switch).
|
||||||
|
# Zweck: Claude stößt es detached an und ist während des Switch-Reboots OFFLINE.
|
||||||
|
# Das Script zieht die ganze Kette autonom durch und loggt alles.
|
||||||
|
#
|
||||||
|
# Kette: pre-flight -> flash -> warte down -> warte up(.1.1|.239)
|
||||||
|
# -> (falls .1.1) IP zurück auf .239 [cmd dynamisch entdeckt]
|
||||||
|
# -> VLANs (best-effort) -> save-to-flash -> verify
|
||||||
|
#
|
||||||
|
# Aufruf: ./flash-and-recover.sh preflight # nur Checks, kein Flash
|
||||||
|
# ./flash-and-recover.sh run # echter Flash + Recovery
|
||||||
|
set -u
|
||||||
|
|
||||||
|
SW_PROD=10.40.41.239
|
||||||
|
SW_DEFAULT=192.168.1.1
|
||||||
|
PROD_MASK=255.255.255.0
|
||||||
|
PROD_GW=10.40.41.254
|
||||||
|
ALIAS_IP=192.168.1.2
|
||||||
|
VLANS=10,20,30,40,100
|
||||||
|
IMG="${IMG:-$HOME/bf-switch-flash/all-sg8316m-version_2.2.1_vmlinux.bix}"
|
||||||
|
IMG_SHA=e3f160983e8b17962dc70a52360b7f560c92da8197928d702f5266027a0fc7fc
|
||||||
|
LOG="${LOG:-$HOME/bf-switch-flash/flash-$(date +%Y%m%d-%H%M%S).log}"
|
||||||
|
MODE="${1:-preflight}"
|
||||||
|
|
||||||
|
mkdir -p "$(dirname "$LOG")"
|
||||||
|
log(){ printf '%s %s\n' "$(date '+%H:%M:%S')" "$*" | tee -a "$LOG"; }
|
||||||
|
|
||||||
|
# Liveness: Webserver-Root antwortet (firmware-stabiler als ein bestimmter cmd)
|
||||||
|
http_code(){ curl -s -o /dev/null -w '%{http_code}' --max-time 5 "http://$1/" 2>/dev/null; }
|
||||||
|
up(){ [ "$(http_code "$1")" = "200" ]; }
|
||||||
|
fw_version(){ curl -s --max-time 6 "http://$1/cgi-bin/dispatcher.cgi?cmd=512" \
|
||||||
|
| sed -e 's/<[^>]*>/ /g' | grep -oiE 'Firmware Version[^0-9]*[0-9.]+' | head -1; }
|
||||||
|
|
||||||
|
wait_up(){ _e=$(( $(date +%s) + $2 )); while [ "$(date +%s)" -lt "$_e" ]; do up "$1" && return 0; sleep 4; done; return 1; }
|
||||||
|
wait_down(){ _e=$(( $(date +%s) + $2 )); while [ "$(date +%s)" -lt "$_e" ]; do up "$1" || return 0; sleep 4; done; return 1; }
|
||||||
|
|
||||||
|
# IP zurücksetzen — cmd + Seite dynamisch aus der Live-UI entdecken (firmware-drift-sicher)
|
||||||
|
restore_ip(){
|
||||||
|
_host=$1
|
||||||
|
_menu=$(curl -s --max-time 8 "http://$_host/cgi-bin/dispatcher.cgi?cmd=2")
|
||||||
|
_ipcmd=$(printf '%s' "$_menu" | grep -i 'IP Address' | grep -oE 'cmd=[0-9]+' | head -1 | cut -d= -f2)
|
||||||
|
[ -z "$_ipcmd" ] && _ipcmd=517
|
||||||
|
_form=$(curl -s --max-time 8 "http://$_host/cgi-bin/dispatcher.cgi?cmd=$_ipcmd")
|
||||||
|
_post=$(printf '%s' "$_form" | grep -i 'name="cmd"' | grep -oE 'value="[0-9]+"' | head -1 | grep -oE '[0-9]+')
|
||||||
|
[ -z "$_post" ] && _post=518
|
||||||
|
log "restore_ip: ip-page=$_ipcmd post-cmd=$_post -> set $SW_PROD"
|
||||||
|
curl -s --max-time 10 -X POST "http://$_host/cgi-bin/dispatcher.cgi" \
|
||||||
|
--data "mode=0" --data "ip=$SW_PROD" --data "netmask=$PROD_MASK" \
|
||||||
|
--data "gateway=$PROD_GW" --data "cmd=$_post" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
add_vlans(){ curl -s --max-time 10 -X POST "http://$1/cgi-bin/dispatcher.cgi" \
|
||||||
|
--data "vlanlist=$VLANS" --data "vlanAction=0" --data "name=" --data "cmd=1284" >/dev/null 2>&1; }
|
||||||
|
save_flash(){ curl -s --max-time 15 "http://$1/cgi-bin/dispatcher.cgi?cmd=4358" >/dev/null 2>&1; }
|
||||||
|
|
||||||
|
# ---------- PRE-FLIGHT ----------
|
||||||
|
log "=== PRE-FLIGHT (mode=$MODE) ==="
|
||||||
|
fail=0
|
||||||
|
if [ -f "$IMG" ]; then
|
||||||
|
h=$(shasum -a 256 "$IMG" 2>/dev/null | awk '{print $1}')
|
||||||
|
if [ "$h" = "$IMG_SHA" ]; then log "OK image sha256"; else log "FAIL image sha256: $h"; fail=1; fi
|
||||||
|
else log "FAIL image missing: $IMG"; fail=1; fi
|
||||||
|
if ifconfig en0 2>/dev/null | grep -q "$ALIAS_IP"; then log "OK recovery-alias $ALIAS_IP on en0";
|
||||||
|
else log "FAIL alias $ALIAS_IP missing -> sudo ifconfig en0 alias $ALIAS_IP 255.255.255.0"; fail=1; fi
|
||||||
|
if up "$SW_PROD"; then log "OK switch up at $SW_PROD (FW: $(fw_version "$SW_PROD"))";
|
||||||
|
else log "FAIL switch not reachable at $SW_PROD"; fail=1; fi
|
||||||
|
if [ "$fail" -ne 0 ]; then log "PRE-FLIGHT FAILED -> abort"; exit 2; fi
|
||||||
|
log "PRE-FLIGHT OK"
|
||||||
|
[ "$MODE" = "preflight" ] && { log "preflight-only -> done (kein Flash)"; exit 0; }
|
||||||
|
|
||||||
|
# ---------- FLASH ----------
|
||||||
|
MARKER="$HOME/bf-switch-flash/.flashed-2.2.1"
|
||||||
|
if [ -f "$MARKER" ] && up "$SW_PROD"; then
|
||||||
|
log "Marker vorhanden + Switch up @ $SW_PROD -> Flash übersprungen (nur reconfig)"; skip=1
|
||||||
|
else skip=0; fi
|
||||||
|
if [ "$skip" -eq 0 ]; then
|
||||||
|
log "=== FLASH: lade Image hoch ($IMG) ==="
|
||||||
|
curl -s --max-time 200 -F "type=0" -F "http_file=@$IMG" -F "cmd=4364" \
|
||||||
|
"http://$SW_PROD/cgi-bin/httpupload.cgi" >>"$LOG" 2>&1
|
||||||
|
log "Upload abgeschlossen, warte auf Reboot (down)..."
|
||||||
|
# Der Reboot selbst ist das verlässliche Flash-Signal (Flash erzwingt Neustart).
|
||||||
|
if wait_down "$SW_PROD" 180; then
|
||||||
|
log "Switch down (Reboot) — Flash hat gegriffen"
|
||||||
|
else
|
||||||
|
log "FAIL kein Reboot binnen 180s — Flash vermutlich nicht angenommen (Upload/Format/Auth?)."
|
||||||
|
log " Switch unverändert @ $SW_PROD, Netz intakt, KEIN Reset. Abbruch."
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ---------- WARTEN AUF WIEDERKEHR ----------
|
||||||
|
log "=== RECOVERY: warte auf Switch (max 6 min, .1.1 ODER .239) ==="
|
||||||
|
target=""; _e=$(( $(date +%s) + 360 ))
|
||||||
|
while [ "$(date +%s)" -lt "$_e" ]; do
|
||||||
|
if up "$SW_DEFAULT"; then target=$SW_DEFAULT; break; fi
|
||||||
|
if up "$SW_PROD"; then target=$SW_PROD; break; fi
|
||||||
|
sleep 4
|
||||||
|
done
|
||||||
|
if [ -z "$target" ]; then
|
||||||
|
log "FAIL Switch kam binnen 6min nicht auf $SW_DEFAULT noch $SW_PROD zurück."
|
||||||
|
log " -> MANUELLE Recovery nötig (Reset-Knopf 10s, dann erneut)."
|
||||||
|
exit 4
|
||||||
|
fi
|
||||||
|
log "Switch zurück an $target"
|
||||||
|
|
||||||
|
# ---------- IP WIEDERHERSTELLEN ----------
|
||||||
|
if [ "$target" = "$SW_DEFAULT" ]; then
|
||||||
|
log "Switch auf Default $SW_DEFAULT -> stelle $SW_PROD wieder her"
|
||||||
|
restore_ip "$SW_DEFAULT"
|
||||||
|
if wait_up "$SW_PROD" 60; then
|
||||||
|
log "OK Switch wieder auf $SW_PROD"
|
||||||
|
else
|
||||||
|
log "FAIL set-ip griff nicht — FW 2.2.1 erzwingt vermutlich Login (FW1.0 war offen)."
|
||||||
|
log " LAN/Internet laufen TROTZDEM (L2-Forwarding). Nur die Mgmt-IP hängt auf $SW_DEFAULT."
|
||||||
|
log " MANUELL: Browser http://$SW_DEFAULT Login admin/admin -> Network/IP Address"
|
||||||
|
log " -> $SW_PROD Maske $PROD_MASK GW $PROD_GW -> Save to Flash."
|
||||||
|
exit 5
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "Switch hat $SW_PROD behalten (Firmware bewahrte IP)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ---------- RECONFIG (best-effort, unkritisch — online nachholbar) ----------
|
||||||
|
log "=== reconfig (best-effort) ==="
|
||||||
|
if add_vlans "$SW_PROD"; then log "VLANs $VLANS abgeschickt"; else log "WARN VLAN-Add fehlgeschlagen (online nachholen)"; fi
|
||||||
|
if save_flash "$SW_PROD"; then log "save-to-flash abgeschickt"; else log "WARN save fehlgeschlagen (online nachholen!)"; fi
|
||||||
|
|
||||||
|
# ---------- VERIFY ----------
|
||||||
|
if up "$SW_PROD"; then
|
||||||
|
touch "$HOME/bf-switch-flash/.flashed-2.2.1"
|
||||||
|
log "=== SUCCESS: Switch up @ $SW_PROD (Marker gesetzt) ==="
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
log "=== WARN: Switch am Ende nicht bestätigt up ==="
|
||||||
|
exit 6
|
||||||
|
fi
|
||||||
15
switch/recovery/switch-recovery-ip.sh
Normal file
15
switch/recovery/switch-recovery-ip.sh
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Recovery-Anker: Zweit-IP 192.168.1.2/24 auf en0, damit der Mac mini den
|
||||||
|
# ALL-SG8316M nach einem Firmware-Flash (Reset auf 192.168.1.1) erreichen kann.
|
||||||
|
# Wird per LaunchDaemon bei jedem Boot ausgeführt (retry bis en0 da ist).
|
||||||
|
IFACE=en0
|
||||||
|
IP=192.168.1.2
|
||||||
|
MASK=255.255.255.0
|
||||||
|
i=0
|
||||||
|
while [ "$i" -lt 10 ]; do
|
||||||
|
if ifconfig "$IFACE" >/dev/null 2>&1; then
|
||||||
|
ifconfig "$IFACE" alias "$IP" "$MASK" 2>/dev/null && exit 0
|
||||||
|
fi
|
||||||
|
i=$((i+1)); sleep 3
|
||||||
|
done
|
||||||
|
exit 1
|
||||||
61
switch/sg8316m-cgi-map.md
Normal file
61
switch/sg8316m-cgi-map.md
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# ALL-SG8316M — dispatcher.cgi API-Map (Recon 2026-06-05)
|
||||||
|
|
||||||
|
> ⚠️ **VERALTET — nur FW 1.0.** Switch ist auf **FW 2.2.1** geflasht; die Web-UI/cmd-Codes hier gelten
|
||||||
|
> NICHT mehr (cmd=2 → 404). Konfiguration jetzt via **Telnet-CLI** → `switch/cli/` (run-cli.exp + .cli).
|
||||||
|
> Dieses Dokument bleibt nur als Historie.
|
||||||
|
|
||||||
|
Switch: **10.40.41.239** · Web-UI: Realtek **`/cgi-bin/dispatcher.cgi?cmd=<N>`** · `Server: Hydra/0.1.8` (FW-Basis 2014).
|
||||||
|
Reine **CGI/Form-POST**-UI (kein JS-SPA) → **vollständig per `curl` skriptbar**. Von diesem Mac direkt erreichbar (~7 ms),
|
||||||
|
ebenso vom Mac mini (10.40.41.167). **Kein SSH** am Switch; **Telnet** existiert als Option (cmd=534), aber curl ist sauberer.
|
||||||
|
|
||||||
|
> ⚠️ Auth-Hinweis: Unauthentifizierte GETs liefern bereits Config-Seiten (bekannte Schwäche dieser Realtek-dispatcher.cgi-Boxen).
|
||||||
|
> Login-Mechanik vor Schreibzugriff verifizieren. **Konsequenz fürs Design:** Mgmt strikt auf vlan10/restricted halten,
|
||||||
|
> EOL-Gerät (2014) nie Richtung WAN exponieren.
|
||||||
|
|
||||||
|
## Befehlscodes (aus Menü cmd=2 extrahiert)
|
||||||
|
|
||||||
|
### 🎯 Für R6-Config gebraucht
|
||||||
|
| cmd | Seite | Zweck |
|
||||||
|
|---|---|---|
|
||||||
|
| **1282** | Create VLAN | VLANs 10/20/30/40/100 anlegen |
|
||||||
|
| **1289** | Interface Settings | Port-Modus (Access/Trunk/Hybrid) + PVID |
|
||||||
|
| **1291** | Port to VLAN | VLAN↔Port-Matrix |
|
||||||
|
| **1293** | Port VLAN Membership | tagged/untagged je Port |
|
||||||
|
| **1297** | Management VLAN | Mgmt-VLAN 1→10 (Cutover) |
|
||||||
|
| **517** | IP Address | Switch-Mgmt-IP (Ziel 10.40.41.2) |
|
||||||
|
| **524** | Account Manager | eigenen User anlegen |
|
||||||
|
| **534/537/539** | Telnet/HTTP/HTTPS | Zugangsdienste |
|
||||||
|
|
||||||
|
### 🔧 Maintenance
|
||||||
|
| cmd | Seite |
|
||||||
|
|---|---|
|
||||||
|
| 4361 | Backup Manager (User: Export defekt → wir scrapen stattdessen, s.u.) |
|
||||||
|
| 4363 | Upgrade Manager (**Firmware**) |
|
||||||
|
| 4358 | Configuration Manager / Save-to-Flash |
|
||||||
|
| 524 | Account Manager |
|
||||||
|
|
||||||
|
### ⛔ NICHT aufrufen (destruktiv/disruptiv)
|
||||||
|
| cmd | Wirkung |
|
||||||
|
|---|---|
|
||||||
|
| 4352 | **Reboot** |
|
||||||
|
| 4354 | **Factory Default / Restore Defaults** |
|
||||||
|
| 4358 | Save to FLASH — nur bewusst am Ende eines Config-Laufs |
|
||||||
|
|
||||||
|
### Weitere (Referenz)
|
||||||
|
Status 512(SysInfo) 3848(Log) · Port 779/774/1031/4619/1814 · Net 517/519/1297 · Time 541/543 ·
|
||||||
|
Switching 768(Port) 2048(Mirror) · LAG 1024/1026/1032/1034/1036 · VoiceVLAN 1536/1538/1543 3328(EEE) ·
|
||||||
|
Multicast 1792 · IGMP 1802/1806/1797/1796/1808 3072(Jumbo) · STP 4096/4098/4100/4102/4108 ·
|
||||||
|
MAC 2311/2309/2304 · Security: Storm 3586/3584 772(Protected) DoS 4864/4866 · Access 534/537/539 ·
|
||||||
|
QoS 2560/2562/2564/2566/2568/2570 Basic 2572/2574 RateLimit 3588/3590/3592 ·
|
||||||
|
LLDP 4608/4610/4617/4614/4621 · SNMP 2816/2818/2821 · Diag 5120/527/530 · Logging 3840/3842/3844 ·
|
||||||
|
Maint 4361/4363/4358/524 4354/4352.
|
||||||
|
|
||||||
|
## „Backup" trotz defektem Export
|
||||||
|
User: Config-Import/Export der FW ist kaputt. **Kein Blocker:** Wir GETten jede Config-Seite per curl in Textdateien
|
||||||
|
(`switch/state-PRE/*.html`) → **git-versionierter, menschenlesbarer Ist-Zustand** statt opaker Binär-Blob. Restore =
|
||||||
|
gezielte CGI-POSTs (nicht Blob-Reupload). Damit ist der Vorgang reproduzierbar + diff-bar.
|
||||||
|
|
||||||
|
## Skript-Plan (statt MCP)
|
||||||
|
`switch/sg8316m.sh` (bash+curl) oder `.py` (requests): login→Session-Cookie → State-Scrape (PRE) →
|
||||||
|
VLANs anlegen (1282) → Interface/Membership (1289/1293) → optional Mgmt-VLAN/IP (1297/517) → Save (4358).
|
||||||
|
Idempotent, dry-run-fähig, im Repo versioniert. Läuft von hier oder vom Mac mini.
|
||||||
72
switch/sg8316m.sh
Executable file
72
switch/sg8316m.sh
Executable file
@@ -0,0 +1,72 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# ⚠️ VERALTET — nur FW 1.0. Switch ist auf FW 2.2.1 geflasht; die dispatcher.cgi-cmd-Codes
|
||||||
|
# unten gelten dort NICHT mehr. Konfig jetzt via Telnet-CLI: switch/cli/ (run-cli.exp + .cli).
|
||||||
|
# Bleibt nur als Historie / für den (unwahrscheinlichen) FW-1.0-Rollback.
|
||||||
|
# ALL-SG8316M (Realtek dispatcher.cgi) driver — curl-based, no MCP needed.
|
||||||
|
# Read ops are safe. WRITE ops change config; SAVE persists to flash.
|
||||||
|
# Creds via ./.secrets (gitignored): SW_HOST, SW_USER, SW_PASS.
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
HERE="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
[ -f "$HERE/.secrets" ] && . "$HERE/.secrets"
|
||||||
|
HOST="${SW_HOST:-10.40.41.239}"
|
||||||
|
BASE="http://$HOST/cgi-bin/dispatcher.cgi"
|
||||||
|
CURL=(curl -sS --max-time 12)
|
||||||
|
|
||||||
|
# --- read ---
|
||||||
|
get() { "${CURL[@]}" "$BASE?cmd=$1"; }
|
||||||
|
|
||||||
|
# Curated config-view + AJAX-data cmd codes (see sg8316m-cgi-map.md)
|
||||||
|
SCRAPE_CMDS="512 517 519 1297 541 543 768 779 1024 1026 1031 \
|
||||||
|
1282 1283 1289 1291 1293 534 537 539 524 \
|
||||||
|
4096 4098 4100 2560 2562 2564 2572 2574 2816 2818 2821 3840 3842 3844"
|
||||||
|
|
||||||
|
scrape() {
|
||||||
|
local out="$HERE/${1:-state-PRE}"; mkdir -p "$out"
|
||||||
|
echo "Scraping $HOST -> $out"
|
||||||
|
for c in $SCRAPE_CMDS; do
|
||||||
|
if "${CURL[@]}" "$BASE?cmd=$c" >"$out/cmd-$c.html" 2>/dev/null; then
|
||||||
|
printf ' cmd=%-5s %6s bytes\n' "$c" "$(wc -c <"$out/cmd-$c.html" | tr -d ' ')"
|
||||||
|
else
|
||||||
|
printf ' cmd=%-5s FAILED\n' "$c"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Pretty-print one page as text
|
||||||
|
view() { get "$1" | sed -e 's/<[^>]*>/ /g' | tr -s ' \t\r\n' ' ' | sed 's/ / /g'; echo; }
|
||||||
|
|
||||||
|
# --- write (use deliberately, then `save`) ---
|
||||||
|
post() { "${CURL[@]}" -X POST "$BASE" "$@"; }
|
||||||
|
|
||||||
|
add_vlans() { post --data-urlencode "vlanlist=$1" --data "vlanAction=0" --data-urlencode "name=${2:-}" --data "cmd=1284"; }
|
||||||
|
del_vlans() { post --data-urlencode "vlanlist=$1" --data "vlanAction=1" --data "cmd=1284"; }
|
||||||
|
# set_ip <ip> [netmask] [gateway] — RECOVERY: re-point mgmt IP (e.g. after flash reset to 192.168.1.1)
|
||||||
|
set_ip() { post --data "mode=0" --data "ip=$1" --data "netmask=${2:-255.255.255.0}" --data "gateway=${3:-10.40.41.254}" --data "cmd=518"; }
|
||||||
|
save_flash() { echo ">> SAVE to FLASH (cmd=4358)"; get 4358 >/dev/null; }
|
||||||
|
|
||||||
|
usage() { cat <<USAGE
|
||||||
|
usage: $0 <cmd>
|
||||||
|
scrape [dir] dump config pages to switch/<dir> (default state-PRE) [READ]
|
||||||
|
get <N> raw HTML of cmd=N [READ]
|
||||||
|
view <N> cmd=N as plain text [READ]
|
||||||
|
add-vlans <list> [prefix] e.g. add-vlans 10,20,30,40,100 [WRITE]
|
||||||
|
del-vlans <list> [WRITE]
|
||||||
|
set-ip <ip> [mask] [gw] RECOVERY: re-point mgmt IP [WRITE]
|
||||||
|
save persist running config to flash [WRITE]
|
||||||
|
|
||||||
|
Recovery after flash (switch reset to 192.168.1.1):
|
||||||
|
SW_HOST=192.168.1.1 SW_USER=admin SW_PASS=admin $0 set-ip 10.40.41.239
|
||||||
|
USAGE
|
||||||
|
}
|
||||||
|
|
||||||
|
case "${1:-}" in
|
||||||
|
scrape) scrape "${2:-state-PRE}" ;;
|
||||||
|
get) get "$2" ;;
|
||||||
|
view) view "$2" ;;
|
||||||
|
add-vlans) add_vlans "$2" "${3:-}" ;;
|
||||||
|
del-vlans) del_vlans "$2" ;;
|
||||||
|
set-ip) set_ip "$2" "${3:-255.255.255.0}" "${4:-10.40.41.254}" ;;
|
||||||
|
save) save_flash ;;
|
||||||
|
*) usage ;;
|
||||||
|
esac
|
||||||
Reference in New Issue
Block a user