network: refactors and fixes
This commit is contained in:
parent
d9aaddb462
commit
2af58ef8ea
@ -344,4 +344,4 @@ class WifiChannels:
|
||||
elif 6455 <= freq <= 7115:
|
||||
return "6", str(int((freq - 5950) / 5))
|
||||
else:
|
||||
return None
|
||||
return "?", "?"
|
||||
|
@ -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,
|
||||
|
@ -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"<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)
|
||||
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"<b>IPv4:</b> {ifadd[netifaces.AF_INET][0]['addr']} "
|
||||
if ifadd.get(netifaces.AF_INET):
|
||||
ipv4 = f"<b>IPv4:</b> {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"<b>IPv6:</b> {ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]} "
|
||||
info = '<b>' + _("Hostname") + f':</b> {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"<b>IPv6:</b> {ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]}"
|
||||
info = f'<b>{_("Hostname")}:</b> {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} <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()
|
||||
|
||||
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"<b>IPv4:</b> {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"<b>IPv6:</b> {ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]} "
|
||||
connected = (
|
||||
else:
|
||||
ipv4 = ""
|
||||
self.labels['networkinfo'].set_markup(
|
||||
f'<b>{self.interface}</b>\n\n'
|
||||
f'<small><b>' + _("Connected") + f'</b></small>\n'
|
||||
+ '<b>' + _("Hostname") + f':</b> {hostname}\n'
|
||||
f'{ipv4}\n'
|
||||
f'{ipv6}\n'
|
||||
f'<b>{_("Hostname")}:</b> {os.uname().nodename}\n'
|
||||
f'<b>IPv4:</b> {ipv4}\n'
|
||||
f'<b>IPv6:</b> {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:
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user