Commit Graph
26 Commits
Author SHA1 Message Date
adminandClaude Sonnet 5 5761f2737d VLAN: Anschlüsse portbasiert (untagged) zuordnen
Build / build (push) Canceled after 0s
Im Experten-Modus lässt sich jedes VLAN wahlweise fest einem oder
mehreren Anschlüssen zuordnen, statt nur über einen VLAN-fähigen
Switch/Access Point (getaggt) erreichbar zu sein. Aktiviert dafür
Bridge-VLAN-Filterung erst als letzten Schritt (nachdem alle PVID-
und Bridge-VLAN-Tabellen-Einträge stehen), um keine Verbindung
während der Einrichtung zu kappen, und schützt die zugeordneten
Anschlüsse per frame-types/ingress-filtering vor VLAN-Hopping.
Ein Anschluss kann nur einem Netzwerk zugeordnet sein; Konflikte
blockieren "Weiter" mit einer Fehlermeldung statt die Auswahl
stillschweigend zu ändern.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 06:35:05 +02:00
adminandClaude Sonnet 5 c05f7986d7 Kategorien-Layout von untereinander auf nebeneinander umgestellt
Build / build (push) Canceled after 0s
Kategorien (Internet / Netzwerk-Schnittstellen / IP-Adressen / DHCP-Server
/ Firewall-Regeln) sind jetzt Spalten von links nach rechts statt Baendern
untereinander - auf Nutzer-Feedback nach dem Live-Test. Jede Spalte
stapelt ihre Knoten vertikal, sortiert nach Baum-Tiefe/Eltern-Knoten,
damit zusammengehoerige Knoten (z.B. eine Bridge und ihre Ports) nahe
beieinander stehen.

Per headless-Harness verifiziert: fuenf saubere Spalten (X=0/280/560/
840/1120), keine Ueberlappungen. Regulaerer Build/Test/Smoke-Test gruen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:38:49 +02:00
adminandClaude Sonnet 5 42d30873f9 Fix: Absturz ohne Fehlermeldung beim Wechsel zu "Vorhandene Netzwerke"
Build / build (push) Canceled after 0s
Ursache gefunden per headless-Reproduktion (WPF-Layout ausserhalb des
sichtbaren Fensters angestossen, da keine Klick-Automatisierung fuer
native Fenster verfuegbar ist): TopologyBandHeaderViewModel.Location war
eine rein schreibgeschuetzte Property. Nodifys ItemContainer.Location ist
aber standardmaessig TwoWay gebunden (damit Drag&Drop den Knoten
zurueckschreiben kann) - beim ersten Layout-Durchlauf warf das eine
InvalidOperationException auf dem UI-Thread, die mangels
DispatcherUnhandledException-Handler den Prozess sofort und ohne jede
Meldung beendete.

Fix: Location bekommt einen (ungenutzten) Setter. Zusaetzlich als
Sicherheitsnetz einen globalen DispatcherUnhandledException-Handler
ergaenzt, der kuenftige unerwartete Fehler als Meldung anzeigt statt den
Prozess stumm zu beenden.

Verifiziert per Konsolen-Harness (WPF-Layout ohne sichtbares Fenster):
View-Konstruktion, Layout-Durchlauf und simulierter Knoten-Klick laufen
jetzt fehlerfrei durch. Ausserdem regulaerer Build/Test/Smoke-Test grün.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:33:57 +02:00
adminandClaude Sonnet 5 49b17623ab IST-Zustand-Analyse: Firewall-Regeln, Kategorien-Layout, Highlight-Fix
Build / build (push) Canceled after 0s
Auf Nutzer-Feedback aus dem Live-Test:

- Klick auf einen zentralen Knoten (z.B. WAN oder eine Bridge) hob bisher
  nur den Weg nach oben zum Internet-Knoten hervor. Jetzt wird der
  komplette verbundene Teilbaum hervorgehoben (Vorfahren UND Nachfahren) -
  ein Klick auf eine Bridge zeigt jetzt wirklich alle angeschlossenen
  Geraete/Netzwerke.
- Layout war zu eng, Kasten-Inhalte abgeschnitten: Knoten verbreitert
  (180->220px), mehr Zeilen-/Spaltenabstand, Label-Text umbricht jetzt
  statt mit "..." abgeschnitten zu werden.
- Grafik nach Kategorien gruppiert (Internet / Netzwerk-Schnittstellen /
  IP-Adressen / DHCP-Server / Firewall-Regeln) mit Beschriftung je Band,
  statt eines reinen Tiefen-Layouts. Kategorie-Label sind eigene, nicht
  anklickbare Eintraege im selben Nodify-Item-Raum wie die Knoten, damit
  sie beim Pan/Zoom exakt mitwandern statt als Overlay zu driften.
- Neu: Firewall-/NAT-Regeln, die an eine konkrete IP gebunden sind
  (Portfreigaben ueber /ip/firewall/nat, Filter-Regeln mit dst-/
  src-address), werden als eigene Knoten unter der IP-Adresse eingehaengt,
  deren Subnetz die gebundene Adresse enthaelt. Allgemeine, nicht
  adressgebundene Basisregeln (z.B. "drop new from WAN") bleiben bewusst
  aussen vor, sonst waere die Grafik von Standard-Boilerplate ueberflutet.

2 neue Core-Tests fuer die Firewall-Zuordnung (56 insgesamt, alle gruen).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:26:49 +02:00
adminandClaude Sonnet 5 6b90a4d836 IST-Zustand-Analyse: bestehende Netzwerke auf Bestandsgeräten visualisieren
Build / build (push) Canceled after 0s
Neuer Wizard-Schritt "Vorhandene Netzwerke" direkt nach der Geräte-
Erkennung. Liest per NetworkAnalysisService (Core) aus, welche Bridges,
VLANs, IP-Adressen, DHCP-Server, Routen und WLANs auf dem Gerät bereits
existieren, und stellt sie als anklickbare Grafik dar (Nodify). Klick auf
einen Knoten hebt die Eltern-Kette bis zum synthetischen "Internet"-Knoten
hervor (Hops/Pfad). Rein informativ, verändert nichts am Gerät und fließt
nicht in die vom Assistenten geplante Soll-Konfiguration ein.

Core liefert reine Fakten (Records in Analysis/), die App-Schicht baut
daraus Knoten/Kanten mit deterministischem Spalten-Layout. Jeder RouterOS-
Endpunkt ist einzeln fehlertolerant (fehlendes Paket, z.B. kein WLAN,
bricht die Analyse nicht ab). Route-zu-Interface-Zuordnung ist best-effort
(gateway-status-Format ist RouterOS-versionsabhängig) — als bekannte
Einschränkung dokumentiert.

Ursprünglich geplant war, den Schritt bei werksneuen Geräten per
ShouldSkip automatisch zu überspringen. Das erwies sich als architektonisch
nicht möglich: die Wizard-Navigation prüft ShouldSkip, bevor
OnActivatedAsync für den Zielschritt läuft, das Analyse-Ergebnis steht zu
dem Zeitpunkt also noch nicht fest. Stattdessen zeigt der Schritt bei
leerem Ergebnis einen kurzen Hinweistext statt einer leeren Grafik.

Demo-Client um Beispieldaten erweitert, damit sich der Schritt über den
Testzugang (127.127.127.127) durchklicken lässt. 9 neue Core-Tests für
NetworkAnalysisService (54 insgesamt, alle grün).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 18:46:18 +02:00
adminandClaude Sonnet 5 e58480d2ae Experten-Modus hinzufügen: erweiterte RouterOS-Optionen in WAN/LAN/VLAN/WLAN/Firewall
Build / build (push) Canceled after 0s
Neuer Wizard-Schritt "Modus wählen" nach der Geräte-Erkennung, mit dem
zwischen dem geführten Assistenten und einem Experten-Modus gewählt werden
kann. Im Experten-Modus zeigen die bestehenden Schritte zusätzliche,
technischere Felder (DHCP-Feinsteuerung, MTU, WPA3, Portbereiche,
IP-Sperrlisten, VLAN-Isolation u.a.), die im Laien-Modus verborgen bleiben.
Alle neuen Settings-Felder sind optional mit Defaults, die das bisherige
Verhalten unverändert lassen (45 Tests grün, 7 davon neu für die
Experten-Felder).

Zusätzlich zwei beim Live-Testen gefundene Bugs behoben: der letzte Schritt
zeigte einen dauerhaft ausgegrauten "Weiter"-Button statt eines
"Beenden"-Buttons, und die Texte im neuen Moduswahl-Schritt wurden
abgeschnitten (horizontales StackPanel gab TextBlocks unbegrenzte Breite
zum Messen, dadurch griff TextWrapping nicht — behoben durch Grid mit
fester Spaltenbreite).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 18:14:04 +02:00
adminandClaude Sonnet 5 0a8f8b3f9b Test-Projekt auf net8.0-windows umstellen, CA1416-Warnungen beheben
Build / build (push) Canceled after 0s
SummaryPdfExporter.Export ist [SupportedOSPlatform("windows")], aber das
Test-Projekt zielte auf net8.0 (ohne OS-Angabe). Der Plattform-Analyzer
kannte den Windows-Kontext dadurch nicht und meldete an jeder Aufrufstelle
in SummaryPdfExporterTests.cs eine CA1416-Warnung - so in den Annotationen
des ersten GitHub-Actions-Laufs aufgefallen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-12 13:24:33 +02:00
adminandClaude Sonnet 5 9af83394f4 App-Icon und README.md
Build / build (push) Canceled after 0s
Eigenes, neutrales Netzwerk-Symbol (Mittelknoten mit vier Satelliten,
MikroTik-Grün) als app.ico — programmatisch erzeugt, bewusst kein
MikroTik-Logo, um keine Markenrechte zu verletzen. Als Resource statt
Content eingebunden, damit es beim Single-File-Publish mit in der exe
landet statt als separate Datei danebenzuliegen. Eingebunden als:
- ApplicationIcon (Datei-Icon in Explorer/Taskleiste/Alt-Tab)
- Window.Icon
- WPF-UI-TitleBar-Icon (Titelleiste)
- Sidebar-Branding (ersetzt den bisherigen grünen Punkt)

README.md für Gitea: was der Assistent einrichtet, Screenshot,
Hinweise für Nutzer (portabel, keine Installation) und Entwickler
(Bauen/Testen, Release-Build, interner Testzugang, Projektstruktur,
verwendete Bibliotheken).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 22:12:31 +02:00
adminandClaude Sonnet 5 761d4012c9 Nur deutsche/englische Sprachpakete in den Release-Build aufnehmen
Build / build (push) Canceled after 0s
SatelliteResourceLanguages=de;en beschränkt die mitgelieferten
Sprachpakete der .NET-Laufzeit und Abhängigkeiten (übersetzte
Systemmeldungen, nicht unsere eigenen UI-Texte — die App hat ohnehin
nur deutsche Texte) auf Deutsch/Englisch. Vorher wurden ~20 weitere
Sprachordner (ja, ru, zh-Hans, ...) ungenutzt mitgeschleppt.

Ungepackt: 170 MB -> 155 MB. Komprimierte Single-File-exe: 71,7 MB ->
67 MB. Reines Build-Einstellungs-Flag ohne Code- oder Trimming-Risiko
(im Gegensatz zu PublishTrimmed, das bei WPF-Apps wegen der starken
Reflection-Nutzung unzuverlässig sein kann und deshalb bewusst nicht
aktiviert wurde).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 22:06:21 +02:00
adminandClaude Sonnet 5 4c247582e9 Distribution: eigenständige Single-File-.exe für Windows
MikrotikInstaller.App.csproj bekommt Produkt-Metadaten (Name, Version,
Beschreibung) und Publish-Vorgaben, die greifen, sobald ein
RuntimeIdentifier angegeben wird: self-contained (keine separate
.NET-Installation beim Nutzer nötig), eine einzelne komprimierte .exe
statt eines Ordners voller DLLs, Debug-Symbole eingebettet statt als
separate .pdb-Datei daneben (MikrotikInstaller.Core.csproj ebenso).
Ausgabename umbenannt auf "MikroTik-Installer.exe".

Build/Test:
  dotnet publish src/MikrotikInstaller.App/MikrotikInstaller.App.csproj -c Release -r win-x64

Ergebnis: eine einzelne ~72-MB-exe unter
src/MikrotikInstaller.App/bin/Release/net8.0-windows/win-x64/publish/
— läuft eigenständig ohne Installation, verifiziert per UI-Automation
(App startet, komplette Sidebar/Navigation funktioniert). Der
Debug-Simulator-Zugang (127.127.127.127/admin/admin) ist im
Release-Build wie vorgesehen nicht erreichbar (#if DEBUG greift).

Ein fertiger Installer (Inno Setup) bleibt bewusst eine spätere
Ausbaustufe — die portable Einzeldatei ist der MVP-Verteilweg.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:51:30 +02:00
adminandClaude Sonnet 5 b9f632fb16 Fix: WLAN-Schritt ließ sich nicht überspringen, wenn WLAN nur deaktiviert war
ShouldSkip übersprang den WLAN-Schritt bisher nur bei Geräten ganz
ohne WLAN-Hardware. Ein Gerät mit vorhandener, aber deaktivierter
WLAN-Schnittstelle (z. B. weil es hier rein als Switch dient) hat
zu Recht "WLAN-fähig" gemeldet — der Schritt blieb aber Pflicht und
verlangte SSID/Passwort, obwohl der Nutzer gar kein WLAN einrichten
wollte.

Neue Checkbox "Kein WLAN einrichten" macht den Schritt explizit
überspringbar: aktiviert, wird "Weiter" ohne SSID/Passwort freigegeben,
die übrigen Felder werden deaktiviert, und es werden keine
WLAN-Änderungen in die Zusammenfassung/Anwendung übernommen.

Neuer InverseBooleanConverter für die IsEnabled-Bindung (die bisherige
Idee, den Visibility-Konverter dafür zu missbrauchen, wäre ein
Typfehler gewesen — Visibility lässt sich nicht in bool/double
konvertieren).

Per UI-Automation verifiziert: Checkbox aktiviert, Felder werden
deaktiviert, "Weiter" wird ohne Eingaben aktiv.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:47:20 +02:00
adminandClaude Sonnet 5 f12e46dceb Neuer optionaler Schritt 9: RouterOS-Update prüfen und starten
RouterOsUpdateService nutzt RouterOS' eigene Update-Funktion
(/system/package/update/check-for-updates + /print), inklusive Polling
bis der Status nicht mehr "Checking..." ist. Schlägt die Prüfung fehl
(z. B. weil das Gerät noch keinen Internetzugang hat), wird das als
"nicht geprüft werden konnte" behandelt statt als Fehler.

Zeitlicher Ablauf wie gewünscht: Die Prüfung wird zuerst im Hintergrund
in der Geräte-Erkennung versucht (Schritt 2) — funktioniert nur, wenn
das Gerät zu diesem Zeitpunkt schon Internetzugang hat. Nach
erfolgreichem Anwenden (Schritt 8, wenn WAN eingerichtet wurde) wird
sie automatisch wiederholt. Beide Läufe blockieren die Navigation
nicht (Fire-and-forget im Hintergrund).

Neuer Schritt 9 "RouterOS-Update" zeigt das Ergebnis: nicht geprüft
werden konnte (mit "Erneut prüfen"), bereits aktuell, oder eine neuere
Version verfügbar — dann mit deutlicher Warnung vor dem automatischen
Neustart und einer Pflicht-Checkbox, bevor "Jetzt aktualisieren"
aktiv wird. Komplett optional, keine Pflicht zum Abschluss des
Assistenten.

Zusammenfassungs-Schritt lässt "Weiter" jetzt erst nach erfolgreichem
Anwenden zu (vorher automatisch gesperrt, weil er der letzte Schritt
war — das ist er jetzt nicht mehr).

Simulator-Zugang liefert jetzt eine simulierte verfügbare Version
(7.15.2 → 7.16.1), damit sich auch dieser Schritt gefahrlos
durchspielen lässt.

Per UI-Automation den kompletten Assistenten durchgeklickt: "nicht
geprüft werden konnte"-Zustand (echtes Simulator-Verhalten ohne
Update-Endpunkte) und "Update verfügbar"-Zustand beide verifiziert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:39:05 +02:00
adminandClaude Sonnet 5 4e403d60f3 Fix: Tooltip-Texte blieben leer
ToolTip-Inhalte hängen nicht im normalen visuellen Baum der Seite,
sondern werden erst beim Anzeigen separat verbunden — eine direkte
ElementName-Bindung im ToolTip-Inhalt (wie zuvor verwendet) läuft
daher ins Leere und bleibt leer, ohne einen Fehler zu werfen.

Fix nach dem dafür vorgesehenen WPF-Muster: Der Text wird als Tag auf
das sichtbare SymbolIcon gebunden (das steht im normalen Baum, dort
funktioniert ElementName), der ToolTip-Inhalt liest ihn anschließend
über PlacementTarget.Tag zurück.

Per UI-Automation mit echter, schrittweiser Mausbewegung verifiziert:
Tooltip zeigt jetzt den vollständigen, umbrochenen Erklärtext an.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:22:46 +02:00
adminandClaude Sonnet 5 4a9aec7634 Laientaugliche Tooltips für alle Fachbegriffe im Interview
Neues wiederverwendbares Steuerelement InfoHint: ein kleines
"?"-Symbol, das per Hover eine kurze, einfache Erklärung zeigt —
ohne die Formulare optisch zu überladen (nur bei tatsächlich
erklärungsbedürftigen Begriffen, nicht bei Selbstverständlichem wie
"Benutzername" oder "Passwort").

Fachbegriffe jetzt erklärt in allen Schritten:
- Verbindung: IP-Adresse/Hostname, verschlüsselte Verbindung
- Geräte-Erkennung: RouterOS, Architektur, Netzwerkschnittstellen
- Internet-Zugang: Schnittstelle, DHCP, Präfix, Gateway
- Heimnetzwerk: Bridge/interner Name, Router-Adresse, Präfix,
  Adressbereich, DNS-Server
- VLANs: VLAN-ID, Router-Adresse
- WLAN: Schnittstelle, SSID
- Firewall: Portfreigabe, Protokoll, Port von außen/am Gerät

Per UI-Automation den kompletten Assistenten erneut durchgeklickt:
alle Schritte rendern weiterhin korrekt, Info-Symbole erscheinen an
den richtigen Stellen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:16:29 +02:00
adminandClaude Sonnet 5 de71671b55 PDF-Export der Zusammenfassung inkl. WLAN-QR-Code
SummaryPdfExporter (PdfSharp, MIT-lizenziert) druckt die Einrichtung
als einseitiges PDF: Internet-Zugang, Heimnetzwerk, VLANs und Firewall
mit den konkreten technischen Daten (IP-Bereiche, Anschlüsse, DNS) in
der linken Spalte, WLAN-Name und -Passwort groß hervorgehoben in der
rechten Spalte — zum Aufbewahren/Ausdrucken, nicht zum vereinfachten
Vorlesen wie die Bildschirm-Zusammenfassung.

Nice-to-have umgesetzt: WifiQrCodeGenerator (QRCoder, MIT-lizenziert)
erzeugt einen QR-Code im Standard-WIFI:-Format, den Handys direkt als
"WLAN beitreten" erkennen. QR-Erzeugung schlägt niemals das gesamte
PDF fehl — bei Problemen (z. B. Sonderzeichen) wird sie einfach
ausgelassen.

Zwei PdfSharp-6-Besonderheiten gelöst:
- Schriftauflösung: PDFsharp 6 löst Schriften nicht mehr automatisch
  über GDI auf. WindowsSegoeUiFontResolver liest Segoe UI direkt aus
  dem Windows-Schriftartenordner (keine Schriftdatei wird mitgeliefert
  — Microsoft-Lizenz).
- Von QRCoder erzeugte PNGs wurden von PDFsharps PNG-Decoder abgelehnt;
  über GDI+ (ohnehin transitive Abhängigkeit von QRCoder) nach BMP
  normalisiert, das zuverlässig gelesen wird.

Neuer "Als PDF speichern"-Button im Zusammenfassungs-Schritt (vor und
nach dem Anwenden verfügbar) öffnet einen Speichern-Dialog und zeigt
Erfolg/Fehler direkt im Assistenten an.

Per UI-Automation und Sichtprüfung des erzeugten PDFs verifiziert:
korrektes einseitiges Layout, lesbarer QR-Code, alle Daten vorhanden.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:08:29 +02:00
adminandClaude Sonnet 5 feafba2274 Laientaugliche, gruppierte Zusammenfassung statt technischer Befehlsliste
Die Zusammenfassung zeigte bisher jede einzelne RouterOS-Aktion als
flache Liste (z. B. "IP-Adressbereich 192.168.88.10-192.168.88.254
für Geräte in deinem Netzwerk reservieren", "DHCP-Server auf
„bridge-lan" aktivieren, ...) — für Laien kaum verständlich und rein
technisch sortiert.

Jeder Configurator (Wan/Lan/Vlan/Wireless/Firewall) bekommt jetzt
zusätzlich BuildFriendlySummary(...): 1-2 kurze, verständliche Sätze
ohne RouterOS-Fachbegriffe, getrennt von den technischen
ConfigurationAction-Beschreibungen (die weiterhin als Fortschrittstext
beim tatsächlichen Anwenden dienen).

WizardSession hält jetzt zusätzlich die rohen Einstellungsobjekte
jedes Schritts (WanSettings, LanSettings, VlanDefinitions,
WirelessSettings, FirewallSettings), damit der Zusammenfassungs-Schritt
daraus bauen kann, was tatsächlich passiert ist — nicht wie.

Die Zusammenfassung zeigt jetzt pro Themenbereich eine eigene Karte
(Internet-Zugang, Heimnetzwerk, optional VLANs, optional WLAN,
Firewall) mit Symbol, Titel und kurzen Stichpunkten; leere Bereiche
(z. B. keine VLANs eingerichtet) werden gar nicht erst angezeigt.

Unit-Tests prüfen u. a., dass die Klartext-Sätze keine RouterOS-Begriffe
wie "NAT" enthalten und dass das WLAN-Passwort nicht in der Anzeige
landet.

Per UI-Automation verifiziert: vier klar getrennte, grün akzentuierte
Karten mit verständlichen Stichpunkten statt einer technischen Liste.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 20:56:12 +02:00
adminandClaude Sonnet 5 d8e3705980 Modernes Redesign: Sidebar-Navigation, MikroTik-Grün, Hell/Dunkel automatisch
Behebt beide gemeldeten UI-Bugs:
- "Verbindung testen"-Button unsichtbar: Die App war fest auf das
  Hell-Theme verdrahtet, während das native Mica-Fenstermaterial dem
  Windows-Systemthema folgte — bei aktiviertem Dark Mode entstand ein
  Kontrast-Mismatch. App.xaml.cs wendet jetzt beim Start
  ApplicationThemeManager.ApplySystemTheme() an, MainWindow.xaml.cs
  registriert SystemThemeWatcher.Watch() für Live-Wechsel zur Laufzeit.
- Unterste Elemente in Schritt 2 abgeschnitten: Es fehlte ein
  Scroll-Container. Der Inhaltsbereich in MainWindow.xaml ist jetzt
  einmal zentral in einen ScrollViewer gefasst (redundante,
  uneinheitliche ScrollViewer in einzelnen Schritt-Views entfernt),
  sodass bei jeder Fenstergröße gescrollt statt abgeschnitten wird —
  "Zurück"/"Weiter" bleiben dabei immer sichtbar und erreichbar.

Farbschema: MikroTik-Markenfarben direkt aus mikrotik.com (CSS)
übernommen — Grün #009245 als Akzent über
ApplicationAccentColorManager (ersetzt die Windows-Systemakzentfarbe
für alle "Primary"-Elemente automatisch), dazu feste Marken-Brushes
für Erfolgs-/Fehlertexte statt hartkodierter Farbnamen.

Neues Shell-Layout: Sidebar mit Marke + Schritt-Übersicht (Nummer,
Titel, grüner Haken für abgeschlossene Schritte, hervorgehobener
aktueller Schritt) ersetzt den bisherigen reinen Fortschrittsbalken —
modernerer, klarerer Assistenten-Look.

Verifiziert per UI-Automation (Screenshots bei normaler und
Mindest-Fenstergröße): Kontrast in Dunkel-Theme korrekt, Navigation
bei wenig Platz scrollt statt abzuschneiden.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 20:45:50 +02:00
adminandClaude Sonnet 5 420c6bd4d7 Test: Factory liefert den Simulator-Client sofort und ohne Netzwerk
Regressionstest zur Diagnose des Weiter-Button-Problems: bestätigt,
dass RouterOsClientFactory.ConnectAsync mit den Simulator-Zugangsdaten
(127.127.127.127/admin/admin) sofort einen DemoRouterOsClient liefert,
ohne jeden Verbindungsversuch übers Netz. Die Kernlogik war korrekt —
Ursache des gemeldeten Problems war die PasswordBox-Bindung (siehe
vorheriger Commit) und ein noch laufender, alter App-Prozess beim Test.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 20:24:48 +02:00
adminandClaude Sonnet 5 25a076c3ef Fix: Passwort-Eingabe kam nie im ViewModel an
Wpf.Ui.Controls.PasswordBox registriert seine Password-Eigenschaft mit
einfacher PropertyMetadata statt FrameworkPropertyMetadata, daher ist
sie NICHT standardmäßig zweiseitig gebunden (BindsTwoWayByDefault
liegt bei false). Ohne explizites Mode=TwoWay blieb das ViewModel-
Passwort dauerhaft leer, egal was eingegeben wurde — daher schlug
sowohl die echte Verbindung als auch der Simulator-Testzugang
(127.127.127.127/admin/admin) immer fehl und "Weiter" blieb deaktiviert.

Betraf den Verbindungs-Schritt und den WLAN-Passwort-Schritt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 20:20:09 +02:00
adminandClaude Sonnet 5 571ff87254 Zusammenfassung + Anwenden: der Wizard ist jetzt end-to-end durchklickbar
SummaryStepViewModel sammelt alle in den vorherigen Schritten geplanten
Änderungen (WAN/LAN/VLAN/WLAN/Firewall) und zeigt sie im Klartext an.
Erst ein ausdrücklicher Klick auf "Jetzt einrichten" löst etwas aus:

1. RouterBackupService erstellt ein Backup auf dem Gerät selbst
   (/system/backup/save) — Download aufs eigene PC ist bewusst nicht
   Teil dieses Schritts (bräuchte SFTP zusätzlich zur REST/Binary-API,
   als separate Erweiterung zurückgestellt).
2. Alle gesammelten Änderungen werden nacheinander mit Fortschritts-
   anzeige angewendet.
3. Bei einem Fehler wird der Backup-Name in der Fehlermeldung genannt,
   damit der Nutzer weiß, wie er zurück auf den alten Stand kommt.

Damit ist der komplette Interview-Ablauf (Verbindung → Geräte-Erkennung
→ WAN → LAN → VLAN → WLAN → Firewall → Zusammenfassung → Anwenden)
durchspielbar — auch gefahrlos über den in der letzten Änderung
eingeführten Simulator-Zugang (127.127.127.127 / admin / admin).

Nicht mehr benötigte PlaceholderStepView(Model) entfernt, da jetzt
jeder Schritt eine echte Implementierung hat.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 19:32:16 +02:00
adminandClaude Sonnet 5 5a319ce336 Wizard-Schritte für VLANs, WLAN und Firewall
VlanConfigurator: je VLAN eine eigene VLAN-Schnittstelle auf der
Heimnetz-Bridge mit eigenem Adressbereich und DHCP-Server — für
optionale, vom Heimnetz getrennte Netzwerke (z. B. Gäste, smarte
Geräte). Ohne Einträge bleibt der Schritt wirkungslos.

WirelessConfigurator: WPA2-Sicherheitsprofil anlegen und per
"numbers"-Parameter auf der gewählten WLAN-Schnittstelle aktivieren
(kein zusätzlicher .id-Nachschlage-Aufruf nötig). Der WLAN-Schritt wird
automatisch übersprungen, wenn das Gerät keine WLAN-Schnittstelle hat
(neuer ShouldSkip-Hook in WizardStepViewModelBase, ausgewertet in
MainViewModel.GoNext/GoBack).

FirewallConfigurator: sichere Basisregeln (Router nur aus dem Heimnetz
erreichbar, unangeforderte neue Verbindungen aus dem Internet werden
blockiert) plus optionale Portfreigaben (dstnat + Forward-Allow-Regel
vor der abschließenden Sperrregel), für Geräte, die von außen
erreichbar sein sollen (z. B. Spiele- oder NAS-Server).

Alle drei Schritte sammeln ihre Änderungen weiterhin nur in der
WizardSession — am Gerät wird nichts verändert, bis der noch
ausstehende Zusammenfassungs-Schritt es tut.

Unit-Tests prüfen erzeugte RouterOS-Befehle inkl. Regel-Reihenfolge
(Portfreigaben vor der abschließenden Sperrregel), ohne echtes Gerät.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 19:28:29 +02:00
adminandClaude Sonnet 5 f23da2e981 Simulierten Testzugang für interne Wizard-Tests ohne echtes Gerät
DemoRouterOsClient simuliert ein RouterOS-Gerät komplett im Arbeitsspeicher
(keine Netzwerkverbindung) und wird aktiviert, wenn exakt die Zugangsdaten
127.127.127.127 / admin / admin eingegeben werden. So lässt sich der
komplette Interview-Ablauf durchklicken, ohne ein reales MikroTik-Gerät
zu verändern oder überhaupt zu benötigen.

Nur in Debug-Builds erreichbar (#if DEBUG in RouterOsClientFactory),
damit dieser Testzugang nicht in der für Endnutzer veröffentlichten
Version landet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 19:22:08 +02:00
adminandClaude Sonnet 5 ca21d7b8a0 Wizard-Schritte für Internet-Zugang (WAN) und Heimnetzwerk (DHCP)
ConfigurationAction kapselt eine Änderung als Klartext-Beschreibung plus
Anwendungslogik über IRouterOsClient — WanConfigurator und
LanConfigurator bauen daraus die konkreten RouterOS-Befehle:

- WAN: DHCP-Client oder feste IP/Gateway, plus NAT-Masquerade.
- LAN: Bridge mit gewählten Schnittstellen, IP-Adresse, DHCP-Pool,
  DHCP-Server, Netzwerk-Eintrag (Gateway/DNS) und Router als
  DNS-Weiterleitung fürs Heimnetz.

Beide Wizard-Schritte sammeln die geplanten Änderungen nur in der
WizardSession (WanActions/LanActions) — am Gerät wird weiterhin nichts
verändert, bis der noch ausstehende Zusammenfassungs-Schritt es tut.
Der LAN-Schritt schließt die im WAN-Schritt gewählte Schnittstelle aus
der Anschluss-Auswahl aus und liefert sinnvolle Vorbelegungen
(192.168.88.0/24 u. Ä.), damit man sich weitgehend durchklicken kann.

Unit-Tests prüfen sowohl die erzeugten Beschreibungstexte als auch die
tatsächlich angewendeten RouterOS-Pfade/Parameter über ein
aufzeichnendes Test-Double, ohne echtes Gerät.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 19:19:07 +02:00
adminandClaude Sonnet 5 9232a0d065 Geräte-Erkennung: Modell, RouterOS-Version und Schnittstellen auslesen
DeviceDiscoveryService liest /system/resource, /system/identity,
/system/routerboard und /interface über IRouterOsClient aus und baut
daraus ein RouterDevice-Modell (inkl. Erkennung, ob WLAN-Schnittstellen
vorhanden sind). Anfragen laufen bewusst sequenziell, da die binäre API
auf einer TCP-Verbindung immer nur einen Befehl gleichzeitig verarbeitet.

WizardSession hält die einmal hergestellte Geräteverbindung über den
gesamten Assistenten hinweg (bisher wurde sie nach dem Verbindungstest
sofort wieder geschlossen). Der Verbindungs-Schritt übergibt den Client
jetzt an die Session statt ihn zu verwerfen; das Hauptfenster schließt
die Verbindung beim Beenden der App sauber.

Neuer Geräte-Erkennungs-Schritt lädt beim Betreten automatisch die
Gerätedaten (WizardStepViewModelBase.OnActivatedAsync-Hook) und zeigt
Modell, RouterOS-Version, Architektur und alle Schnittstellen mit
Status an; bei Fehlern gibt es eine "Erneut versuchen"-Option.

Unit-Tests für DeviceDiscoveryService über ein Test-Double von
IRouterOsClient, ohne echtes Gerät.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 19:13:50 +02:00
adminandClaude Sonnet 5 6d47ce72a1 RouterOS-Verbindungsschicht: REST-API mit Fallback auf Binary-API
IRouterOsClient als einheitliche Abstraktion (Get/Add/Set/Remove/Execute)
über RouterOS-Menüpfade. RestRouterOsClient spricht die RouterOS-7-REST-API
(JSON über HTTP/HTTPS), BinaryRouterOsClient implementiert das RouterOS-
API-Wortprotokoll direkt (Port 8728/8729) für ältere Geräte.
RouterOsClientFactory probiert REST zuerst und fällt automatisch auf die
Binary-API zurück, damit die Wizard-Schritte protokollunabhängig bleiben.

Verbindungs-Schritt im Wizard testet die Zugangsdaten live gegen das
Gerät und schaltet "Weiter" erst nach erfolgreichem Verbindungstest frei.

Unit-Tests für die Wortkodierung des Binärprotokolls (Längenkodierung,
Mehrwort-Sätze, Satzgrenzen) ohne echtes Gerät.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 19:08:49 +02:00
adminandClaude Sonnet 5 b20c0463a7 Grundgerüst: WPF-Wizard-Shell mit Navigation
.NET 8 Solution mit App (WPF/WPF-UI), Core und Core.Tests.
Generische Schritt-Navigation (MainViewModel) mit Platzhalter-Schritten
als Basis für die kommenden Interview-Schritte.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 18:58:05 +02:00