UI for entering name servers/domains

This commit is contained in:
Michael Hudson-Doyle 2016-10-20 22:31:10 +13:00
parent 67f2ee4cda
commit 7edcf3bcb7
2 changed files with 45 additions and 18 deletions

View File

@ -137,9 +137,9 @@ class Networkdev():
ap['password'] = self.wpa_psk
if any(self.nameservers):
result['network']['nameservers'] = {}
result['network']['nameservers']['addresses'] = self.nameservers
result['network']['nameservers']['search'] = self.search_domains
result['nameservers'] = {}
result['nameservers']['addresses'] = self.nameservers
result['nameservers']['search'] = self.search_domains
return result
@ -274,8 +274,8 @@ class Networkdev():
elif family == netifaces.AF_INET6:
self.ipv6_addresses.append(address)
self.gateway6 = network['gateway']
self.nameservers.append(network['nameserver'])
self.search_domains.append(network['searchdomains'])
self.nameservers.extend(network['nameservers'])
self.search_domains.extend(network['searchdomains'])
def valid_ipv4_address(addr):

View File

@ -20,6 +20,7 @@ from subiquitycore.ui.utils import Color, Padding
from subiquitycore.ui.interactive import StringEditor
import logging
import netifaces
import ipaddress
log = logging.getLogger('subiquitycore.network.network_configure_ipv4_interface')
@ -79,7 +80,25 @@ class NetworkConfigureIPv4InterfaceView(BaseView):
focus_map="string_input focus")),
("weight", 0.5, Text(""))
], 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)
@ -119,27 +138,35 @@ class NetworkConfigureIPv4InterfaceView(BaseView):
]
return Pile(buttons)
def validate(self):
try:
if '/' not in self.subnet_input.value:
raise ValueError("Network should be in CIDR form (xx.xx.xx.xx/yy)")
def validate(self, result):
if '/' not in result['network']:
raise ValueError("Network should be in CIDR form (xx.xx.xx.xx/yy)")
netmask = self.subnet_input.value.split('/')[1]
if int(netmask) > 32 or int(netmask) < 0:
raise ValueError("CIDR netmask value should be between 0 and 32")
except:
raise
netmask = result['network'].split('/')[1]
if int(netmask) > 32 or int(netmask) < 0:
raise ValueError("CIDR netmask value should be between 0 and 32")
for ns in result['nameservers']:
try:
ipaddress.ip_address(ns)
except ValueError as v:
raise ValueError("Nameserver " + str(v))
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 = {
'network': self.subnet_input.value,
'address': self.address_input.value,
'gateway': self.gateway_input.value,
'nameserver': self.nameserver_input.value,
'searchdomains': self.searchdomains_input.value,
'nameservers': nameservers,
'searchdomains': searchdomains,
}
try:
self.validate()
self.validate(result)
self.iface.remove_networks()
self.iface.add_network(netifaces.AF_INET, result)
except ValueError as e: