#!/bin/sh # Network speed monitor with fixed-width output for waybar # Outputs JSON with upload/download speeds padded to consistent width INTERFACE=$(ip route | awk '/default/ {print $5; exit}') if [ -z "$INTERFACE" ]; then echo '{"text": "No network", "class": "disconnected"}' exit 0 fi RX1=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes) TX1=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes) sleep 1 RX2=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes) TX2=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes) RX_RATE=$((RX2 - RX1)) TX_RATE=$((TX2 - TX1)) format_speed() { local bytes=$1 if [ $bytes -ge 1073741824 ]; then printf "%6.2f G" $(echo "scale=2; $bytes / 1073741824" | bc) elif [ $bytes -ge 1048576 ]; then printf "%6.2f M" $(echo "scale=2; $bytes / 1048576" | bc) elif [ $bytes -ge 1024 ]; then printf "%6.2f K" $(echo "scale=2; $bytes / 1024" | bc) else printf "%6d B" $bytes fi } UP=$(format_speed $TX_RATE) DOWN=$(format_speed $RX_RATE) # Get IP for tooltip IP=$(ip -4 addr show $INTERFACE | awk '/inet / {print $2}') # Check if WiFi and get SSID SSID="" if command -v iwgetid >/dev/null 2>&1; then SSID=$(iwgetid -r 2>/dev/null) fi if [ -n "$SSID" ]; then TOOLTIP="$SSID ($INTERFACE: $IP)" else TOOLTIP="$INTERFACE: $IP" fi echo "{\"text\": \"${UP} 󰕒 ${DOWN} 󰇚\", \"tooltip\": \"$TOOLTIP\", \"class\": \"connected\"}"