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 86round() { 87echo $(printf%.$2f $(echo"scale=$2;(((10^$2)*$1)+0.5)/(10^$2)"|bc)) 88} 89 90format() { 91if[$1==0];then 92printf'000K' 93elif[$1-lt999];then 94# printf '%sK' "$1"; 95printf%03d%s ${1%.*} K 96elif[$1-lt10240];then 97printf'%sM'"`echo "scale=1;$1/1024" | bc -l`" 98elif[$1-lt102400];then 99printf'0%sM'"$(round `echo "scale=1;$1/1024" | bc -l` 0)" 100elif[$1-lt1024000];then 101printf'%sM'"$(round `echo "scale=1;$1/1024" | bc -l` 0)" 102else 103printf'%sG'"$(round `echo "scale=2;$1/1048576" | bc -l` 1)" 104fi 105} 106 107# shift by 10 bytes to get KiB/s. If the value is larger than 108# 1024^2 = 1048576, then display MiB/s instead 109 110# incoming 111echo -n"$INLABEL" 112format $(($rx_rate>>10)) 113 114echo -n" " 115 116# outgoing 117echo -n"$OUTLABEL" 118format $(($tx_rate>>10))