add wlan editing

This commit is contained in:
Michael Hudson-Doyle 2018-06-27 14:20:53 +12:00
parent 2e281d00d4
commit 7d15727b74
3 changed files with 66 additions and 59 deletions

View File

@ -313,7 +313,7 @@ class NetworkModel(object):
} }
def __init__(self, support_wlan=True): def __init__(self, support_wlan=True):
self.support_wlan = True#support_wlan self.support_wlan = support_wlan
self.devices = {} # Maps ifindex to Networkdev self.devices = {} # Maps ifindex to Networkdev
self.devices_by_name = {} # Maps interface names to Networkdev self.devices_by_name = {} # Maps interface names to Networkdev
self.default_v4_gateway = None self.default_v4_gateway = None

View File

@ -36,9 +36,12 @@ from subiquitycore.ui.container import (
Pile, Pile,
WidgetWrap, WidgetWrap,
) )
from subiquitycore.ui.stretchy import StretchyOverlay
from subiquitycore.ui.table import ColSpec, TablePile, TableRow from subiquitycore.ui.table import ColSpec, TablePile, TableRow
from subiquitycore.ui.utils import button_pile, Color, make_action_menu_row, Padding from subiquitycore.ui.utils import button_pile, Color, make_action_menu_row, Padding
from .network_configure_manual_interface import EditNetworkStretchy from .network_configure_manual_interface import EditNetworkStretchy
from .network_configure_wlan_interface import NetworkConfigureWLANStretchy
from subiquitycore.view import BaseView from subiquitycore.view import BaseView
@ -171,6 +174,9 @@ class NetworkView(BaseView):
def _action_edit_ipv4(self, device): def _action_edit_ipv4(self, device):
self.show_stretchy_overlay(EditNetworkStretchy(self, device, 4)) self.show_stretchy_overlay(EditNetworkStretchy(self, device, 4))
def _action_edit_wlan(self, device):
self.show_stretchy_overlay(NetworkConfigureWLANStretchy(self, device))
def _action_edit_ipv6(self, device): def _action_edit_ipv6(self, device):
self.show_stretchy_overlay(EditNetworkStretchy(self, device, 6)) self.show_stretchy_overlay(EditNetworkStretchy(self, device, 6))
@ -211,6 +217,10 @@ class NetworkView(BaseView):
addresses = '-' addresses = '-'
actions = [ actions = [
("Info", True, 'info', True), ("Info", True, 'info', True),
]
if dev.type == "wlan":
actions.append(("Edit WiFi", True, "edit_wlan", True))
actions += [
("Edit IPv4", True, 'edit_ipv4', True), ("Edit IPv4", True, 'edit_ipv4', True),
("Edit IPv6", True, 'edit_ipv6', True), ("Edit IPv6", True, 'edit_ipv6', True),
] ]
@ -232,6 +242,8 @@ class NetworkView(BaseView):
def refresh_model_inputs(self): def refresh_model_inputs(self):
self.device_table.set_contents(self._build_model_inputs()) self.device_table.set_contents(self._build_model_inputs())
if isinstance(self._w, StretchyOverlay) and hasattr(self._w.stretchy, 'refresh_model_inputs'):
self._w.stretchy.refresh_model_inputs()
def show_network_error(self, action, info=None): def show_network_error(self, action, info=None):
self.error_showing = True self.error_showing = True

View File

@ -1,10 +1,12 @@
import logging
from urwid import ( from urwid import (
BoxAdapter, BoxAdapter,
connect_signal, connect_signal,
LineBox, LineBox,
Text, Text,
) )
from subiquitycore.view import BaseView
from subiquitycore.ui.buttons import cancel_btn, menu_btn from subiquitycore.ui.buttons import cancel_btn, menu_btn
from subiquitycore.ui.container import ( from subiquitycore.ui.container import (
Columns, Columns,
@ -13,8 +15,12 @@ from subiquitycore.ui.container import (
WidgetWrap, WidgetWrap,
) )
from subiquitycore.ui.form import Form, PasswordField, StringField from subiquitycore.ui.form import Form, PasswordField, StringField
from subiquitycore.ui.utils import Color, Padding from subiquitycore.ui.stretchy import Stretchy
import logging from subiquitycore.ui.utils import (
Color,
disabled,
Padding,
)
log = logging.getLogger( log = logging.getLogger(
'subiquitycore.network.network_configure_wlan_interface') 'subiquitycore.network.network_configure_wlan_interface')
@ -26,7 +32,7 @@ class NetworkList(WidgetWrap):
self.parent = parent self.parent = parent
button = cancel_btn(_("Cancel"), on_press=self.do_cancel) button = cancel_btn(_("Cancel"), on_press=self.do_cancel)
ssid_list = [menu_btn(label=ssid, on_press=self.do_network) ssid_list = [menu_btn(label=ssid, on_press=self.do_network)
for ssid in ssids] for ssid in ssids if ssid]
p = Pile([BoxAdapter(ListBox(ssid_list), height=10), p = Pile([BoxAdapter(ListBox(ssid_list), height=10),
Padding.fixed_10(button)]) Padding.fixed_10(button)])
box = LineBox(p, title="Select a network") box = LineBox(p, title="Select a network")
@ -34,10 +40,10 @@ class NetworkList(WidgetWrap):
def do_network(self, sender): def do_network(self, sender):
self.parent.form.ssid.value = sender.label self.parent.form.ssid.value = sender.label
self.parent.remove_overlay() self.parent.parent.remove_overlay()
def do_cancel(self, sender): def do_cancel(self, sender):
self.parent.remove_overlay() self.parent.parent.remove_overlay()
class WLANForm(Form): class WLANForm(Form):
@ -57,102 +63,91 @@ class WLANForm(Form):
return "Password must be less than 63 characters long" return "Password must be less than 63 characters long"
class NetworkConfigureWLANView(BaseView): class NetworkConfigureWLANStretchy(Stretchy):
def __init__(self, model, controller, name): def __init__(self, parent, device):
self.model = model self.parent = parent
self.controller = controller self.device = device
self.dev = self.model.get_netdev_by_name(name) title = _("Network interface {} WIFI configuration").format(device.name)
self.title = _("Network interface {} WIFI configuration").format(name)
self.form = WLANForm() self.form = WLANForm()
connect_signal(self.form, 'submit', self.done) connect_signal(self.form, 'submit', self.done)
connect_signal(self.form, 'cancel', self.cancel) connect_signal(self.form, 'cancel', self.cancel)
if self.dev.configured_ssid is not None: if self.device.configured_ssid is not None:
self.form.ssid.value = self.dev.configured_ssid self.form.ssid.value = self.device.configured_ssid
if self.dev.configured_wifi_psk is not None: if self.device.configured_wifi_psk is not None:
self.form.psk.value = self.dev.configured_wifi_psk self.form.psk.value = self.device.configured_wifi_psk
self.ssid_row = self.form.ssid.as_row(self.form.longest_caption) self.ssid_row = self.form.ssid._table
self.psk_row = self.form.psk.as_row(self.form.longest_caption) self.psk_row = self.form.psk._table
self.ssid_row.bind(self.psk_row)
self.inputs = Pile(self._build_iface_inputs()) self.inputs = Pile(self._build_iface_inputs())
self.error = Text("") self.error = Text("")
self.body = Pile([ widgets = [
('pack', Text("")), self.inputs,
ListBox([Padding.center_79(self.inputs)]), Padding.center_79(Color.info_error(self.error)),
('pack', Pile([ self.form.buttons,
('pack', Text("")), ]
Padding.center_79(Color.info_error(self.error)), super().__init__(title, widgets, 0, 0)
self.form.buttons,
('pack', Text("")),
])),
])
self.orig_w = None
super().__init__(self.body)
def show_ssid_list(self, sender): def show_ssid_list(self, sender):
self.show_overlay(NetworkList(self, self.dev.actual_ssids)) self.parent.show_overlay(NetworkList(self, self.device.actual_ssids), width=60)
def start_scan(self, sender): def start_scan(self, sender):
self.keypress((0, 0), 'up') fp = self.inputs.focus_position - 1
while not self.inputs.contents[fp][0].selectable():
fp -= 1
self.inputs.focus_position = fp
try: try:
self.controller.start_scan(self.dev) self.parent.controller.start_scan(self.device)
except RuntimeError as r: except RuntimeError as r:
log.exception("start_scan failed") log.exception("start_scan failed")
self.error.set_text("%s" % (r,)) self.error.set_text("%s" % (r,))
def _build_iface_inputs(self): def _build_iface_inputs(self):
if len(self.dev.actual_ssids) > 0: if len(self.device.actual_ssids) > 0:
networks_btn = menu_btn("Choose a visible network", networks_btn = menu_btn("Choose a visible network",
on_press=self.show_ssid_list) on_press=self.show_ssid_list)
else: else:
networks_btn = Color.info_minor(Columns( networks_btn = disabled(menu_btn("No visible networks"))
[
('fixed', 1, Text("")),
Text("No visible networks"),
('fixed', 1, Text(">"))
], dividechars=1))
if not self.dev.scan_state: if not self.device.scan_state:
scan_btn = menu_btn("Scan for networks", on_press=self.start_scan) scan_btn = menu_btn("Scan for networks", on_press=self.start_scan)
else: else:
scan_btn = Color.info_minor(Columns( scan_btn = disabled(menu_btn("Scanning for networks"))
[
('fixed', 1, Text("")),
Text("Scanning for networks"),
('fixed', 1, Text(">"))
], dividechars=1))
warning = ( warning = (
"Only open or WPA2/PSK networks are supported at this time.") "Only open or WPA2/PSK networks are supported at this time.")
col = [ col = [
Padding.center_79(Color.info_minor(Text(warning))), Text(warning),
Padding.line_break(""), Text(""),
self.ssid_row, self.ssid_row,
Padding.fixed_30(networks_btn), Text(""),
Padding.fixed_30(scan_btn), Padding.fixed_32(networks_btn),
Padding.fixed_32(scan_btn),
Text(""),
self.psk_row, self.psk_row,
] ]
return col return col
def refresh_model_inputs(self): def refresh_model_inputs(self):
try: try:
self.dev = self.model.get_netdev_by_name(self.dev.name) self.device = self.parent.model.get_netdev_by_name(self.device.name)
except KeyError: except KeyError:
# The interface is gone # The interface is gone
self.controller.default() self.parent.remove_overlay()
return return
self.inputs.contents = [(obj, ('pack', None)) self.inputs.contents = [(obj, ('pack', None))
for obj in self._build_iface_inputs()] for obj in self._build_iface_inputs()]
def done(self, sender): def done(self, sender):
if self.dev.configured_ssid is None and self.form.ssid.value: if self.device.configured_ssid is None and self.form.ssid.value:
# Turn DHCP4 on by default when specifying an SSID for # Turn DHCP4 on by default when specifying an SSID for
# the first time... # the first time...
self.dev.dhcp4 = True self.device.dhcp4 = True
if self.form.ssid.value: if self.form.ssid.value:
ssid = self.form.ssid.value ssid = self.form.ssid.value
else: else:
@ -161,8 +156,8 @@ class NetworkConfigureWLANView(BaseView):
psk = self.form.psk.value psk = self.form.psk.value
else: else:
psk = None psk = None
self.dev.set_ssid_psk(ssid, psk) self.device.set_ssid_psk(ssid, psk)
self.controller.network_configure_interface(self.dev.name) self.parent.remove_overlay()
def cancel(self, sender=None): def cancel(self, sender=None):
self.controller.network_configure_interface(self.dev.name) self.parent.remove_overlay()