Merge pull request #175 from CanonicalLtd/mwhudson/nameservers-ui
add UI for entering nameservers
This commit is contained in:
commit
aa058727f7
|
@ -136,6 +136,11 @@ class Networkdev():
|
||||||
if self.wpa_psk is not None:
|
if self.wpa_psk is not None:
|
||||||
ap['password'] = self.wpa_psk
|
ap['password'] = self.wpa_psk
|
||||||
|
|
||||||
|
if any(self.nameservers):
|
||||||
|
result['nameservers'] = {}
|
||||||
|
result['nameservers']['addresses'] = self.nameservers
|
||||||
|
result['nameservers']['search'] = self.search_domains
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -269,8 +274,8 @@ class Networkdev():
|
||||||
elif family == netifaces.AF_INET6:
|
elif family == netifaces.AF_INET6:
|
||||||
self.ipv6_addresses.append(address)
|
self.ipv6_addresses.append(address)
|
||||||
self.gateway6 = network['gateway']
|
self.gateway6 = network['gateway']
|
||||||
self.nameservers.append(network['nameserver'])
|
self.nameservers.extend(network['nameservers'])
|
||||||
self.search_domains.append(network['searchdomains'])
|
self.search_domains.extend(network['searchdomains'])
|
||||||
|
|
||||||
|
|
||||||
def valid_ipv4_address(addr):
|
def valid_ipv4_address(addr):
|
||||||
|
|
|
@ -20,6 +20,7 @@ from subiquitycore.ui.utils import Color, Padding
|
||||||
from subiquitycore.ui.interactive import StringEditor
|
from subiquitycore.ui.interactive import StringEditor
|
||||||
import logging
|
import logging
|
||||||
import netifaces
|
import netifaces
|
||||||
|
import ipaddress
|
||||||
|
|
||||||
log = logging.getLogger('subiquitycore.network.network_configure_ipv4_interface')
|
log = logging.getLogger('subiquitycore.network.network_configure_ipv4_interface')
|
||||||
|
|
||||||
|
@ -79,7 +80,25 @@ class NetworkConfigureIPv4InterfaceView(BaseView):
|
||||||
focus_map="string_input focus")),
|
focus_map="string_input focus")),
|
||||||
("weight", 0.5, Text(""))
|
("weight", 0.5, Text(""))
|
||||||
], dividechars=2
|
], dividechars=2
|
||||||
)
|
),
|
||||||
|
Columns(
|
||||||
|
[
|
||||||
|
("weight", 0.2, Text("Name servers:")),
|
||||||
|
("weight", 0.3,
|
||||||
|
Color.string_input(self.nameserver_input,
|
||||||
|
focus_map="string_input focus")),
|
||||||
|
("weight", 0.5, Text("IP addresses, comma separated"))
|
||||||
|
], dividechars=2
|
||||||
|
),
|
||||||
|
Columns(
|
||||||
|
[
|
||||||
|
("weight", 0.2, Text("Search domains:")),
|
||||||
|
("weight", 0.3,
|
||||||
|
Color.string_input(self.searchdomains_input,
|
||||||
|
focus_map="string_input focus")),
|
||||||
|
("weight", 0.5, Text("Domains, comma separated"))
|
||||||
|
], dividechars=2
|
||||||
|
),
|
||||||
]
|
]
|
||||||
return Pile(col1)
|
return Pile(col1)
|
||||||
|
|
||||||
|
@ -119,27 +138,35 @@ class NetworkConfigureIPv4InterfaceView(BaseView):
|
||||||
]
|
]
|
||||||
return Pile(buttons)
|
return Pile(buttons)
|
||||||
|
|
||||||
def validate(self):
|
def validate(self, result):
|
||||||
try:
|
if '/' not in result['network']:
|
||||||
if '/' not in self.subnet_input.value:
|
raise ValueError("Network should be in CIDR form (xx.xx.xx.xx/yy)")
|
||||||
raise ValueError("Network should be in CIDR form (xx.xx.xx.xx/yy)")
|
|
||||||
|
|
||||||
netmask = self.subnet_input.value.split('/')[1]
|
netmask = result['network'].split('/')[1]
|
||||||
if int(netmask) > 32 or int(netmask) < 0:
|
if int(netmask) > 32 or int(netmask) < 0:
|
||||||
raise ValueError("CIDR netmask value should be between 0 and 32")
|
raise ValueError("CIDR netmask value should be between 0 and 32")
|
||||||
except:
|
for ns in result['nameservers']:
|
||||||
raise
|
try:
|
||||||
|
ipaddress.ip_address(ns)
|
||||||
|
except ValueError as v:
|
||||||
|
raise ValueError("Nameserver " + str(v))
|
||||||
|
|
||||||
def done(self, btn):
|
def done(self, btn):
|
||||||
|
searchdomains = []
|
||||||
|
for ns in self.searchdomains_input.value.split(','):
|
||||||
|
searchdomains.append(ns.strip())
|
||||||
|
nameservers = []
|
||||||
|
for ns in self.nameserver_input.value.split(','):
|
||||||
|
nameservers.append(ns.strip())
|
||||||
result = {
|
result = {
|
||||||
'network': self.subnet_input.value,
|
'network': self.subnet_input.value,
|
||||||
'address': self.address_input.value,
|
'address': self.address_input.value,
|
||||||
'gateway': self.gateway_input.value,
|
'gateway': self.gateway_input.value,
|
||||||
'nameserver': self.nameserver_input.value,
|
'nameservers': nameservers,
|
||||||
'searchdomains': self.searchdomains_input.value,
|
'searchdomains': searchdomains,
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
self.validate()
|
self.validate(result)
|
||||||
self.iface.remove_networks()
|
self.iface.remove_networks()
|
||||||
self.iface.add_network(netifaces.AF_INET, result)
|
self.iface.add_network(netifaces.AF_INET, result)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
|
|
Loading…
Reference in New Issue