From 2c2fae73eb3d40d0c82eade1c4df60a98dbf28c7 Mon Sep 17 00:00:00 2001 From: neodk2004 Date: Thu, 17 Sep 2026 19:15:15 +0200 Subject: [PATCH] =?UTF-8?q?LAN-Scanner:=20R=C3=BCckg=C3=A4ngig-Zustand=20n?= =?UTF-8?q?ach=20Entfernen=20der=20festen=20Lease=20erkl=C3=A4ren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nutzer-Feedback: Nach "Feste IP zuweisen" → "Rückgängig machen" wirkte die Zeile wie kaputt (Button einfach ausgegraut, Status nur "Kein DHCP-Lease"). Technischer Hintergrund bestätigt: RouterOS kennt kein "wieder dynamisch machen", UndoStaticAsync entfernt den Lease-Eintrag komplett — das Gerät merkt das aber nicht sofort, sondern hält seine IP client-seitig, bis es sich neu meldet (Renewal-Timer oder Trennen/Neuverbinden). Die Zeile zeigt das jetzt explizit ("Feste IP entfernt" + erklärender Hinweistext/Tooltip statt kommentarlosem Ausgrauen). Zusätzlich: immer sichtbarer "Aktualisieren"-Button, um nach einem Trennen/Neuverbinden ohne Schritt-Wechsel neu zu scannen. Co-Authored-By: Claude Sonnet 5 --- README.md | 4 +++- .../Steps/LanScanDeviceRowViewModel.cs | 19 +++++++++++++++++++ .../ViewModels/Steps/LanScanStepViewModel.cs | 13 ++++++++++--- .../Views/Steps/LanScanStepView.xaml | 16 +++++++++++++--- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 08a2319..bc39fac 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,9 @@ Bei einem bereits konfigurierten Bestandsgerät liest der dritte Schritt automat ### Geräte im Netzwerk (LAN-Scanner) -Der vierte Schritt führt DHCP-Leases (`/ip/dhcp-server/lease`), die ARP-Tabelle (`/ip/arp`) und die Bridge-Host-Tabelle (`/interface/bridge/host`) per MAC-Adresse zu einer Geräteliste zusammen, gruppiert nach dem physischen Anschluss, an dem ein Gerät tatsächlich hängt (aus der Bridge-Host-Tabelle — ARP/Lease zeigen bei gebrückten Setups sonst nur die Bridge selbst, nicht den echten Port). Rein informativ bis auf eine Aktion: Bei einem Gerät mit DHCP-Lease lässt sich diese per Klick fest zuweisen (RouterOS „Make Static") oder wieder entfernen, damit es beim nächsten DHCP-Kontakt wieder eine dynamische Adresse bekommt. Wie die IST-Zustand-Analyse verändert dieser Schritt nichts an der vom Assistenten geplanten Soll-Konfiguration. +Der vierte Schritt führt DHCP-Leases (`/ip/dhcp-server/lease`), die ARP-Tabelle (`/ip/arp`) und die Bridge-Host-Tabelle (`/interface/bridge/host`) per MAC-Adresse zu einer Geräteliste zusammen, gruppiert nach dem physischen Anschluss, an dem ein Gerät tatsächlich hängt (aus der Bridge-Host-Tabelle — ARP/Lease zeigen bei gebrückten Setups sonst nur die Bridge selbst, nicht den echten Port). Rein informativ bis auf eine Aktion: Bei einem Gerät mit DHCP-Lease lässt sich diese per Klick fest zuweisen (RouterOS „Make Static") oder wieder entfernen. Ein „Aktualisieren"-Button lädt die Liste jederzeit neu. + +RouterOS kennt keinen direkten „wieder dynamisch machen"-Befehl — das Rückgängig-Machen entfernt den Lease-Eintrag komplett. Das betroffene Gerät merkt das aber nicht sofort: Es hält seine bisherige IP-Adresse client-seitig weiter, bis es von sich aus eine neue DHCP-Anfrage stellt (Lease-Renewal-Timer) oder der Link neu aufgebaut wird (Kabel/WLAN trennen und neu verbinden, Neustart). Bis dahin zeigt die Zeile „Feste IP entfernt" mit deaktiviertem Button und einem erklärenden Hinweistext, statt kommentarlos auszugrauen. Wie die IST-Zustand-Analyse verändert dieser Schritt nichts an der vom Assistenten geplanten Soll-Konfiguration. ### Experten-Modus diff --git a/src/MikrotikInstaller.App/ViewModels/Steps/LanScanDeviceRowViewModel.cs b/src/MikrotikInstaller.App/ViewModels/Steps/LanScanDeviceRowViewModel.cs index 6e60a39..41c62c1 100644 --- a/src/MikrotikInstaller.App/ViewModels/Steps/LanScanDeviceRowViewModel.cs +++ b/src/MikrotikInstaller.App/ViewModels/Steps/LanScanDeviceRowViewModel.cs @@ -17,6 +17,7 @@ public partial class LanScanDeviceRowViewModel : ObservableObject [NotifyPropertyChangedFor(nameof(StatusLabel))] [NotifyPropertyChangedFor(nameof(ActionLabel))] [NotifyPropertyChangedFor(nameof(CanToggleStatic))] + [NotifyPropertyChangedFor(nameof(ActionHint))] private DiscoveredDevice _device; [ObservableProperty] @@ -26,6 +27,18 @@ public partial class LanScanDeviceRowViewModel : ObservableObject [ObservableProperty] private string? _errorMessage; + /// + /// Gesetzt, direkt nachdem für dieses Gerät eine feste Lease entfernt wurde. RouterOS kennt danach + /// keinen Lease-Eintrag mehr für dieses Gerät — das Gerät selbst merkt das aber nicht sofort: Es hält + /// seine bisherige IP-Adresse client-seitig weiter, bis es von sich aus eine neue DHCP-Anfrage stellt + /// (Lease-Renewal-Timer) oder der Link neu aufgebaut wird (Kabel/WLAN trennen und neu verbinden, + /// Neustart). Rein für die Anzeige — wird bei jedem Neuladen des Schritts wieder zurückgesetzt. + /// + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(StatusLabel))] + [NotifyPropertyChangedFor(nameof(ActionHint))] + private bool _isAwaitingNewLease; + public string MacAddress => Device.MacAddress; public string IpAddressDisplay => Device.IpAddress ?? "Keine IP bekannt"; @@ -36,6 +49,7 @@ public partial class LanScanDeviceRowViewModel : ObservableObject { { IsStaticLease: true } => "Feste IP-Adresse", { HasDhcpLease: true } => "Automatisch per DHCP", + _ when IsAwaitingNewLease => "Feste IP entfernt", _ => "Kein DHCP-Lease", }; @@ -43,4 +57,9 @@ public partial class LanScanDeviceRowViewModel : ObservableObject /// Ohne DHCP-Lease-Eintrag gibt es nichts, das umgestellt werden könnte. public bool CanToggleStatic => !IsBusy && Device.LeaseId is not null; + + /// Erklärt, warum der Button gerade deaktiviert ist, nachdem eine feste Zuweisung entfernt wurde. + public string? ActionHint => IsAwaitingNewLease && Device.LeaseId is null + ? "Erst wieder möglich, sobald sich das Gerät neu meldet — üblicherweise nach Trennen/Neuverbinden oder wenn seine bisherige Lease-Zeit abläuft, nicht sofort." + : null; } diff --git a/src/MikrotikInstaller.App/ViewModels/Steps/LanScanStepViewModel.cs b/src/MikrotikInstaller.App/ViewModels/Steps/LanScanStepViewModel.cs index f0bd89f..fd79a2f 100644 --- a/src/MikrotikInstaller.App/ViewModels/Steps/LanScanStepViewModel.cs +++ b/src/MikrotikInstaller.App/ViewModels/Steps/LanScanStepViewModel.cs @@ -47,6 +47,7 @@ public partial class LanScanStepViewModel : WizardStepViewModelBase public override Task OnActivatedAsync() => LoadAsync(); + /// Auch als manuelles "Aktualisieren" genutzt — z. B. um nach einem Trennen/Neuverbinden zu prüfen, ob ein Gerät wieder eine DHCP-Lease bekommen hat. [RelayCommand] private Task Retry() => LoadAsync(); @@ -99,9 +100,15 @@ public partial class LanScanStepViewModel : WizardStepViewModelBase try { - row.Device = row.Device.IsStaticLease - ? await LanScanService.UndoStaticAsync(_session.Client, row.Device) - : await LanScanService.MakeStaticAsync(_session.Client, row.Device); + if (row.Device.IsStaticLease) + { + row.Device = await LanScanService.UndoStaticAsync(_session.Client, row.Device); + row.IsAwaitingNewLease = true; + } + else + { + row.Device = await LanScanService.MakeStaticAsync(_session.Client, row.Device); + } } catch (RouterOsException ex) { diff --git a/src/MikrotikInstaller.App/Views/Steps/LanScanStepView.xaml b/src/MikrotikInstaller.App/Views/Steps/LanScanStepView.xaml index 25d9233..5989d55 100644 --- a/src/MikrotikInstaller.App/Views/Steps/LanScanStepView.xaml +++ b/src/MikrotikInstaller.App/Views/Steps/LanScanStepView.xaml @@ -8,7 +8,15 @@ mc:Ignorable="d" d:DesignWidth="600"> - + + + + + + + @@ -17,8 +25,6 @@ - +