1#!/bin/bash 2# Copyright (C) 2012 Stefan Breunig <stefan+measure-net-speed@mathphys.fsk.uni-heidelberg.de> 3# Copyright (C) 2014 kaueraal 4# Copyright (C) 2015 Thiago Perrotta <perrotta dot thiago at poli dot ufrj dot br> 5 6# This program is free software: you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation, either version 3 of the License, or 9# (at your option) any later version. 10 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15 16# You should have received a copy of the GNU General Public License 17# along with this program. If not, see <http://www.gnu.org/licenses/>. 18 19# Get custom IN and OUT labels if provided by command line arguments 20while[[$#-gt1]];do 21 key="$1" 22case"$key"in 23-i|--inlabel) 24 INLABEL="$2" 25shift;; 26-o|--outlabel) 27 OUTLABEL="$2" 28shift;; 29esac 30shift 31done 32 33#[[ -z $INLABEL ]] && INLABEL="IN " 34#[[ -z $OUTLABEL ]] && OUTLABEL="OUT " 35 36# Use the provided interface, otherwise the device used for the default route. 37if[[-n$BLOCK_INSTANCE]];then 38 INTERFACE=$BLOCK_INSTANCE 39else 40 INTERFACE=$(ip route | awk '/^default/ { print $5 ; exit }') 41fi 42 43# Issue #36 compliant. 44if! [-e"/sys/class/net/${INTERFACE}/operstate"] || ! ["`cat /sys/class/net/${INTERFACE}/operstate`"="up"] 45then 46echo"$INTERFACEdown" 47echo"$INTERFACEdown" 48echo"#FF0000" 49exit0 50fi 51 52# path to store the old results in 53path="/dev/shm/$(basename $0)-${INTERFACE}" 54 55# grabbing data for each adapter. 56read rx <"/sys/class/net/${INTERFACE}/statistics/rx_bytes" 57read tx <"/sys/class/net/${INTERFACE}/statistics/tx_bytes" 58 59# get time 60time=$(date +%s) 61 62# write current data if file does not exist. Do not exit, this will cause 63# problems if this file is sourced instead of executed as another process. 64if! [[-f"${path}"]];then 65echo"${time}${rx}${tx}">"${path}" 66chmod0666"${path}" 67fi 68 69# read previous state and update data storage 70read old <"${path}" 71echo"${time}${rx}${tx}">"${path}" 72 73# parse old data and calc time passed 74old=(${old//;/ }) 75time_diff=$(( $time - ${old[0]} )) 76 77# sanity check: has a positive amount of time passed 78[["${time_diff}"-gt0]] ||exit 79 80# calc bytes transferred, and their rate in byte/s 81rx_diff=$(( $rx - ${old[1]} )) 82tx_diff=$(( $tx - ${old[2]} )) 83rx_rate=$(( $rx_diff / $time_diff )) 84tx_rate=$(( $tx_diff / $time_diff )) 85 86# shift by 10 bytes to get KiB/s. If the value is larger than 87# 1024^2 = 1048576, then display MiB/s instead 88 89# incoming 90echo -n"$INLABEL" 91rx_kib=$(( $rx_rate >> 10 )) 92ifhashbc2>/dev/null && [["$rx_rate"-gt1048576]];then 93printf'%sM'"`echo "scale=1;$rx_kib/1024" | bc`" 94else 95printf%03d ${rx_kib}# leading zeroes so length is constant 96echo -n"K" 97fi 98 99echo -n" " 100 101# outgoing 102echo -n"$OUTLABEL" 103tx_kib=$(( $tx_rate >> 10 )) 104ifhashbc2>/dev/null && [["$tx_rate"-gt1048576]];then 105printf'%sM'"`echo "scale=1;$tx_kib/1024" | bc`" 106else 107printf%03d ${tx_kib}# leading zeroes so length is constant 108echo -n"K" 109 110fi