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() { 91 if [$1== 0 ]; then 92 printf '000K' 93 elif [$1-lt 999 ]; then 94 # printf '%sK' "$1"; 95 printf %03d%s${1%.*}K 96 elif [$1-lt 10240 ]; then 97 printf '%sM' "`echo "scale=1;$1/ 1024" | bc -l`" 98 elif [$1-lt 102400 ]; then 99 printf '0%sM' "$(round `echo "scale=1;$1 / 1024" | bc -l` 0)" 100 elif [$1-lt 1024000 ]; then 101 printf '%sM' "$(round `echo "scale=1;$1 / 1024" | bc -l` 0)" 102 else 103 printf '%sG' "$(round `echo "scale=2;$1 / 1048576" | bc -l` 1)" 104 fi 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 ))