Files
RouterOS/RouterOSAssistant/Features/Wizard/Steps/Setup/LanStepView.swift
T
KayandClaude Sonnet 5 5c8b5fd9d2 M8: Mehrere LAN-Interfaces + Netzwerk-Isolation (Firewall-Regeln pro Netzwerk)
lanConfig wird zu lanConfigs: [LanDhcpConfig] (analog zum VLAN-Listen-
Muster) — mehrere physische Interfaces mit je eigenem DHCP-Server.
Neues isolated-Feld auf LanDhcpConfig/VlanEntry: FirewallConfig erzeugt
daraus paarweise Forward-Drop-Regeln zwischen jedem isolierten Netzwerk
und allen anderen konfigurierten Netzwerken (Pair-Dedup bei gegenseitiger
Isolation). Behebt nebenbei, dass VlanStepView bisher Isolation im
Hilfetext behauptete, ohne dass eine Regel das durchsetzte.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YYoWFMLHACvzzRC8u4iKF9
2026-09-13 19:57:15 +02:00

74 lines
3.4 KiB
Swift

import SwiftUI
struct LanStepView: View {
@ObservedObject var viewModel: SetupViewModel
let availableInterfaces: [NetworkInterface]
var body: some View {
Form {
ForEach($viewModel.lanConfigs) { $config in
Section("Netzwerk auf \(config.interfaceName)") {
Picker("Anschluss/Bridge", selection: $config.interfaceName) {
ForEach(availableInterfaces) { interface in
Text(interface.name).tag(interface.name)
}
}
.help("Der interne Netzwerk-Anschluss, an dem deine Geräte hängen (dein lokales Netzwerk, LAN).")
TextField("Router-Adresse (z.B. 192.168.88.1/24)", text: $config.routerAddress)
.help("Die Adresse, unter der der Router selbst in diesem Netzwerk erreichbar ist.")
TextField("Netzwerk (z.B. 192.168.88.0/24)", text: $config.networkAddress)
.help("Der komplette Adressbereich dieses Netzwerks (z.B. /24 erlaubt bis zu 254 Geräte).")
TextField("Automatische Adressvergabe von", text: $config.poolRangeStart)
.help("Ab welcher Adresse der Router automatisch Adressen an Geräte in diesem Netzwerk vergibt.")
TextField("bis", text: $config.poolRangeEnd)
.help("Bis zu welcher Adresse der Router automatisch Adressen an Geräte in diesem Netzwerk vergibt.")
Stepper(
"Adresse behalten für \(config.leaseTimeHours) Stunden",
value: $config.leaseTimeHours,
in: 1...168
)
.help("Wie lange ein Gerät seine zugewiesene Adresse behält, bevor sie erneuert werden muss.")
TextField("DNS-Server", text: $config.dnsServers)
.help("Welcher Server Geräten in diesem Netzwerk Internetadressen in Namen übersetzt (z.B. www.google.de). Meist der Router selbst.")
Toggle("Von anderen Netzwerken isolieren", isOn: $config.isolated)
.help("Verhindert Datenverkehr zwischen diesem und allen anderen konfigurierten LAN-/VLAN-Netzwerken. Der Internetzugriff bleibt erhalten. Wird im Firewall-Schritt umgesetzt.")
if viewModel.lanConfigs.count > 1 {
Button("Netzwerk entfernen", role: .destructive) {
viewModel.removeLan(config.id)
}
}
}
}
Section {
Button("Weiteres LAN-Netzwerk hinzufügen") {
viewModel.addLan()
}
}
Section {
HStack {
Button("Zurück") { viewModel.goBack() }
Spacer()
Button("Weiter") { viewModel.goNext() }
.disabled(!isStepValid)
}
}
}
.formStyle(.grouped)
.navigationTitle("Heimnetzwerk einrichten")
}
private var isStepValid: Bool {
viewModel.lanConfigs.allSatisfy { config in
!config.interfaceName.isEmpty
&& !config.routerAddress.isEmpty
&& !config.networkAddress.isEmpty
&& !config.poolRangeStart.isEmpty
&& !config.poolRangeEnd.isEmpty
}
}
}