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