diff --git a/ks_includes/wifi.py b/ks_includes/wifi.py
index cc6c177b..32910d68 100644
--- a/ks_includes/wifi.py
+++ b/ks_includes/wifi.py
@@ -344,4 +344,4 @@ class WifiChannels:
elif 6455 <= freq <= 7115:
return "6", str(int((freq - 5950) / 5))
else:
- return None
+ return "?", "?"
diff --git a/ks_includes/wifi_nm.py b/ks_includes/wifi_nm.py
index 252bf219..4a2fc0f4 100644
--- a/ks_includes/wifi_nm.py
+++ b/ks_includes/wifi_nm.py
@@ -228,7 +228,7 @@ class WifiManager:
with suppress(NetworkManager.ObjectVanished):
netinfo.update({
"mac": ap.HwAddress,
- "channel": WifiChannels.lookup(str(ap.Frequency))[1],
+ "channel": WifiChannels.lookup(ap.Frequency)[1],
"configured": ssid in self.known_networks,
"frequency": str(ap.Frequency),
"flags": ap.Flags,
diff --git a/panels/network.py b/panels/network.py
index bce728d9..8c8c22b3 100644
--- a/panels/network.py
+++ b/panels/network.py
@@ -43,26 +43,24 @@ class Panel(ScreenPanel):
if 'lo' in ints:
ints.pop(ints.index('lo'))
self.interface = ints[0] if len(ints) > 0 else 'lo'
- res = netifaces.ifaddresses(self.interface)
- if netifaces.AF_INET in res and len(res[netifaces.AF_INET]) > 0:
- ip = res[netifaces.AF_INET][0]['addr']
- else:
- ip = None
self.labels['networks'] = {}
self.labels['interface'] = Gtk.Label(hexpand=True)
self.labels['interface'].set_text(f' {_("Interface")}: {self.interface} ')
+
self.labels['ip'] = Gtk.Label(hexpand=True)
- reload_networks = self._gtk.Button("refresh", None, "color1", .66)
+ ifadd = netifaces.ifaddresses(self.interface)
+ if ifadd.get(netifaces.AF_INET):
+ self.labels['ip'].set_text(f"IP: {ifadd[netifaces.AF_INET][0]['addr']} ")
+
+ reload_networks = self._gtk.Button("refresh", None, "color1", self.bts)
reload_networks.connect("clicked", self.reload_networks)
reload_networks.set_hexpand(False)
sbox = Gtk.Box(hexpand=True, vexpand=False)
sbox.add(self.labels['interface'])
- if ip is not None:
- self.labels['ip'].set_text(f"IP: {ip} ")
- sbox.add(self.labels['ip'])
+ sbox.add(self.labels['ip'])
sbox.add(reload_networks)
scroll = self._gtk.ScrolledWindow()
@@ -95,13 +93,15 @@ class Panel(ScreenPanel):
self.labels['main_box'] = box
self.initialized = True
- def load_networks(self):
+ def load_networks(self, widget=None):
networks = self.wifi.get_networks()
if not networks:
return
for net in networks:
self.add_network(net, False)
self.update_all_networks()
+ if widget:
+ GLib.timeout_add_seconds(10, self._gtk.Button_busy, widget, False)
self.content.show_all()
return False
@@ -124,16 +124,14 @@ class Panel(ScreenPanel):
connected_ssid = self.wifi.get_connected_ssid()
if netinfo is None:
logging.debug("Couldn't get netinfo")
- if connected_ssid == ssid:
- netinfo = {'connected': True}
- else:
- netinfo = {'connected': False}
-
- if connected_ssid == ssid:
- display_name += " (" + _("Connected") + ")"
+ netinfo = {'connected': connected_ssid == ssid}
name = Gtk.Label(hexpand=True, halign=Gtk.Align.START, wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR)
- name.set_markup(f"{display_name}")
+ if connected_ssid == ssid:
+ display_name += " (" + _("Connected") + ")"
+ name.set_markup(f"{display_name}")
+ else:
+ name.set_label(display_name)
info = Gtk.Label(halign=Gtk.Align.START)
labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, vexpand=True,
@@ -141,19 +139,18 @@ class Panel(ScreenPanel):
labels.add(name)
labels.add(info)
- connect = self._gtk.Button("load", None, "color3", .66)
+ connect = self._gtk.Button("load", None, "color3", self.bts)
connect.connect("clicked", self.connect_network, ssid)
connect.set_hexpand(False)
connect.set_halign(Gtk.Align.END)
- delete = self._gtk.Button("delete", None, "color3", .66)
+ delete = self._gtk.Button("delete", None, "color3", self.bts)
delete.connect("clicked", self.remove_wifi_network, ssid)
delete.set_hexpand(False)
delete.set_halign(Gtk.Align.END)
network = Gtk.Box(spacing=5, hexpand=True, vexpand=False)
network.get_style_context().add_class("frame-item")
-
network.add(labels)
buttons = Gtk.Box(spacing=5)
@@ -188,18 +185,14 @@ class Panel(ScreenPanel):
if show:
self.labels['networklist'].show()
- def add_new_network(self, widget, ssid, connect=False):
+ def add_new_network(self, widget, ssid):
self._screen.remove_keyboard()
- psk = self.labels['network_psk'].get_text()
- result = self.wifi.add_network(ssid, psk)
-
+ result = self.wifi.add_network(ssid, self.labels['network_psk'].get_text())
self.close_add_network()
-
- if connect:
- if result:
- self.connect_network(widget, ssid, False)
- else:
- self._screen.show_popup_message(f"Error adding network {ssid}")
+ if result:
+ self.connect_network(widget, ssid, False)
+ else:
+ self._screen.show_popup_message(f"Error adding network {ssid}")
def back(self):
if self.show_add:
@@ -243,14 +236,7 @@ class Panel(ScreenPanel):
self.check_missing_networks()
def connect_network(self, widget, ssid, showadd=True):
-
- snets = self.wifi.get_supplicant_networks()
- isdef = False
- for netid, net in snets.items():
- if net['ssid'] == ssid:
- isdef = True
- break
-
+ isdef = any(net['ssid'] == ssid for netid, net in self.wifi.get_supplicant_networks().items())
if not isdef:
if showadd:
self.show_add_network(widget, ssid)
@@ -263,7 +249,7 @@ class Panel(ScreenPanel):
scroll = self._gtk.ScrolledWindow()
self.labels['connecting_info'] = Gtk.Label(
- label=_("Starting WiFi Association"), halign=Gtk.Align.START, valign=Gtk.Align.START)
+ label=_("Starting WiFi Association"), halign=Gtk.Align.START, valign=Gtk.Align.START, wrap=True)
scroll.add(self.labels['connecting_info'])
self._gtk.Dialog(_("Starting WiFi Association"), buttons, scroll, self._gtk.remove_dialog)
self._screen.show_all()
@@ -315,12 +301,12 @@ class Panel(ScreenPanel):
label = Gtk.Label(label=_("PSK for") + ' ssid', hexpand=False)
self.labels['network_psk'] = Gtk.Entry(hexpand=True)
- self.labels['network_psk'].connect("activate", self.add_new_network, ssid, True)
+ self.labels['network_psk'].connect("activate", self.add_new_network, ssid)
self.labels['network_psk'].connect("focus-in-event", self._screen.show_keyboard)
save = self._gtk.Button("sd", _("Save"), "color3")
save.set_hexpand(False)
- save.connect("clicked", self.add_new_network, ssid, True)
+ save.connect("clicked", self.add_new_network, ssid)
box = Gtk.Box()
box.pack_start(self.labels['network_psk'], True, True, 5)
@@ -342,43 +328,32 @@ class Panel(ScreenPanel):
return True
def update_network_info(self, ssid):
-
info = freq = encr = chan = lvl = ipv4 = ipv6 = ""
if ssid not in list(self.networks) or ssid not in self.labels['networks']:
logging.info(f"Unknown SSID {ssid}")
return
netinfo = self.wifi.get_network_info(ssid)
- if "connected" in netinfo:
- connected = netinfo['connected']
- else:
- connected = False
-
- if connected or self.wifi.get_connected_ssid() == ssid:
- stream = os.popen('hostname -f')
- hostname = stream.read().strip()
+ if netinfo.get('connected') or self.wifi.get_connected_ssid() == ssid:
ifadd = netifaces.ifaddresses(self.interface)
- if netifaces.AF_INET in ifadd and len(ifadd[netifaces.AF_INET]) > 0:
- ipv4 = f"IPv4: {ifadd[netifaces.AF_INET][0]['addr']} "
+ if ifadd.get(netifaces.AF_INET):
+ ipv4 = f"IPv4: {ifadd[netifaces.AF_INET][0]['addr']}"
self.labels['ip'].set_text(f"IP: {ifadd[netifaces.AF_INET][0]['addr']} ")
- if netifaces.AF_INET6 in ifadd and len(ifadd[netifaces.AF_INET6]) > 0:
- ipv6 = f"IPv6: {ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]} "
- info = '' + _("Hostname") + f': {hostname}\n{ipv4}\n{ipv6}\n'
- elif "psk" in netinfo:
- info = _("Password saved")
- if "encryption" in netinfo:
- if netinfo['encryption'] != "off":
- encr = netinfo['encryption'].upper()
+ if ifadd.get(netifaces.AF_INET6):
+ ipv6 = f"IPv6: {ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]}"
+ info = f'{_("Hostname")}: {os.uname().nodename}\n{ipv4}\n{ipv6}'
+ else:
+ self.labels['networks'][ssid]['name'].set_label(_("Hidden") if ssid.startswith("\x00") else f"{ssid}")
+ if "psk" in netinfo:
+ info = _("Password saved")
+ if "encryption" in netinfo and netinfo['encryption'] != "off":
+ encr = netinfo['encryption'].upper()
if "frequency" in netinfo:
- freq = "2.4 GHz" if netinfo['frequency'][0:1] == "2" else "5 Ghz"
+ freq = "2.4 GHz" if netinfo['frequency'][:1] == "2" else "5 Ghz"
if "channel" in netinfo:
- chan = _("Channel") + f' {netinfo["channel"]}'
+ chan = f'{_("Channel")} {netinfo["channel"]}'
if "signal_level_dBm" in netinfo:
- lvl = f'{netinfo["signal_level_dBm"]} '
- if self.use_network_manager:
- lvl += '%'
- else:
- lvl += _("dBm")
+ lvl = f'{netinfo["signal_level_dBm"]} {"%" if self.use_network_manager else _("dBm")}'
icon = self.signal_strength(int(netinfo["signal_level_dBm"]))
if 'icon' not in self.labels['networks'][ssid]:
self.labels['networks'][ssid]['row'].add(icon)
@@ -386,7 +361,7 @@ class Panel(ScreenPanel):
self.labels['networks'][ssid]['icon'] = icon
self.labels['networks'][ssid]['icon'] = icon
- self.labels['networks'][ssid]['info'].set_markup(f"{info} {encr} {freq} {chan} {lvl}")
+ self.labels['networks'][ssid]['info'].set_markup(f"{info}\n{encr} {freq} {chan} {lvl}")
self.labels['networks'][ssid]['row'].show_all()
def signal_strength(self, signal_level):
@@ -405,26 +380,19 @@ class Panel(ScreenPanel):
return self._gtk.Image('wifi_weak')
def update_single_network_info(self):
-
- stream = os.popen('hostname -f')
- hostname = stream.read().strip()
ifadd = netifaces.ifaddresses(self.interface)
- ipv4 = ""
- ipv6 = ""
- if netifaces.AF_INET in ifadd and len(ifadd[netifaces.AF_INET]) > 0:
- ipv4 = f"IPv4: {ifadd[netifaces.AF_INET][0]['addr']} "
+ ipv6 = f"{ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]}" if ifadd.get(netifaces.AF_INET6) else ""
+ if netifaces.AF_INET in ifadd and ifadd[netifaces.AF_INET]:
+ ipv4 = f"{ifadd[netifaces.AF_INET][0]['addr']} "
self.labels['ip'].set_text(f"IP: {ifadd[netifaces.AF_INET][0]['addr']} ")
- if netifaces.AF_INET6 in ifadd and len(ifadd[netifaces.AF_INET6]) > 0:
- ipv6 = f"IPv6: {ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]} "
- connected = (
+ else:
+ ipv4 = ""
+ self.labels['networkinfo'].set_markup(
f'{self.interface}\n\n'
- f'' + _("Connected") + f'\n'
- + '' + _("Hostname") + f': {hostname}\n'
- f'{ipv4}\n'
- f'{ipv6}\n'
+ f'{_("Hostname")}: {os.uname().nodename}\n'
+ f'IPv4: {ipv4}\n'
+ f'IPv6: {ipv6}'
)
-
- self.labels['networkinfo'].set_markup(connected)
self.labels['networkinfo'].show_all()
return True
@@ -432,8 +400,10 @@ class Panel(ScreenPanel):
self.networks = {}
self.labels['networklist'].remove_column(0)
if self.wifi is not None and self.wifi.initialized:
+ if widget:
+ self._gtk.Button_busy(widget, True)
self.wifi.rescan()
- GLib.idle_add(self.load_networks)
+ GLib.idle_add(self.load_networks, widget)
def activate(self):
if self.initialized:
diff --git a/scripts/KlipperScreen-install.sh b/scripts/KlipperScreen-install.sh
index d8dc906c..1abe5d4d 100755
--- a/scripts/KlipperScreen-install.sh
+++ b/scripts/KlipperScreen-install.sh
@@ -160,6 +160,7 @@ create_policy()
echo_text "Installing KlipperScreen PolicyKit Rules"
sudo groupadd -f klipperscreen
+ sudo groupadd -f netdev
sudo groupadd -f tty
if [ ! -x "$(command -v pkaction)" ]; then
echo "PolicyKit not installed"
@@ -195,7 +196,7 @@ polkit.addRule(function(action, subject) {
action.id == "org.freedesktop.login1.reboot-multiple-sessions" ||
action.id == "org.freedesktop.login1.halt" ||
action.id == "org.freedesktop.login1.halt-multiple-sessions" ||
- action.id == "org.freedesktop.NetworkManager.wifi.scan" ||
+ action.id == "org.freedesktop.NetworkManager.*" ||
action.id.startsWith("org.freedesktop.packagekit.")) &&
subject.user == "$USER") {
// Only allow processes with the "klipperscreen" supplementary group
@@ -222,7 +223,7 @@ create_policy_legacy()
ACTIONS="${ACTIONS};org.freedesktop.login1.reboot-multiple-sessions"
ACTIONS="${ACTIONS};org.freedesktop.login1.halt"
ACTIONS="${ACTIONS};org.freedesktop.login1.halt-multiple-sessions"
- ACTIONS="${ACTIONS};org.freedesktop.NetworkManager.wifi.scan"
+ ACTIONS="${ACTIONS};org.freedesktop.NetworkManager.*"
sudo /bin/sh -c "cat > ${RULE_FILE}" << EOF
[KlipperScreen]
Identity=unix-user:$USER