add wlan editing
This commit is contained in:
parent
2e281d00d4
commit
7d15727b74
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue