Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env bash
- #
- # Copyright (C) 2015 James Murphy
- # Licensed under the terms of the GNU GPL v2 only.
- #
- # i3blocks blocklet script to monitor bandwidth usage
- iface="${BLOCK_INSTANCE}"
- iface="${IFACE:-$iface}"
- dt="${DT:-3}"
- unit="${UNIT:-Mb}"
- LABEL="${LABEL: }" # down arrow up arrow
- printf_command="${PRINTF_COMMAND:-"printf \"${LABEL}%-5.1f/%5.1f %s/s\\n\", rx, wx, unit;"}"
- function default_interface {
- ip route | awk '/^default via/ {print $5; exit}'
- }
- function check_proc_net_dev {
- if [ ! -f "/proc/net/dev" ]; then
- echo "/proc/net/dev not found"
- exit 1
- fi
- }
- function list_interfaces {
- check_proc_net_dev
- echo "Interfaces in /proc/net/dev:"
- grep -o "^[^:]\\+:" /proc/net/dev | tr -d " :"
- }
- while getopts i:t:u:p:lh opt; do
- case "$opt" in
- i) iface="$OPTARG" ;;
- t) dt="$OPTARG" ;;
- u) unit="$OPTARG" ;;
- p) printf_command="$OPTARG" ;;
- l) list_interfaces && exit 0 ;;
- h) printf \
- "Usage: bandwidth3 [-i interface] [-t time] [-u unit] [-p printf_command] [-l] [-h]
- Options:
- -i\tNetwork interface to measure. Default determined using \`ip route\`.
- -t\tTime interval in seconds between measurements. Default: 3
- -u\tUnits to measure bytes in. Default: Mb
- \tAllowed units: Kb, KB, Mb, MB, Gb, GB, Tb, TB
- \tUnits may have optional it/its/yte/ytes on the end, e.g. Mbits, KByte
- -p\tAwk command to be called after a measurement is made.
- \tDefault: printf \"<span font='FontAwesome'> </span>%%-5.1f/%%5.1f %%s/s\\\\n\", rx, wx, unit;
- \tExposed variables: rx, wx, tx, unit, iface
- -l\tList available interfaces in /proc/net/dev
- -h\tShow this help text
- " && exit 0;;
- esac
- done
- check_proc_net_dev
- iface="${iface:-$(default_interface)}"
- while [ -z "$iface" ]; do
- echo No default interface
- sleep "$dt"
- iface=$(default_interface)
- done
- case "$unit" in
- Kb|Kbit|Kbits) bytes_per_unit=$((1024 / 8));;
- KB|KByte|KBytes) bytes_per_unit=$((1024));;
- Mb|Mbit|Mbits) bytes_per_unit=$((1024 * 1024 / 8));;
- MB|MByte|MBytes) bytes_per_unit=$((1024 * 1024));;
- Gb|Gbit|Gbits) bytes_per_unit=$((1024 * 1024 * 1024 / 8));;
- GB|GByte|GBytes) bytes_per_unit=$((1024 * 1024 * 1024));;
- Tb|Tbit|Tbits) bytes_per_unit=$((1024 * 1024 * 1024 * 1024 / 8));;
- TB|TByte|TBytes) bytes_per_unit=$((1024 * 1024 * 1024 * 1024));;
- *) echo Bad unit "$unit" && exit 1;;
- esac
- scalar=$((bytes_per_unit * dt))
- init_line=$(cat /proc/net/dev | grep "^[ ]*$iface:")
- if [ -z "$init_line" ]; then
- echo Interface not found in /proc/net/dev: "$iface"
- exit 1
- fi
- init_received=$(awk '{print $2}' <<< $init_line)
- init_sent=$(awk '{print $10}' <<< $init_line)
- (while true; do cat /proc/net/dev; sleep "$dt"; done) |\
- stdbuf -oL grep "^[ ]*$iface:" |\
- awk -v scalar="$scalar" -v unit="$unit" -v iface="$iface" '
- BEGIN{old_received='"$init_received"';old_sent='"$init_sent"'}
- {
- received=$2
- sent=$10
- rx=(received-old_received)/scalar;
- wx=(sent-old_sent)/scalar;
- tx=rx+wr;
- old_received=received;
- old_sent=sent;
- if(rx >= 0 && wx >= 0){
- '"$printf_command"';
- fflush(stdout);
- }
- }
- '
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement