160 lines
6.1 KiB
Swift
160 lines
6.1 KiB
Swift
//
|
|
// Copyright © 2020 osy. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
@available(iOS 14, macOS 11, *)
|
|
struct VMConfigNetworkView: View {
|
|
@ObservedObject var config: UTMConfiguration
|
|
@State private var showAdvanced: Bool = false
|
|
|
|
var body: some View {
|
|
VStack {
|
|
Form {
|
|
Section(header: Text("Hardware"), footer: EmptyView().padding(.bottom)) {
|
|
#if os(macOS)
|
|
NetworkModeSection(config: config)
|
|
#else
|
|
Toggle(isOn: $config.networkEnabled.animation(), label: {
|
|
Text("Enabled")
|
|
})
|
|
#endif
|
|
if config.networkEnabled {
|
|
VMConfigStringPicker(selection: $config.networkCard, label: Text("Emulated Network Card"), rawValues: UTMConfiguration.supportedNetworkCards(forArchitecture: config.systemArchitecture), displayValues: UTMConfiguration.supportedNetworkCards(forArchitecturePretty: config.systemArchitecture))
|
|
}
|
|
}.disabled(UTMConfiguration.supportedNetworkCards(forArchitecture: config.systemArchitecture)?.isEmpty ?? true)
|
|
|
|
if config.networkEnabled {
|
|
Toggle(isOn: $showAdvanced.animation(), label: {
|
|
Text("Show Advanced Settings")
|
|
})
|
|
|
|
if showAdvanced {
|
|
#if os(macOS)
|
|
IPConfigurationSection(config: config)
|
|
#else
|
|
IPConfigurationSection(config: config).multilineTextAlignment(.trailing)
|
|
#endif
|
|
}
|
|
|
|
VMConfigNetworkPortForwardView(config: config)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@available(iOS 14, macOS 11, *)
|
|
struct NetworkModeSection: View {
|
|
@ObservedObject var config: UTMConfiguration
|
|
|
|
var body: some View {
|
|
VMConfigStringPicker(selection: $config.networkMode, label: Text("Network Mode"), rawValues: UTMConfiguration.supportedNetworkModes(), displayValues: UTMConfiguration.supportedNetworkModesPretty())
|
|
if config.networkMode == "bridged" {
|
|
HStack {
|
|
Text("Bridged Interface")
|
|
Spacer()
|
|
TextField("en0", text: $config.networkBridgeInterface.bound)
|
|
.keyboardType(.asciiCapable)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@available(iOS 14, macOS 11, *)
|
|
struct IPConfigurationSection: View {
|
|
@ObservedObject var config: UTMConfiguration
|
|
|
|
var body: some View {
|
|
Section(header: Text("IP Configuration"), footer: EmptyView().padding(.bottom)) {
|
|
Toggle(isOn: $config.networkIsolate, label: {
|
|
Text("Isolate Guest from Host")
|
|
})
|
|
Group {
|
|
HStack {
|
|
Text("Guest Network")
|
|
Spacer()
|
|
TextField("10.0.2.0/24", text: $config.networkAddress.bound)
|
|
.keyboardType(.asciiCapable)
|
|
}
|
|
HStack {
|
|
Text("Guest Network (IPv6)")
|
|
Spacer()
|
|
TextField("fec0::/64", text: $config.networkAddressIPv6.bound)
|
|
.keyboardType(.asciiCapable)
|
|
}
|
|
HStack {
|
|
Text("Host Address")
|
|
Spacer()
|
|
TextField("10.0.2.2", text: $config.networkHost.bound)
|
|
.keyboardType(.decimalPad)
|
|
}
|
|
HStack {
|
|
Text("Host Address (IPv6)")
|
|
Spacer()
|
|
TextField("fec0::2", text: $config.networkHostIPv6.bound)
|
|
.keyboardType(.asciiCapable)
|
|
}
|
|
HStack {
|
|
Text("DHCP Start")
|
|
Spacer()
|
|
TextField("10.0.2.0.15", text: $config.networkDhcpStart.bound)
|
|
.keyboardType(.decimalPad)
|
|
}
|
|
HStack {
|
|
Text("DHCP Host")
|
|
Spacer()
|
|
TextField("", text: $config.networkDhcpHost.bound)
|
|
.keyboardType(.asciiCapable)
|
|
}
|
|
HStack {
|
|
Text("DHCP Domain Name")
|
|
Spacer()
|
|
TextField("", text: $config.networkDhcpDomain.bound)
|
|
.keyboardType(.asciiCapable)
|
|
}
|
|
HStack {
|
|
Text("DNS Server")
|
|
Spacer()
|
|
TextField("10.0.2.0.15", text: $config.networkDnsServer.bound)
|
|
.keyboardType(.decimalPad)
|
|
}
|
|
HStack {
|
|
Text("DNS Server (IPv6)")
|
|
Spacer()
|
|
TextField("fec0::3", text: $config.networkDnsServerIPv6.bound)
|
|
.keyboardType(.asciiCapable)
|
|
}
|
|
HStack {
|
|
Text("DNS Search Domains")
|
|
Spacer()
|
|
TextField("", text: $config.networkDnsSearch.bound)
|
|
.keyboardType(.asciiCapable)
|
|
}
|
|
}
|
|
}.disableAutocorrection(true)
|
|
}
|
|
}
|
|
|
|
@available(iOS 14, macOS 11, *)
|
|
struct VMConfigNetworkingView_Previews: PreviewProvider {
|
|
@State static private var config = UTMConfiguration()
|
|
|
|
static var previews: some View {
|
|
VMConfigNetworkView(config: config)
|
|
}
|
|
}
|