Quick and Dirty bash script to check bandwidth usage

I need it to shutdown my home server when it’s idle for a long time. Nothing very elegant, a bit of grep on ifconfig output but it seems to work fine. Have fun!

Donwload bwusage

#! /bin/bash

# BandWidth Usage
#   Federico Zanco 


IFACE=eth0
TIMEOUT=10
RX="1"
TX="1"
TRAFFIC="FALSE"
UNIT="KiB"
VERBOSE=


show_help () {
    echo
    echo "usage: bwusage [-h|--help] [-i|--interface ] [--rx-only]"
    echo "               [--tx-only] [--traffic] [-t|--timeout ]"
    echo "               [-u|--unit  [-v|--verbose]"
    echo
}


change_unit () {
    case "$UNIT" in

        "KiB")
            [ "$1" = "RX" ] && RX=`echo "$RX"|awk '{printf "%0.4f", $1 / 1024}'`
            [ "$1" = "TX" ] && TX=`echo "$TX"|awk '{printf "%0.4f", $1 / 1024}'`
            ;;

        "MiB")
            [ "$1" = "RX" ] && RX=`echo "$RX"|awk '{printf "%0.4f", $1 / 1048576}'`
            [ "$1" = "TX" ] && TX=`echo "$TX"|awk '{printf "%0.4f", $1 / 1048576}'`
            ;;

    esac
}


TEMP=`getopt -q -o hi:t:u:v --long help,interface,rx-only,tx-only,traffic,timeout,unit,verbose -- "$@"`

eval set -- "$TEMP"

while true ; do
    case "$1" in

        -h|--help)
            show_help
            exit 0
            ;;

        -i|--interface)
            IFACE=$2
            shift 2
            ;;

        --rx-only)
            TX=
            shift
            ;;

        --tx-only)
            RX=
            shift
            ;;

        --traffic)
            TRAFFIC="TRUE"
            shift
            ;;

        -t|--timeout)
            TIMEOUT=$2
            shift 2
            ;;

        -u|--unit)
            [ "$2" != "B" -a "$2" != "KiB" -a "$2" != "MiB" ] && echo && echo "ERROR: unit $2 not valid" && show_help && exit 1
            UNIT=$2
            shift 2
            ;;

        -v|--verbose)
            VERBOSE="1"
            shift
            ;;

        *)
            # [ "--" != "$1" ] && echo && echo "ERROR: $1 unknown option" && show_help && exit 1
            break
            ;;
    esac
done

[ -z "$(ifconfig -s |grep $IFACE)" ] && echo && echo "ERROR: $IFACE not up or not valid" && exit 1

[ -n "$VERBOSE" ] && echo 
[ -n "$VERBOSE" ] && echo "IFACE=$IFACE"
[ -n "$VERBOSE" ] && echo "TIMEOUT=$TIMEOUT s"
[ -n "$VERBOSE" ] && echo "TRAFFIC=$TRAFFIC"
[ -n "$VERBOSE" ] && echo "UNIT=$UNIT"
[ -n "$VERBOSE" ] && echo
[ -n "$VERBOSE" ] && echo "... please wait $TIMEOUT seconds ..."
[ -n "$VERBOSE" ] && echo

[ -n "$RX" ] && rx1=`cat /sys/class/net/$IFACE/statistics/rx_bytes`
[ -n "$TX" ] && tx1=`cat /sys/class/net/$IFACE/statistics/tx_bytes`

sleep $TIMEOUT

[ -n "$RX" ] && rx2=`cat /sys/class/net/$IFACE/statistics/rx_bytes`
[ -n "$TX" ] && tx2=`cat /sys/class/net/$IFACE/statistics/tx_bytes`

if [ -n "$RX" ] 
then
    RX=`echo "$rx2 - $rx1"|bc`
    [ "$TRAFFIC" = "FALSE" ] && RX=`echo "$RX $TIMEOUT"|awk '{printf "%0.4f", $1 / $2 }'`
    change_unit "RX"
    [ -n "$VERBOSE" ] && echo -n "RX: "
    echo "$RX"|awk '{printf "%0.2f", $1 }'
    [ -n "$VERBOSE" ] && echo -n " $UNIT" && [ "$TRAFFIC" = "FALSE" ] && echo -n "/s"
fi

[ -n "$RX" ] && [ -n "$TX" ] && echo -n "    "

if [ -n "$TX" ] 
then
    TX=`echo "$tx2 - $tx1"|bc`
    [ "$TRAFFIC" = "FALSE" ] && TX=`echo "$TX $TIMEOUT"|awk '{printf "%0.4f", $1 / $2 }'`
    change_unit "TX"
    [ -n "$VERBOSE" ] && echo -n "TX: "
    echo "$TX"| awk '{printf "%0.2f", $1 }'
    [ -n "$VERBOSE" ] && echo -n " $UNIT" && [ "$TRAFFIC" = "FALSE" ] && echo -n "/s" 
fi

echo