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):
|
||||
self.support_wlan = True#support_wlan
|
||||
self.support_wlan = support_wlan
|
||||
self.devices = {} # Maps ifindex to Networkdev
|
||||
self.devices_by_name = {} # Maps interface names to Networkdev
|
||||
self.default_v4_gateway = None
|
||||
|
|
|
@ -36,9 +36,12 @@ from subiquitycore.ui.container import (
|
|||
Pile,
|
||||
WidgetWrap,
|
||||
)
|
||||
from subiquitycore.ui.stretchy import StretchyOverlay
|
||||
from subiquitycore.ui.table import ColSpec, TablePile, TableRow
|
||||
from subiquitycore.ui.utils import button_pile, Color, make_action_menu_row, Padding
|
||||
from .network_configure_manual_interface import EditNetworkStretchy
|
||||
from .network_configure_wlan_interface import NetworkConfigureWLANStretchy
|
||||
|
||||
from subiquitycore.view import BaseView
|
||||
|
||||
|
||||
|
@ -171,6 +174,9 @@ class NetworkView(BaseView):
|
|||
def _action_edit_ipv4(self, device):
|
||||
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):
|
||||
self.show_stretchy_overlay(EditNetworkStretchy(self, device, 6))
|
||||
|
||||
|
@ -211,6 +217,10 @@ class NetworkView(BaseView):
|
|||
addresses = '-'
|
||||
actions = [
|
||||
("Info", True, 'info', True),
|
||||
]
|
||||
if dev.type == "wlan":
|
||||
actions.append(("Edit WiFi", True, "edit_wlan", True))
|
||||
actions += [
|
||||
("Edit IPv4", True, 'edit_ipv4', True),
|
||||
("Edit IPv6", True, 'edit_ipv6', True),
|
||||
]
|
||||
|
@ -232,6 +242,8 @@ class NetworkView(BaseView):
|
|||
|
||||
def refresh_model_inputs(self):
|
||||
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):
|
||||
self.error_showing = True
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
import logging
|
||||
|
||||
from urwid import (
|
||||
BoxAdapter,
|
||||
connect_signal,
|
||||
LineBox,
|
||||
Text,
|
||||
)
|
||||
from subiquitycore.view import BaseView
|
||||
|
||||
from subiquitycore.ui.buttons import cancel_btn, menu_btn
|
||||
from subiquitycore.ui.container import (
|
||||
Columns,
|
||||
|
@ -13,8 +15,12 @@ from subiquitycore.ui.container import (
|
|||
WidgetWrap,
|
||||
)
|
||||
from subiquitycore.ui.form import Form, PasswordField, StringField
|
||||
from subiquitycore.ui.utils import Color, Padding
|
||||
import logging
|
||||
from subiquitycore.ui.stretchy import Stretchy
|
||||
from subiquitycore.ui.utils import (
|
||||
Color,
|
||||
disabled,
|
||||
Padding,
|
||||
)
|
||||
|
||||
log = logging.getLogger(
|
||||
'subiquitycore.network.network_configure_wlan_interface')
|
||||
|
@ -26,7 +32,7 @@ class NetworkList(WidgetWrap):
|
|||
self.parent = parent
|
||||
button = cancel_btn(_("Cancel"), on_press=self.do_cancel)
|
||||
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),
|
||||
Padding.fixed_10(button)])
|
||||
box = LineBox(p, title="Select a network")
|
||||
|
@ -34,10 +40,10 @@ class NetworkList(WidgetWrap):
|
|||
|
||||
def do_network(self, sender):
|
||||
self.parent.form.ssid.value = sender.label
|
||||
self.parent.remove_overlay()
|
||||
self.parent.parent.remove_overlay()
|
||||
|
||||
def do_cancel(self, sender):
|
||||
self.parent.remove_overlay()
|
||||
self.parent.parent.remove_overlay()
|
||||
|
||||
|
||||
class WLANForm(Form):
|
||||
|
@ -57,102 +63,91 @@ class WLANForm(Form):
|
|||
return "Password must be less than 63 characters long"
|
||||
|
||||
|
||||
class NetworkConfigureWLANView(BaseView):
|
||||
def __init__(self, model, controller, name):
|
||||
self.model = model
|
||||
self.controller = controller
|
||||
self.dev = self.model.get_netdev_by_name(name)
|
||||
self.title = _("Network interface {} WIFI configuration").format(name)
|
||||
class NetworkConfigureWLANStretchy(Stretchy):
|
||||
def __init__(self, parent, device):
|
||||
self.parent = parent
|
||||
self.device = device
|
||||
title = _("Network interface {} WIFI configuration").format(device.name)
|
||||
|
||||
self.form = WLANForm()
|
||||
|
||||
connect_signal(self.form, 'submit', self.done)
|
||||
connect_signal(self.form, 'cancel', self.cancel)
|
||||
|
||||
if self.dev.configured_ssid is not None:
|
||||
self.form.ssid.value = self.dev.configured_ssid
|
||||
if self.dev.configured_wifi_psk is not None:
|
||||
self.form.psk.value = self.dev.configured_wifi_psk
|
||||
if self.device.configured_ssid is not None:
|
||||
self.form.ssid.value = self.device.configured_ssid
|
||||
if self.device.configured_wifi_psk is not None:
|
||||
self.form.psk.value = self.device.configured_wifi_psk
|
||||
|
||||
self.ssid_row = self.form.ssid.as_row(self.form.longest_caption)
|
||||
self.psk_row = self.form.psk.as_row(self.form.longest_caption)
|
||||
self.ssid_row = self.form.ssid._table
|
||||
self.psk_row = self.form.psk._table
|
||||
self.ssid_row.bind(self.psk_row)
|
||||
|
||||
self.inputs = Pile(self._build_iface_inputs())
|
||||
|
||||
self.error = Text("")
|
||||
self.body = Pile([
|
||||
('pack', Text("")),
|
||||
ListBox([Padding.center_79(self.inputs)]),
|
||||
('pack', Pile([
|
||||
('pack', Text("")),
|
||||
Padding.center_79(Color.info_error(self.error)),
|
||||
self.form.buttons,
|
||||
('pack', Text("")),
|
||||
])),
|
||||
])
|
||||
self.orig_w = None
|
||||
super().__init__(self.body)
|
||||
widgets = [
|
||||
self.inputs,
|
||||
Padding.center_79(Color.info_error(self.error)),
|
||||
self.form.buttons,
|
||||
]
|
||||
super().__init__(title, widgets, 0, 0)
|
||||
|
||||
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):
|
||||
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:
|
||||
self.controller.start_scan(self.dev)
|
||||
self.parent.controller.start_scan(self.device)
|
||||
except RuntimeError as r:
|
||||
log.exception("start_scan failed")
|
||||
self.error.set_text("%s" % (r,))
|
||||
|
||||
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",
|
||||
on_press=self.show_ssid_list)
|
||||
else:
|
||||
networks_btn = Color.info_minor(Columns(
|
||||
[
|
||||
('fixed', 1, Text("")),
|
||||
Text("No visible networks"),
|
||||
('fixed', 1, Text(">"))
|
||||
], dividechars=1))
|
||||
networks_btn = disabled(menu_btn("No visible networks"))
|
||||
|
||||
if not self.dev.scan_state:
|
||||
if not self.device.scan_state:
|
||||
scan_btn = menu_btn("Scan for networks", on_press=self.start_scan)
|
||||
else:
|
||||
scan_btn = Color.info_minor(Columns(
|
||||
[
|
||||
('fixed', 1, Text("")),
|
||||
Text("Scanning for networks"),
|
||||
('fixed', 1, Text(">"))
|
||||
], dividechars=1))
|
||||
scan_btn = disabled(menu_btn("Scanning for networks"))
|
||||
|
||||
warning = (
|
||||
"Only open or WPA2/PSK networks are supported at this time.")
|
||||
col = [
|
||||
Padding.center_79(Color.info_minor(Text(warning))),
|
||||
Padding.line_break(""),
|
||||
Text(warning),
|
||||
Text(""),
|
||||
self.ssid_row,
|
||||
Padding.fixed_30(networks_btn),
|
||||
Padding.fixed_30(scan_btn),
|
||||
Text(""),
|
||||
Padding.fixed_32(networks_btn),
|
||||
Padding.fixed_32(scan_btn),
|
||||
Text(""),
|
||||
self.psk_row,
|
||||
]
|
||||
return col
|
||||
|
||||
def refresh_model_inputs(self):
|
||||
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:
|
||||
# The interface is gone
|
||||
self.controller.default()
|
||||
self.parent.remove_overlay()
|
||||
return
|
||||
self.inputs.contents = [(obj, ('pack', None))
|
||||
for obj in self._build_iface_inputs()]
|
||||
|
||||
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
|
||||
# the first time...
|
||||
self.dev.dhcp4 = True
|
||||
self.device.dhcp4 = True
|
||||
if self.form.ssid.value:
|
||||
ssid = self.form.ssid.value
|
||||
else:
|
||||
|
@ -161,8 +156,8 @@ class NetworkConfigureWLANView(BaseView):
|
|||
psk = self.form.psk.value
|
||||
else:
|
||||
psk = None
|
||||
self.dev.set_ssid_psk(ssid, psk)
|
||||
self.controller.network_configure_interface(self.dev.name)
|
||||
self.device.set_ssid_psk(ssid, psk)
|
||||
self.parent.remove_overlay()
|
||||
|
||||
def cancel(self, sender=None):
|
||||
self.controller.network_configure_interface(self.dev.name)
|
||||
self.parent.remove_overlay()
|
||||
|
|
Loading…
Reference in New Issue