#!/bin/bash set -Eeu -o pipefail # Note: net-traffic uses interval type 'repeat' so cannot use button events. # See https://github.com/vivien/i3blocks#interval # some default values for arguments" UP=${label_icon:-$(xrescat i3xrocks.label.up " up")} DN=${label_icon:-$(xrescat i3xrocks.label.dn " dn")} DLY=${DLY:-5} ERROR_DLY=${ERROR_DLY:-10} RT=${RT:-} # Padding the output to 5 characters to avoid jittering on the bar NUMFMT="numfmt --to iec --format %f --padding 5" # determine the net interface name, but only use one interface # there could be several default routes, if you have a VPN for example IF="${BLOCK_INSTANCE:-$(awk '$2 == 00000000 && $1 !~ /(ppp|tun|tap)/ { print $1; exit }' < /proc/net/route)}" IF_PATH="/sys/class/net/${IF}" if [ -d "${IF_PATH}/bonding" ]; then # this is a bond, use the active slave's interface IF="$(< "${IF_PATH}/bonding/active_slave")" IF_PATH="/sys/class/net/${IF}" fi if [[ "$IF" == "" || ! -d "$IF_PATH" || ! -f "${IF_PATH}"/statistics/rx_bytes || ! -f "${IF_PATH}"/statistics/tx_bytes ]]; then sleep "${ERROR_DLY}" exit 0 fi if [ -d "${IF_PATH}/wireless" ]; then NIC=${label_icon:-$(xrescat i3xrocks.label.wifi )} else NIC=${label_icon:-$(xrescat i3xrocks.label.wired )} fi # read dev file and compute net usage RX1=$(cat "${IF_PATH}"/statistics/rx_bytes) TX1=$(cat "${IF_PATH}"/statistics/tx_bytes) sleep "${DLY}" RX2=$(cat "${IF_PATH}"/statistics/rx_bytes) TX2=$(cat "${IF_PATH}"/statistics/tx_bytes) RX_DIFF=$(echo "($RX2-$RX1)/$DLY" | bc) TX_DIFF=$(echo "($TX2-$TX1)/$DLY" | bc) RX=$(echo "${RX_DIFF}" | ${NUMFMT}) TX=$(echo "${TX_DIFF}" | ${NUMFMT}) AX=$(echo "($RX_DIFF+$TX_DIFF)" | bc | ${NUMFMT}) # Add a B for bytes at the end if the string is missing a letter if ! [[ "${RX}" =~ [BKMG]$ ]]; then RX="${RX#?}B" fi if ! [[ "${TX}" =~ [BKMG]$ ]]; then TX="${TX#?}B" fi if ! [[ "${AX}" =~ [BKMG]$ ]]; then AX="${AX#?}B" fi # span for text fspan() { echo " ${1}" } # span for label/icon lspan() { echo "${1}" } # get font specifics from xresource file VALUE_COLOR=${color:-$(xrescat i3xrocks.value.color "#D8DEE9")} LABEL_COLOR=${label_color:-$(xrescat i3xrocks.label.color "#7B8394")} VALUE_FONT=${font:-$(xrescat i3xrocks.value.font "Source Code Pro Medium 13")} # output net usage using pango markup if [ "$RT" = "up" ]; then echo "$(lspan "${NIC}")$(fspan "$TX")$(lspan "${UP}")" elif [ "$RT" = "down" ] || [ "$RT" = "dn" ]; then echo "$(lspan "${NIC}")$(fspan "$RX")$(lspan "${DN}")" elif [ "$RT" = "total" ]; then echo "$(lspan "${NIC}")$(fspan "$AX")" else echo "$(lspan "${NIC}")$(fspan "$RX") $(lspan "${DN}") /$(fspan "$TX") $(lspan "${UP}")" fi