From 940c00b5af557a1a7746f9838e79639c0c8b7be0 Mon Sep 17 00:00:00 2001 From: Brieuc Dubois Date: Sat, 17 Feb 2024 13:36:06 +0100 Subject: [PATCH] bandwidth in waybar --- root/home/bhasher/.config/waybar/config | 12 ++-- .../bhasher/.config/waybar/scripts/bandwidth | 66 +++++++++++++++++++ 2 files changed, 72 insertions(+), 6 deletions(-) create mode 100755 root/home/bhasher/.config/waybar/scripts/bandwidth diff --git a/root/home/bhasher/.config/waybar/config b/root/home/bhasher/.config/waybar/config index 5bdc686..345acbc 100644 --- a/root/home/bhasher/.config/waybar/config +++ b/root/home/bhasher/.config/waybar/config @@ -4,9 +4,9 @@ "height": 24, // Waybar height // "width": 1366, // Waybar width // Choose the order of the modules - "modules-left": ["hyprland/workspaces", "hyprland/mode", "custom/spotify"], + "modules-left": ["hyprland/workspaces"], "modules-center": ["hyprland/window"], - "modules-right": ["pulseaudio", "network", "cpu", "memory", "battery", "tray", "clock"], + "modules-right": ["pulseaudio", "network", "custom/bandwidth", "cpu", "memory", "battery", "tray", "clock"], "hyprland/workspaces": { "disable-scroll": true, "all-outputs": false, @@ -23,9 +23,6 @@ "default": "" } }, - "hyprland/mode": { - "format": "{}" - }, "tray": { // "icon-size": 21, "spacing": 10 @@ -52,10 +49,13 @@ }, "network": { // "interface": "wlp2s0", // (Optional) To force the use of this interface - "format-wifi": "{essid} ({signalStrength}%) ", + "format-wifi": "{essid} ({signalStrength}) ", "format-ethernet": "{ifname}: {ipaddr}/{cidr} ", "format-disconnected": "Disconnected ⚠" }, + "custom/bandwidth": { + "exec": "$HOME/.config/waybar/scripts/bandwidth" + }, "pulseaudio": { //"scroll-step": 1, "format": "{volume}% {icon}", diff --git a/root/home/bhasher/.config/waybar/scripts/bandwidth b/root/home/bhasher/.config/waybar/scripts/bandwidth new file mode 100755 index 0000000..97e4e7e --- /dev/null +++ b/root/home/bhasher/.config/waybar/scripts/bandwidth @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +import subprocess +from time import sleep + + +def default_interface(): + process = subprocess.run( + ["ip", "route"], check=True, text=True, capture_output=True + ) + for line in process.stdout.splitlines(): + if line.startswith("default via"): + return line.split()[4] + raise RuntimeError("No default interface found") + + +def get_rx_tx_bytes(iface): + with open("/proc/net/dev") as f: + for line in f: + line = line.strip() + if not line.startswith(f"{iface}:"): + continue + rx_bytes = int(line.split()[1]) + tx_bytes = int(line.split()[9]) + return rx_bytes, tx_bytes + raise RuntimeError(f"Interface {iface} not found") + + +def format_size(size): + power_labels = {0: "B", 1: "K", 2: "M", 3: "G", 4: "T"} + #kilo = 2**10 + #power = 0 + #while size > kilo: + # size /= kilo + # power += 1 + power = 1 + return f"{size/1024:3.0f} {power_labels[power]}" + + +def main(): + refresh_interval = 1 + rx_icon = " " + tx_icon = " " + num_left = "" + num_right = "" + fmt_str = ( + f"{rx_icon}{num_left}{{rx}}{{unit_suffix}}{num_right} " + f"{tx_icon}{num_left}{{tx}}{{unit_suffix}}{num_right}" + ) + unit_suffix = "" + iface = default_interface() + + rx_bytes, tx_bytes = get_rx_tx_bytes(iface) + + while True: + prev_rx_bytes, prev_tx_bytes = rx_bytes, tx_bytes + rx_bytes, tx_bytes = get_rx_tx_bytes(iface) + drx = format_size((rx_bytes - prev_rx_bytes) / refresh_interval) + dtx = format_size((tx_bytes - prev_tx_bytes) / refresh_interval) + line = fmt_str.format(rx=drx, tx=dtx, unit_suffix=unit_suffix) + print(line, flush=True) + sleep(refresh_interval) + + +if __name__ == "__main__": + main()