#!/usr/bin/env python3 import subprocess IGNORED_DEVICES = { "lo", "docker0", } IGNORED_PREFIXES = ( "br-", "veth", "virbr", "tun", "tap", ) IGNORED_TYPES = { "loopback", "bridge", } def devices() -> list: result = subprocess.run( [ "nmcli", "-t", "-f", "DEVICE,TYPE,STATE,CONNECTION", "device", "status", ], text=True, capture_output=True, check=True, ) devices = [] for line in result.stdout.strip().splitlines(): device, dev_type, state, connection = line.split(":", 3) # filter ignored device names if device in IGNORED_DEVICES: continue # filter virtual interface prefixes if any(device.startswith(prefix) for prefix in IGNORED_PREFIXES): continue # filter unwanted interface types if dev_type in IGNORED_TYPES: continue devices.append({ "device": device, "type": dev_type, "state": state, "connection": None if connection == "--" else connection, }) return devices def wifi_enabled() -> bool: result = subprocess.run( ["nmcli", "radio", "wifi"], text=True, capture_output=True, check=True, ) return result.stdout.strip() == "enabled" def yuck() -> str: ret = r"""(box :orientation "v" :spacing 8""" ret += rf""" (box :orientation "h" :space-evenly false :spacing 16 :class "device-item" (label :class "device-icon" :text "{"airplanemode_inactive" if wifi_enabled() else "flight"}" ) (box :orientation "v" :space-evenly true :spacing 2 (label :class "device-name" :text "Flymodus" :xalign 0) ) (box :hexpand true) (checkbox :checked {str(not wifi_enabled()).lower()} :onunchecked "nmcli radio wifi on" :onchecked "nmcli radio wifi off" ) ) """ for device in devices(): safe_name = device["device"].replace('"', r'\"') signal_icon = "settings_input_antenna" if device["type"] == "wifi" else "lan" if device["state"] == "connected": ret += rf""" (box :orientation "h" :space-evenly false :spacing 16 :class "device-item" (label :class "device-icon" :text "{signal_icon}") (box :orientation "v" :space-evenly false :spacing 2 (label :class "device-name" :text "{safe_name}" :xalign 0) (label :class "device-subtext" :text "Aktiv" :xalign 0) ) (box :hexpand true) (checkbox :checked true :onchecked "~/.config/eww/widgets/network/scripts/device_up.sh '{safe_name}'" :onunchecked "~/.config/eww/widgets/network/scripts/device_down.sh '{safe_name}'" ) ) """ else: ret += rf""" (box :orientation "h" :space-evenly false :spacing 16 :class "device-item" (label :class "device-icon" :text "{signal_icon}") (box :orientation "v" :space-evenly true :spacing 2 (label :class "device-name" :text "{safe_name}" :xalign 0) ) (box :hexpand true) (checkbox :checked false :onchecked "~/.config/eww/widgets/network/scripts/device_up.sh '{safe_name}'" :onunchecked "~/.config/eww/widgets/network/scripts/device_down.sh '{safe_name}'" ) ) """ return ret + ")" print(yuck())