network: refactors and fixes

This commit is contained in:
alfrix 2024-01-11 20:48:07 -03:00
parent d9aaddb462
commit 2af58ef8ea
4 changed files with 61 additions and 90 deletions

View File

@ -344,4 +344,4 @@ class WifiChannels:
elif 6455 <= freq <= 7115: elif 6455 <= freq <= 7115:
return "6", str(int((freq - 5950) / 5)) return "6", str(int((freq - 5950) / 5))
else: else:
return None return "?", "?"

View File

@ -228,7 +228,7 @@ class WifiManager:
with suppress(NetworkManager.ObjectVanished): with suppress(NetworkManager.ObjectVanished):
netinfo.update({ netinfo.update({
"mac": ap.HwAddress, "mac": ap.HwAddress,
"channel": WifiChannels.lookup(str(ap.Frequency))[1], "channel": WifiChannels.lookup(ap.Frequency)[1],
"configured": ssid in self.known_networks, "configured": ssid in self.known_networks,
"frequency": str(ap.Frequency), "frequency": str(ap.Frequency),
"flags": ap.Flags, "flags": ap.Flags,

View File

@ -43,26 +43,24 @@ class Panel(ScreenPanel):
if 'lo' in ints: if 'lo' in ints:
ints.pop(ints.index('lo')) ints.pop(ints.index('lo'))
self.interface = ints[0] if len(ints) > 0 else '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['networks'] = {}
self.labels['interface'] = Gtk.Label(hexpand=True) self.labels['interface'] = Gtk.Label(hexpand=True)
self.labels['interface'].set_text(f' {_("Interface")}: {self.interface} ') self.labels['interface'].set_text(f' {_("Interface")}: {self.interface} ')
self.labels['ip'] = Gtk.Label(hexpand=True) 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.connect("clicked", self.reload_networks)
reload_networks.set_hexpand(False) reload_networks.set_hexpand(False)
sbox = Gtk.Box(hexpand=True, vexpand=False) sbox = Gtk.Box(hexpand=True, vexpand=False)
sbox.add(self.labels['interface']) sbox.add(self.labels['interface'])
if ip is not None: sbox.add(self.labels['ip'])
self.labels['ip'].set_text(f"IP: {ip} ")
sbox.add(self.labels['ip'])
sbox.add(reload_networks) sbox.add(reload_networks)
scroll = self._gtk.ScrolledWindow() scroll = self._gtk.ScrolledWindow()
@ -95,13 +93,15 @@ class Panel(ScreenPanel):
self.labels['main_box'] = box self.labels['main_box'] = box
self.initialized = True self.initialized = True
def load_networks(self): def load_networks(self, widget=None):
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()
if widget:
GLib.timeout_add_seconds(10, self._gtk.Button_busy, widget, False)
self.content.show_all() self.content.show_all()
return False return False
@ -124,16 +124,14 @@ class Panel(ScreenPanel):
connected_ssid = self.wifi.get_connected_ssid() connected_ssid = self.wifi.get_connected_ssid()
if netinfo is None: if netinfo is None:
logging.debug("Couldn't get netinfo") logging.debug("Couldn't get netinfo")
if connected_ssid == ssid: netinfo = {'connected': connected_ssid == ssid}
netinfo = {'connected': True}
else:
netinfo = {'connected': False}
if connected_ssid == ssid:
display_name += " (" + _("Connected") + ")"
name = Gtk.Label(hexpand=True, halign=Gtk.Align.START, wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR) name = Gtk.Label(hexpand=True, halign=Gtk.Align.START, wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR)
name.set_markup(f"<big><b>{display_name}</b></big>") if connected_ssid == ssid:
display_name += " (" + _("Connected") + ")"
name.set_markup(f"<big><b>{display_name}</b></big>")
else:
name.set_label(display_name)
info = Gtk.Label(halign=Gtk.Align.START) info = Gtk.Label(halign=Gtk.Align.START)
labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, vexpand=True, labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, vexpand=True,
@ -141,19 +139,18 @@ class Panel(ScreenPanel):
labels.add(name) labels.add(name)
labels.add(info) 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.connect("clicked", self.connect_network, ssid)
connect.set_hexpand(False) connect.set_hexpand(False)
connect.set_halign(Gtk.Align.END) 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.connect("clicked", self.remove_wifi_network, ssid)
delete.set_hexpand(False) delete.set_hexpand(False)
delete.set_halign(Gtk.Align.END) delete.set_halign(Gtk.Align.END)
network = Gtk.Box(spacing=5, hexpand=True, vexpand=False) network = Gtk.Box(spacing=5, hexpand=True, vexpand=False)
network.get_style_context().add_class("frame-item") network.get_style_context().add_class("frame-item")
network.add(labels) network.add(labels)
buttons = Gtk.Box(spacing=5) buttons = Gtk.Box(spacing=5)
@ -188,18 +185,14 @@ class Panel(ScreenPanel):
if show: if show:
self.labels['networklist'].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() self._screen.remove_keyboard()
psk = self.labels['network_psk'].get_text() result = self.wifi.add_network(ssid, self.labels['network_psk'].get_text())
result = self.wifi.add_network(ssid, psk)
self.close_add_network() self.close_add_network()
if result:
if connect: self.connect_network(widget, ssid, False)
if result: else:
self.connect_network(widget, ssid, False) self._screen.show_popup_message(f"Error adding network {ssid}")
else:
self._screen.show_popup_message(f"Error adding network {ssid}")
def back(self): def back(self):
if self.show_add: if self.show_add:
@ -243,14 +236,7 @@ class Panel(ScreenPanel):
self.check_missing_networks() self.check_missing_networks()
def connect_network(self, widget, ssid, showadd=True): def connect_network(self, widget, ssid, showadd=True):
isdef = any(net['ssid'] == ssid for netid, net in self.wifi.get_supplicant_networks().items())
snets = self.wifi.get_supplicant_networks()
isdef = False
for netid, net in snets.items():
if net['ssid'] == ssid:
isdef = True
break
if not isdef: if not isdef:
if showadd: if showadd:
self.show_add_network(widget, ssid) self.show_add_network(widget, ssid)
@ -263,7 +249,7 @@ class Panel(ScreenPanel):
scroll = self._gtk.ScrolledWindow() scroll = self._gtk.ScrolledWindow()
self.labels['connecting_info'] = Gtk.Label( 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']) scroll.add(self.labels['connecting_info'])
self._gtk.Dialog(_("Starting WiFi Association"), buttons, scroll, self._gtk.remove_dialog) self._gtk.Dialog(_("Starting WiFi Association"), buttons, scroll, self._gtk.remove_dialog)
self._screen.show_all() self._screen.show_all()
@ -315,12 +301,12 @@ class Panel(ScreenPanel):
label = Gtk.Label(label=_("PSK for") + ' ssid', hexpand=False) label = Gtk.Label(label=_("PSK for") + ' ssid', hexpand=False)
self.labels['network_psk'] = Gtk.Entry(hexpand=True) 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) self.labels['network_psk'].connect("focus-in-event", self._screen.show_keyboard)
save = self._gtk.Button("sd", _("Save"), "color3") save = self._gtk.Button("sd", _("Save"), "color3")
save.set_hexpand(False) 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 = Gtk.Box()
box.pack_start(self.labels['network_psk'], True, True, 5) box.pack_start(self.labels['network_psk'], True, True, 5)
@ -342,43 +328,32 @@ class Panel(ScreenPanel):
return True return True
def update_network_info(self, ssid): def update_network_info(self, ssid):
info = freq = encr = chan = lvl = ipv4 = ipv6 = "" info = freq = encr = chan = lvl = ipv4 = ipv6 = ""
if ssid not in list(self.networks) or ssid not in self.labels['networks']: if ssid not in list(self.networks) or ssid not in self.labels['networks']:
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 "connected" in netinfo: if netinfo.get('connected') or self.wifi.get_connected_ssid() == ssid:
connected = netinfo['connected']
else:
connected = False
if connected or self.wifi.get_connected_ssid() == ssid:
stream = os.popen('hostname -f')
hostname = stream.read().strip()
ifadd = netifaces.ifaddresses(self.interface) ifadd = netifaces.ifaddresses(self.interface)
if netifaces.AF_INET in ifadd and len(ifadd[netifaces.AF_INET]) > 0: if ifadd.get(netifaces.AF_INET):
ipv4 = f"<b>IPv4:</b> {ifadd[netifaces.AF_INET][0]['addr']} " ipv4 = f"<b>IPv4:</b> {ifadd[netifaces.AF_INET][0]['addr']}"
self.labels['ip'].set_text(f"IP: {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: if ifadd.get(netifaces.AF_INET6):
ipv6 = f"<b>IPv6:</b> {ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]} " ipv6 = f"<b>IPv6:</b> {ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]}"
info = '<b>' + _("Hostname") + f':</b> {hostname}\n{ipv4}\n{ipv6}\n' info = f'<b>{_("Hostname")}:</b> {os.uname().nodename}\n{ipv4}\n{ipv6}'
elif "psk" in netinfo: else:
info = _("Password saved") self.labels['networks'][ssid]['name'].set_label(_("Hidden") if ssid.startswith("\x00") else f"{ssid}")
if "encryption" in netinfo: if "psk" in netinfo:
if netinfo['encryption'] != "off": info = _("Password saved")
encr = netinfo['encryption'].upper() if "encryption" in netinfo and netinfo['encryption'] != "off":
encr = netinfo['encryption'].upper()
if "frequency" in netinfo: 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: if "channel" in netinfo:
chan = _("Channel") + f' {netinfo["channel"]}' chan = f'{_("Channel")} {netinfo["channel"]}'
if "signal_level_dBm" in netinfo: if "signal_level_dBm" in netinfo:
lvl = f'{netinfo["signal_level_dBm"]} ' lvl = f'{netinfo["signal_level_dBm"]} {"%" if self.use_network_manager else _("dBm")}'
if self.use_network_manager:
lvl += '%'
else:
lvl += _("dBm")
icon = self.signal_strength(int(netinfo["signal_level_dBm"])) icon = self.signal_strength(int(netinfo["signal_level_dBm"]))
if 'icon' not in self.labels['networks'][ssid]: if 'icon' not in self.labels['networks'][ssid]:
self.labels['networks'][ssid]['row'].add(icon) 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]['icon'] = icon self.labels['networks'][ssid]['icon'] = icon
self.labels['networks'][ssid]['info'].set_markup(f"{info} <small>{encr} {freq} {chan} {lvl}</small>") self.labels['networks'][ssid]['info'].set_markup(f"{info}\n<small>{encr} {freq} {chan} {lvl}</small>")
self.labels['networks'][ssid]['row'].show_all() self.labels['networks'][ssid]['row'].show_all()
def signal_strength(self, signal_level): def signal_strength(self, signal_level):
@ -405,26 +380,19 @@ class Panel(ScreenPanel):
return self._gtk.Image('wifi_weak') return self._gtk.Image('wifi_weak')
def update_single_network_info(self): def update_single_network_info(self):
stream = os.popen('hostname -f')
hostname = stream.read().strip()
ifadd = netifaces.ifaddresses(self.interface) ifadd = netifaces.ifaddresses(self.interface)
ipv4 = "" ipv6 = f"{ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]}" if ifadd.get(netifaces.AF_INET6) else ""
ipv6 = "" if netifaces.AF_INET in ifadd and ifadd[netifaces.AF_INET]:
if netifaces.AF_INET in ifadd and len(ifadd[netifaces.AF_INET]) > 0: ipv4 = f"{ifadd[netifaces.AF_INET][0]['addr']} "
ipv4 = f"<b>IPv4:</b> {ifadd[netifaces.AF_INET][0]['addr']} "
self.labels['ip'].set_text(f"IP: {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: else:
ipv6 = f"<b>IPv6:</b> {ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]} " ipv4 = ""
connected = ( self.labels['networkinfo'].set_markup(
f'<b>{self.interface}</b>\n\n' f'<b>{self.interface}</b>\n\n'
f'<small><b>' + _("Connected") + f'</b></small>\n' f'<b>{_("Hostname")}:</b> {os.uname().nodename}\n'
+ '<b>' + _("Hostname") + f':</b> {hostname}\n' f'<b>IPv4:</b> {ipv4}\n'
f'{ipv4}\n' f'<b>IPv6:</b> {ipv6}'
f'{ipv6}\n'
) )
self.labels['networkinfo'].set_markup(connected)
self.labels['networkinfo'].show_all() self.labels['networkinfo'].show_all()
return True return True
@ -432,8 +400,10 @@ class Panel(ScreenPanel):
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.initialized: if self.wifi is not None and self.wifi.initialized:
if widget:
self._gtk.Button_busy(widget, True)
self.wifi.rescan() self.wifi.rescan()
GLib.idle_add(self.load_networks) GLib.idle_add(self.load_networks, widget)
def activate(self): def activate(self):
if self.initialized: if self.initialized:

View File

@ -160,6 +160,7 @@ create_policy()
echo_text "Installing KlipperScreen PolicyKit Rules" echo_text "Installing KlipperScreen PolicyKit Rules"
sudo groupadd -f klipperscreen sudo groupadd -f klipperscreen
sudo groupadd -f netdev
sudo groupadd -f tty sudo groupadd -f tty
if [ ! -x "$(command -v pkaction)" ]; then if [ ! -x "$(command -v pkaction)" ]; then
echo "PolicyKit not installed" 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.reboot-multiple-sessions" ||
action.id == "org.freedesktop.login1.halt" || action.id == "org.freedesktop.login1.halt" ||
action.id == "org.freedesktop.login1.halt-multiple-sessions" || 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.")) && action.id.startsWith("org.freedesktop.packagekit.")) &&
subject.user == "$USER") { subject.user == "$USER") {
// Only allow processes with the "klipperscreen" supplementary group // 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.reboot-multiple-sessions"
ACTIONS="${ACTIONS};org.freedesktop.login1.halt" ACTIONS="${ACTIONS};org.freedesktop.login1.halt"
ACTIONS="${ACTIONS};org.freedesktop.login1.halt-multiple-sessions" 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 sudo /bin/sh -c "cat > ${RULE_FILE}" << EOF
[KlipperScreen] [KlipperScreen]
Identity=unix-user:$USER Identity=unix-user:$USER