network: improve NetworkManager support

This commit is contained in:
alfrix 2022-11-23 21:09:39 -03:00
parent db48bb8a1f
commit c630178f0c
5 changed files with 125 additions and 154 deletions

View File

@ -116,7 +116,7 @@ and reboot, that should make the touch work, if your screen is rotated 180 degre
KlipperScreen was never intended to be used with OctoPrint, and there is no support for it. KlipperScreen was never intended to be used with OctoPrint, and there is no support for it.
## WiFi networks not listed ## WiFi networks not listed (Using wpa_supplicant as backend)
This can be caused because of the user is not allowed to control the interface This can be caused because of the user is not allowed to control the interface
@ -137,13 +137,42 @@ usermod -a -G netdev pi
Then reboot the machine: Then reboot the machine:
``` ```sh
systemctl reboot systemctl reboot
``` ```
!!! tip !!! tip
It's possible to just restart KlipperScreen and networking It's possible to just restart KlipperScreen and networking
## WiFi networks not listed (Using NetworkManager as backend)
`[wifi_nm.py:rescan()] [...] NetworkManager.wifi.scan request failed: not authorized`
If you see the above permission error in the log you may need to use polkit or disable it:
```sh
mkdir -p /etc/NetworkManager/conf.d
sudo nano /etc/NetworkManager/conf.d/any-user.conf
```
in the editor paste this:
```conf
[main]
auth-polkit=false
```
Then restart the service:
```sh
systemctl restart NetworkManager.service
```
!!! tip
It's possible to just restart KlipperScreen and NetworkManager
## Other issues ## Other issues
If you found an issue not listed here, or can't make it work, please provide all the log files If you found an issue not listed here, or can't make it work, please provide all the log files

View File

@ -16,31 +16,25 @@ class WifiManager:
networks_in_supplicant = [] networks_in_supplicant = []
connected = False connected = False
_stop_loop = False _stop_loop = False
thread = None
def __init__(self, interface, *args, **kwargs): def __init__(self, interface, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.loop = None
self._poll_task = None
self._scanning = False
self._callbacks = { self._callbacks = {
"connected": [], "connected": [],
"connecting_status": [], "connecting_status": [],
"scan_results": [] "scan_results": [],
"popup": [],
} }
self._stop_loop = False self._stop_loop = False
self.connected = False self.connected = False
self.connected_ssid = None self.connected_ssid = None
self.connecting_info = []
self.event = threading.Event() self.event = threading.Event()
self.initialized = False self.initialized = False
self.interface = interface self.interface = interface
self.networks = {} self.networks = {}
self.supplicant_networks = {} self.supplicant_networks = {}
self.queue = Queue() self.queue = Queue()
self.tasks = []
self.timeout = None self.timeout = None
self.scan_time = 0
ks_socket_file = "/tmp/.KS_wpa_supplicant" ks_socket_file = "/tmp/.KS_wpa_supplicant"
if os.path.exists(ks_socket_file): if os.path.exists(ks_socket_file):
@ -115,7 +109,7 @@ class WifiManager:
return False return False
logging.info(f"Attempting to connect to wifi: {netid}") logging.info(f"Attempting to connect to wifi: {netid}")
self.connecting_info = [f"Attempting to connect to {ssid}"] self.callback("connecting_status", f"Attempting to connect to {ssid}")
self.wpa_cli(f"SELECT_NETWORK {id}") self.wpa_cli(f"SELECT_NETWORK {id}")
self.save_wpa_conf() self.save_wpa_conf()
@ -195,7 +189,7 @@ class WifiManager:
for net in self.networks: for net in self.networks:
if mac == net['mac']: if mac == net['mac']:
return net return net
return None return {}
def get_networks(self): def get_networks(self):
return list(self.networks) return list(self.networks)
@ -203,12 +197,6 @@ class WifiManager:
def get_supplicant_networks(self): def get_supplicant_networks(self):
return self.supplicant_networks return self.supplicant_networks
def is_connected(self):
return self.connected
def is_initialized(self):
return self.initialized
def read_wpa_supplicant(self): def read_wpa_supplicant(self):
results = self.wpa_cli("LIST_NETWORKS").split('\n') results = self.wpa_cli("LIST_NETWORKS").split('\n')
results.pop(0) results.pop(0)
@ -222,13 +210,8 @@ class WifiManager:
} }
self.networks_in_supplicant.append(self.supplicant_networks[net[0]]) self.networks_in_supplicant.append(self.supplicant_networks[net[0]])
def remove_callback(self, name, callback):
if name in self._callbacks and callback in self._callbacks[name]:
self._callbacks[name].remove(callback)
def rescan(self): def rescan(self):
self.wpa_cli("SCAN", False) self.wpa_cli("SCAN", False)
return True
def save_wpa_conf(self): def save_wpa_conf(self):
logging.info("Saving WPA config") logging.info("Saving WPA config")
@ -340,9 +323,6 @@ class WpaSocket(Thread):
def skip_command(self): def skip_command(self):
self.skip_commands = self.skip_commands + 1 self.skip_commands = self.skip_commands + 1
def stop(self):
self._stop_loop = True
class WifiChannels: class WifiChannels:
@staticmethod @staticmethod

View File

@ -1,38 +1,22 @@
# Network in KlipperScreen is a connection in NetworkManager # Network in KlipperScreen is a connection in NetworkManager
# Interface in KlipperScreen is a device in NetworkManager # Interface in KlipperScreen is a device in NetworkManager
# Todo: import contextlib
# + Disable hotspot autoconnect when page is showing.
# - Use the security provided by the AP when adding a network
# + Consider removing hotspot from list of APs
# + Handle hidden networks or networks with no SSID better.
# - Fix responsiveness issue. Might be realated to DBusGMainLoop
# - The IP address for the ethernet is not right. It is from wifi.
# - Avahi does not announce the ethernet IP.
# - settings = con.GetSettings() sometimes fails
# - When adding and removing connections, make sure known_connections is updated as well.
import os
import logging import logging
import re
import socket
import threading
from threading import Thread
import NetworkManager
from queue import Queue
import uuid import uuid
from dbus.mainloop.glib import DBusGMainLoop import NetworkManager
import dbus import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gi import gi
gi.require_version('Gdk', '3.0') gi.require_version('Gdk', '3.0')
from gi.repository import GLib, Gdk from gi.repository import GLib
from ks_includes.wifi import WifiChannels from ks_includes.wifi import WifiChannels
class WifiManagerNM():
class WifiManager:
networks_in_supplicant = [] networks_in_supplicant = []
def __init__(self, interface_name, *args, **kwargs): def __init__(self, interface_name, *args, **kwargs):
@ -41,14 +25,14 @@ class WifiManagerNM():
self._callbacks = { self._callbacks = {
"connected": [], "connected": [],
"connecting_status": [], "connecting_status": [],
"scan_results": [] "scan_results": [],
"popup": [],
} }
self.connected = False self.connected = False
self.connected_ssid = None self.connected_ssid = None
self.connecting_info = []
self.interface_name = interface_name self.interface_name = interface_name
self.known_networks = {} # List of known connections self.known_networks = {} # List of known connections
self.visible_networks = {} # List of visible access points self.visible_networks = {} # List of visible access points
self.ssid_by_path = {} self.ssid_by_path = {}
self.path_by_ssid = {} self.path_by_ssid = {}
self.hidden_ssid_index = 0 self.hidden_ssid_index = 0
@ -58,31 +42,26 @@ class WifiManagerNM():
self.wifi_dev.OnAccessPointRemoved(self._ap_removed) self.wifi_dev.OnAccessPointRemoved(self._ap_removed)
self.wifi_dev.OnStateChanged(self._ap_state_changed) self.wifi_dev.OnStateChanged(self._ap_state_changed)
for ap in self.wifi_dev.GetAccessPoints(): for ap in self.wifi_dev.GetAccessPoints():
self._add_ap(ap) self._add_ap(ap)
self._update_known_connections() self._update_known_connections()
self._set_autoconnect_on_hotspot(False)
self.initialized = True self.initialized = True
def _update_known_connections(self): def _update_known_connections(self):
self.known_networks = {} self.known_networks = {}
for con in NetworkManager.Settings.ListConnections(): for con in NetworkManager.Settings.ListConnections():
settings = con.GetSettings() settings = con.GetSettings()
if "802-11-wireless" in settings and settings["802-11-wireless"]['ssid'] != "Recore": if "802-11-wireless" in settings:
ssid = settings["802-11-wireless"]['ssid'] ssid = settings["802-11-wireless"]['ssid']
self.known_networks[ssid] = con self.known_networks[ssid] = con
def _ap_added(self, nm, interface, signal, access_point): def _ap_added(self, nm, interface, signal, access_point):
try: with contextlib.suppress(NetworkManager.ObjectVanished):
access_point.OnPropertiesChanged(self._ap_prop_changed) access_point.OnPropertiesChanged(self._ap_prop_changed)
ssid = self._add_ap(access_point) ssid = self._add_ap(access_point)
for cb in self._callbacks['scan_results']: for cb in self._callbacks['scan_results']:
Gdk.threads_add_idle( args = (cb, [ssid], [])
GLib.PRIORITY_DEFAULT_IDLE, GLib.idle_add(*args)
cb, [ssid], [])
except NetworkManager.ObjectVanished:
pass
def _ap_removed(self, dev, interface, signal, access_point): def _ap_removed(self, dev, interface, signal, access_point):
path = access_point.object_path path = access_point.object_path
@ -90,41 +69,52 @@ class WifiManagerNM():
ssid = self.ssid_by_path[path] ssid = self.ssid_by_path[path]
self._remove_ap(path) self._remove_ap(path)
for cb in self._callbacks['scan_results']: for cb in self._callbacks['scan_results']:
Gdk.threads_add_idle( args = (cb, [ssid], [])
GLib.PRIORITY_DEFAULT_IDLE, GLib.idle_add(*args)
cb, [], [ssid])
def _ap_state_changed(self, nm, interface, signal, old_state, new_state, reason): def _ap_state_changed(self, nm, interface, signal, old_state, new_state, reason):
msg = "" msg = ""
if new_state == NetworkManager.NM_DEVICE_STATE_UNKNOWN: if new_state in (NetworkManager.NM_DEVICE_STATE_UNKNOWN, NetworkManager.NM_DEVICE_STATE_REASON_UNKNOWN):
msg = "the device's state is unknown" msg = "State is unknown"
elif new_state == NetworkManager.NM_DEVICE_STATE_UNMANAGED: elif new_state == NetworkManager.NM_DEVICE_STATE_UNMANAGED:
msg = "the device is recognized, but not managed by NetworkManager" msg = "Error: Not managed by NetworkManager"
elif new_state == NetworkManager.NM_DEVICE_STATE_UNAVAILABLE: elif new_state == NetworkManager.NM_DEVICE_STATE_UNAVAILABLE:
msg = "the device is managed by NetworkManager, but is not available for use. Reasons may include the wireless switched off, missing firmware, no ethernet carrier, missing supplicant or modem manager, etc." msg = "Error: Not available for use:\nReasons may include the wireless switched off, missing firmware, etc."
elif new_state == NetworkManager.NM_DEVICE_STATE_DISCONNECTED: elif new_state == NetworkManager.NM_DEVICE_STATE_DISCONNECTED:
msg = "the device can be activated, but is currently idle and not connected to a network." msg = "Currently disconnected"
elif new_state == NetworkManager.NM_DEVICE_STATE_PREPARE: elif new_state == NetworkManager.NM_DEVICE_STATE_PREPARE:
msg = "the device is preparing the connection to the network." msg = "Preparing the connection to the network"
elif new_state == NetworkManager.NM_DEVICE_STATE_CONFIG: elif new_state == NetworkManager.NM_DEVICE_STATE_CONFIG:
msg = "the device is connecting to the requested network." msg = "Connecting to the requested network..."
elif new_state == NetworkManager.NM_DEVICE_STATE_NEED_AUTH: elif new_state == NetworkManager.NM_DEVICE_STATE_NEED_AUTH:
msg = "the device requires more information to continue connecting to the requested network." msg = "Authorizing"
elif new_state == NetworkManager.NM_DEVICE_STATE_IP_CONFIG: elif new_state == NetworkManager.NM_DEVICE_STATE_IP_CONFIG:
msg = "the device is requesting IPv4 and/or IPv6 addresses and routing information from the network." msg = "Requesting IP addresses and routing information"
elif new_state == NetworkManager.NM_DEVICE_STATE_IP_CHECK: elif new_state == NetworkManager.NM_DEVICE_STATE_IP_CHECK:
msg = "the device is checking whether further action is required for the requested network connection." msg = "Checking whether further action is required for the requested network connection"
elif new_state == NetworkManager.NM_DEVICE_STATE_SECONDARIES:
msg = "Waiting for a secondary connection (like a VPN)"
elif new_state == NetworkManager.NM_DEVICE_STATE_ACTIVATED: elif new_state == NetworkManager.NM_DEVICE_STATE_ACTIVATED:
msg = "Connected" msg = "Connected"
elif new_state == NetworkManager.NM_DEVICE_STATE_DEACTIVATING:
msg = "A disconnection from the current network connection was requested"
elif new_state == NetworkManager.NM_DEVICE_STATE_FAILED:
msg = "Failed to connect to the requested network"
self.callback("popup", msg)
elif new_state == NetworkManager.NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED:
msg = "A dependency of the connection failed"
elif new_state == NetworkManager.NM_DEVICE_STATE_REASON_CARRIER:
msg = ""
else:
logging.info(f"State {new_state}")
if msg != "": if msg != "":
self.callback("connecting_status", msg) self.callback("connecting_status", msg)
if new_state == NetworkManager.NM_DEVICE_STATE_ACTIVATED: if new_state == NetworkManager.NM_DEVICE_STATE_ACTIVATED:
self.connected = True self.connected = True
for cb in self._callbacks['connected']: for cb in self._callbacks['connected']:
Gdk.threads_add_idle( args = (cb, self.get_connected_ssid(), None)
GLib.PRIORITY_DEFAULT_IDLE, GLib.idle_add(*args)
cb, self.get_connected_ssid(), None)
else: else:
self.connected = False self.connected = False
@ -134,7 +124,7 @@ class WifiManagerNM():
def _add_ap(self, ap): def _add_ap(self, ap):
ssid = ap.Ssid ssid = ap.Ssid
if ssid == "": if ssid == "":
ssid = f"(hidden-{self.hidden_ssid_index})" ssid = _("Hidden") + f" {self.hidden_ssid_index}"
self.hidden_ssid_index += 1 self.hidden_ssid_index += 1
self.ssid_by_path[ap.object_path] = ssid self.ssid_by_path[ap.object_path] = ssid
self.path_by_ssid[ssid] = ap.object_path self.path_by_ssid[ssid] = ap.object_path
@ -142,21 +132,17 @@ class WifiManagerNM():
return ssid return ssid
def _remove_ap(self, path): def _remove_ap(self, path):
ssid = self.ssid_by_path.pop(path, None) self.ssid_by_path.pop(path, None)
self.visible_networks.pop(path, None) self.visible_networks.pop(path, None)
def add_callback(self, name, callback): def add_callback(self, name, callback):
if name in self._callbacks and callback not in self._callbacks[name]: if name in self._callbacks and callback not in self._callbacks[name]:
self._callbacks[name].append(callback) self._callbacks[name].append(callback)
def remove_callback(self, name, callback): def callback(self, cb_type, msg):
if name in self._callbacks and callback in self._callbacks[name]: if cb_type in self._callbacks:
self._callbacks[name].remove(callback) for cb in self._callbacks[cb_type]:
GLib.idle_add(cb, msg)
def callback(self, type, msg):
if type in self._callbacks:
for cb in self._callbacks[type]:
Gdk.threads_add_idle(GLib.PRIORITY_DEFAULT_IDLE, cb, msg)
def add_network(self, ssid, psk): def add_network(self, ssid, psk):
aps = self._visible_networks_by_ssid() aps = self._visible_networks_by_ssid()
@ -185,22 +171,23 @@ class WifiManagerNM():
'method': 'auto' 'method': 'auto'
} }
} }
NetworkManager.Settings.AddConnection(new_connection) try:
NetworkManager.Settings.AddConnection(new_connection)
except dbus.exceptions.DBusException as e:
msg = _("Invalid password") if "802-11-wireless-security.psk" in e else f"{e}"
self.callback("popup", msg)
logging.info(f"Error adding network {e}")
self._update_known_connections() self._update_known_connections()
return True return True
def connect(self, ssid): def connect(self, ssid):
if ssid in self.known_networks: if ssid in self.known_networks:
conn = self.known_networks[ssid] conn = self.known_networks[ssid]
try: with contextlib.suppress(NetworkManager.ObjectVanished):
logging.info("Attempting to connect to wifi: %s" % id) msg = f"Connecting to: {ssid}"
logging.info(msg)
self.callback("connecting_status", msg)
NetworkManager.NetworkManager.ActivateConnection(conn, self.wifi_dev, "/") NetworkManager.NetworkManager.ActivateConnection(conn, self.wifi_dev, "/")
except NetworkManager.ObjectVanished:
pass
def _get_known_connections_by_uuid(self):
connections = NetworkManager.Settings.ListConnections()
return dict([(x.GetSettings()['connection']['uuid'], x) for x in connections])
def delete_network(self, ssid): def delete_network(self, ssid):
for ssid in self.known_networks: for ssid in self.known_networks:
@ -221,30 +208,27 @@ class WifiManagerNM():
aps = self.wifi_dev.GetAccessPoints() aps = self.wifi_dev.GetAccessPoints()
ret = {} ret = {}
for ap in aps: for ap in aps:
try: with contextlib.suppress(NetworkManager.ObjectVanished):
ret[ap.Ssid] = ap ret[ap.Ssid] = ap
except NetworkManager.ObjectVanished:
pass
return ret return ret
def get_network_info(self, ssid): def get_network_info(self, ssid):
netinfo = {}
if ssid in self.known_networks: if ssid in self.known_networks:
con = self.known_networks[ssid] con = self.known_networks[ssid]
try: with contextlib.suppress(NetworkManager.ObjectVanished):
settings = con.GetSettings() settings = con.GetSettings()
if settings and '802-11-wireless' in settings: if settings and '802-11-wireless' in settings:
return { netinfo.update({
"ssid": settings['802-11-wireless']['ssid'], "ssid": settings['802-11-wireless']['ssid'],
"connected": self.get_connected_ssid() == ssid "connected": self.get_connected_ssid() == ssid
} })
except NetworkManager.ObjectVanished:
pass
path = self.path_by_ssid[ssid] path = self.path_by_ssid[ssid]
aps = self.visible_networks aps = self.visible_networks
if path in aps: if path in aps:
ap = aps[path] ap = aps[path]
try: with contextlib.suppress(NetworkManager.ObjectVanished):
return { netinfo.update({
"mac": ap.HwAddress, "mac": ap.HwAddress,
"channel": WifiChannels.lookup(str(ap.Frequency))[1], "channel": WifiChannels.lookup(str(ap.Frequency))[1],
"configured": ssid in self.known_networks, "configured": ssid in self.known_networks,
@ -254,22 +238,22 @@ class WifiManagerNM():
"connected": self._get_connected_ap() == ap, "connected": self._get_connected_ap() == ap,
"encryption": self._get_encryption(ap.RsnFlags), "encryption": self._get_encryption(ap.RsnFlags),
"signal_level_dBm": str(ap.Strength) "signal_level_dBm": str(ap.Strength)
} })
except NetworkManager.ObjectVanished: return netinfo
pass
def _get_encryption(self, flags): @staticmethod
def _get_encryption(flags):
encryption = "" encryption = ""
if (flags & NetworkManager.NM_802_11_AP_SEC_PAIR_WEP40 or if (flags & NetworkManager.NM_802_11_AP_SEC_PAIR_WEP40 or
flags & NetworkManager.NM_802_11_AP_SEC_PAIR_WEP104 or flags & NetworkManager.NM_802_11_AP_SEC_PAIR_WEP104 or
flags & NetworkManager.NM_802_11_AP_SEC_GROUP_WEP40 or flags & NetworkManager.NM_802_11_AP_SEC_GROUP_WEP40 or
flags & NetworkManager.NM_802_11_AP_SEC_GROUP_WEP104): flags & NetworkManager.NM_802_11_AP_SEC_GROUP_WEP104):
encryption += "WEP " encryption += "WEP "
if (flags & NetworkManager.NM_802_11_AP_SEC_PAIR_TKIP or if (flags & NetworkManager.NM_802_11_AP_SEC_PAIR_TKIP or
flags & NetworkManager.NM_802_11_AP_SEC_GROUP_TKIP): flags & NetworkManager.NM_802_11_AP_SEC_GROUP_TKIP):
encryption += "TKIP " encryption += "TKIP "
if (flags & NetworkManager.NM_802_11_AP_SEC_PAIR_CCMP or if (flags & NetworkManager.NM_802_11_AP_SEC_PAIR_CCMP or
flags & NetworkManager.NM_802_11_AP_SEC_GROUP_CCMP): flags & NetworkManager.NM_802_11_AP_SEC_GROUP_CCMP):
encryption += "AES " encryption += "AES "
if flags & NetworkManager.NM_802_11_AP_SEC_KEY_MGMT_PSK: if flags & NetworkManager.NM_802_11_AP_SEC_KEY_MGMT_PSK:
encryption += "WPA-PSK " encryption += "WPA-PSK "
@ -281,26 +265,10 @@ class WifiManagerNM():
return list(set(list(self.known_networks.keys()) + list(self.ssid_by_path.values()))) return list(set(list(self.known_networks.keys()) + list(self.ssid_by_path.values())))
def get_supplicant_networks(self): def get_supplicant_networks(self):
return {ssid:{"ssid": ssid} for ssid in self.known_networks.keys()} return {ssid: {"ssid": ssid} for ssid in self.known_networks.keys()}
def is_connected(self):
return self.connected
def is_initialized(self):
return self.initialized
def _set_autoconnect_on_hotspot(self, value):
for con in NetworkManager.Settings.ListConnections():
settings = con.GetSettings()
if "802-11-wireless" in settings and settings["802-11-wireless"]['ssid'] == "Recore":
old_val = settings["connection"]["autoconnect"]
if old_val != value:
settings["connection"]["autoconnect"] = value
con.Update(settings)
def rescan(self): def rescan(self):
try: try:
self.wifi_dev.RequestScan({}) self.wifi_dev.RequestScan({})
except dbus.exceptions.DBusException: except dbus.exceptions.DBusException as e:
return False logging.error(f"Error during rescan {e}")
return True

View File

@ -26,16 +26,16 @@ class NetworkPanel(ScreenPanel):
self.network_interfaces = netifaces.interfaces() self.network_interfaces = netifaces.interfaces()
self.wireless_interfaces = [iface for iface in self.network_interfaces if iface.startswith('w')] self.wireless_interfaces = [iface for iface in self.network_interfaces if iface.startswith('w')]
self.wifi = None self.wifi = None
self.use_network_manager = os.system('systemctl is-active --quiet NetworkManager.service') == 0 self.use_network_manager = os.system('systemctl is-active --quiet NetworkManager.service') == 0
if len(self.wireless_interfaces) > 0: if len(self.wireless_interfaces) > 0:
logging.info(f"Found wireless interfaces: {self.wireless_interfaces}") logging.info(f"Found wireless interfaces: {self.wireless_interfaces}")
if self.use_network_manager: if self.use_network_manager:
from ks_includes.wifi_nm import WifiManagerNM logging.info("Using NetworkManager")
self.wifi = WifiManagerNM(self.wireless_interfaces[0]) from ks_includes.wifi_nm import WifiManager
else: else:
logging.info("Using wpa_cli")
from ks_includes.wifi import WifiManager from ks_includes.wifi import WifiManager
self.wifi = WifiManager(self.wireless_interfaces[0]) self.wifi = WifiManager(self.wireless_interfaces[0])
# Get IP Address # Get IP Address
gws = netifaces.gateways() gws = netifaces.gateways()
@ -83,7 +83,7 @@ class NetworkPanel(ScreenPanel):
self.labels['networklist'] = Gtk.Grid() self.labels['networklist'] = Gtk.Grid()
if self.wifi is not None and self.wifi.is_initialized(): if self.wifi is not None and self.wifi.initialized:
box.pack_start(sbox, False, False, 5) box.pack_start(sbox, False, False, 5)
box.pack_start(scroll, True, True, 0) box.pack_start(scroll, True, True, 0)
@ -92,6 +92,7 @@ class NetworkPanel(ScreenPanel):
self.wifi.add_callback("connected", self.connected_callback) self.wifi.add_callback("connected", self.connected_callback)
self.wifi.add_callback("scan_results", self.scan_callback) self.wifi.add_callback("scan_results", self.scan_callback)
self.wifi.add_callback("popup", self.popup_callback)
if self.update_timeout is None: if self.update_timeout is None:
self.update_timeout = GLib.timeout_add_seconds(5, self.update_all_networks) self.update_timeout = GLib.timeout_add_seconds(5, self.update_all_networks)
else: else:
@ -108,13 +109,10 @@ class NetworkPanel(ScreenPanel):
def load_networks(self): def load_networks(self):
networks = self.wifi.get_networks() networks = self.wifi.get_networks()
if not networks: if not networks:
return return
for net in networks: for net in networks:
self.add_network(net, False) self.add_network(net, False)
self.update_all_networks() self.update_all_networks()
self.content.show_all() self.content.show_all()
@ -124,7 +122,6 @@ class NetworkPanel(ScreenPanel):
return return
ssid = ssid.strip() ssid = ssid.strip()
if ssid in list(self.networks): if ssid in list(self.networks):
logging.info("SSID already listed")
return return
configured_networks = self.wifi.get_supplicant_networks() configured_networks = self.wifi.get_supplicant_networks()
@ -256,6 +253,9 @@ class NetworkPanel(ScreenPanel):
del self.labels[i] del self.labels[i]
self.show_add = False self.show_add = False
def popup_callback(self, msg):
self._screen.show_popup_message(msg)
def connected_callback(self, ssid, prev_ssid): def connected_callback(self, ssid, prev_ssid):
logging.info("Now connected to a new network") logging.info("Now connected to a new network")
if ssid is not None: if ssid is not None:
@ -284,12 +284,7 @@ class NetworkPanel(ScreenPanel):
{"name": _("Close"), "response": Gtk.ResponseType.CANCEL} {"name": _("Close"), "response": Gtk.ResponseType.CANCEL}
] ]
scroll = Gtk.ScrolledWindow() scroll = self._gtk.ScrolledWindow()
scroll.set_property("overlay-scrolling", False)
scroll.set_hexpand(True)
scroll.set_vexpand(True)
scroll.add_events(Gdk.EventMask.TOUCH_MASK)
scroll.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
self.labels['connecting_info'] = Gtk.Label(_("Starting WiFi Association")) self.labels['connecting_info'] = Gtk.Label(_("Starting WiFi Association"))
self.labels['connecting_info'].set_halign(Gtk.Align.START) self.labels['connecting_info'].set_halign(Gtk.Align.START)
self.labels['connecting_info'].set_valign(Gtk.Align.START) self.labels['connecting_info'].set_valign(Gtk.Align.START)
@ -387,8 +382,6 @@ class NetworkPanel(ScreenPanel):
logging.info(f"Unknown SSID {ssid}") logging.info(f"Unknown SSID {ssid}")
return return
netinfo = self.wifi.get_network_info(ssid) netinfo = self.wifi.get_network_info(ssid)
if netinfo is None:
netinfo = {}
if "connected" in netinfo: if "connected" in netinfo:
connected = netinfo['connected'] connected = netinfo['connected']
else: else:
@ -443,7 +436,7 @@ class NetworkPanel(ScreenPanel):
def reload_networks(self, widget=None): def reload_networks(self, widget=None):
self.networks = {} self.networks = {}
self.labels['networklist'].remove_column(0) self.labels['networklist'].remove_column(0)
if self.wifi is not None and self.wifi.is_initialized(): if self.wifi is not None and self.wifi.initialized:
self.wifi.rescan() self.wifi.rescan()
GLib.idle_add(self.load_networks) GLib.idle_add(self.load_networks)
@ -451,7 +444,7 @@ class NetworkPanel(ScreenPanel):
if self.initialized: if self.initialized:
self.reload_networks() self.reload_networks()
if self.update_timeout is None: if self.update_timeout is None:
if self.wifi is not None and self.wifi.is_initialized(): if self.wifi is not None and self.wifi.initialized:
self.update_timeout = GLib.timeout_add_seconds(5, self.update_all_networks) self.update_timeout = GLib.timeout_add_seconds(5, self.update_all_networks)
else: else:
self.update_timeout = GLib.timeout_add_seconds(5, self.update_single_network_info) self.update_timeout = GLib.timeout_add_seconds(5, self.update_single_network_info)

View File

@ -4,3 +4,4 @@ requests==2.28.1
websocket-client==1.4.2 websocket-client==1.4.2
pycairo==1.21.0 pycairo==1.21.0
PyGObject==3.42.2 PyGObject==3.42.2
python-networkmanager==2.2