dotfiles/.config/polybar/scripts/network_usage

67 lines
1.7 KiB
Bash
Executable File

#!/usr/bin/env bash
COUNTER_FILE=/dev/shm/polybar_network_usage
REFRESH=2
get_icon_by_device()
{
device=$1
device_type=$(nmcli -t device status | grep -E -m 1 "^$device" | cut -f 2 -d ":")
case "$device_type" in
ethernet)
icon=""
;;
wifi)
ssid=$(nmcli -t device status | grep -E -m 1 "^$device" | cut -f 4 -d ":")
icon="$ssid"
;;
*)
icon=""
;;
esac
echo $icon
}
while true; do
default_device=$(ip route list | grep -Fm 1 default | cut -d " " -f 5)
icon=$(get_icon_by_device "$default_device")
now=$(date +%s)
counter_age=$(stat --format %Z $COUNTER_FILE 2>/dev/null)
if [ -f $COUNTER_FILE ] && [ $((now-counter_age)) -lt $((REFRESH+1)) ]; then
last_value_in=$(cut -f 1 -d " " $COUNTER_FILE)
last_value_out=$(cut -f 2 -d " " $COUNTER_FILE)
fi
current_values=$(awk -v dev="${default_device}:" '{
if ($1 == dev) print $2,$10
}' < /proc/net/dev)
current_bytes_in=$(echo "$current_values" | cut -f 1 -d " ")
current_bytes_out=$(echo "$current_values" | cut -f 2 -d " ")
if [ -n "$last_value_in" ]; then
bits_in=$((((current_bytes_in-last_value_in) / REFRESH) * 8))
bits_out=$((((current_bytes_out-last_value_out) / REFRESH) * 8))
output=$(LANG=C numfmt --to iec --format "%8.2f" "$bits_in" "$bits_out" \
| tr -d "\n" 2>/dev/null)
if ! echo "$output" | grep -qE '[0-9]{1,3}\.[0-9]{1,3}([K,M,G,B])?$'; then
output=" 0.01 0.01"
fi
echo "$icon $output"
else
echo "$icon -- --"
fi
echo "$current_values">$COUNTER_FILE
unset last_value
sleep $REFRESH
done