Views:
995
Votes: 4
Tags:
networking
bash
conky
bandwidth
vnstat
Link:
🔍 See Original Answer on Ask Ubuntu ⧉ 🔗
URL:
https://askubuntu.com/q/1170353
Title:
vnstat - combine WiFi and Ethernet usage together
ID:
/2019/09/02/vnstat-combine-WiFi-and-Ethernet-usage-together
Created:
September 2, 2019
Edited: September 7, 2019
Upload:
September 15, 2024
Layout: post
TOC:
false
Navigation: false
Copy to clipboard: false
This bash script will add up vnstat
totals for multiple interfaces:
#!/bin/bash
# NAME: vnall
# DESC: Add up multiple interfaces of vnstat into totals for today,
# yesterday, current week and current month.
# PARM: "today", "yesterday", "week" (current), "month" (current)
# DATE: September 2, 2019. Modified September 4, 2019.
# To discover interfaces `lshw -c network` then place names below
# aInterfaces=( "enp59s0" "wlp60s0" )
# Use automatic discovery if you are unsure of names or don't want to look up
Interfaces=( $(lshw -c network 2>/dev/null | grep name: | cut -d':' -f2) )
Tally () {
Ktot=0 # Totals in KiB, MiB and GiB
Mtot=0
Gtot=0
# Tally all interfaces
local i Interface Line Raw ThisNum
for (( i=0; i<${#aInterfaces[@]}; i++ )) ; do
Interface="${aInterfaces[i]}"
if [[ "$vnstatParm" == "" ]] ; then
Line=$(vnstat -i "$Interface" | grep "$GrepString")
else
Line=$(vnstat -i "$Interface" "$vnstatParm" | grep "$GrepString")
fi
[[ $Line == "" ]] && continue # No data collected yet
if [[ $vnstatParm == "" ]] ; then
Raw=$(echo "$Line" | awk '{print $8 substr ($9, 1, 1)}')
else
Raw=$(echo "$Line" | awk '{print $9 substr ($10, 1, 1)}')
fi
ThisNum="${Raw::-1}" # Number without suffix
case ${Raw: -1} in # Decide on last character K, M or G
K)
Ktot=$(echo "$Ktot + $ThisNum " | bc) ;;
M)
Mtot=$(echo "$Mtot + $ThisNum " | bc) ;;
G)
Gtot=$(echo "$Gtot + $ThisNum " | bc) ;;
*)
echo "Unknown Unit: ${Raw: -1}" ;;
esac
done
[[ $Gtot != "0" ]] && { echo "$Gtot G" ; return ; }
[[ $Mtot != "0" ]] && { echo "$Mtot M" ; return ; }
[[ $Ktot != "0" ]] && { echo "$Ktot K" ; return ; }
echo "N/A"
} # Tally
Init () {
GrepString="$1" # Create defaults for "today" and "yesterday"
vnstatParm=""
if [[ $1 == week ]] ; then
GrepString="current $GrepString"
vnstatParm="-w"
fi
if [[ $1 == month ]] ; then
GrepString=$(date +"%b '%y")
vnstatParm="-m"
fi
} # Init
Init "$@"
Tally
Automatic vs Manual interface names
Notes this section of code:
# To discover interfaces `lshw -c network` then place names below
# aInterfaces=( "enp59s0" "wlp60s0" )
# Use automatic discovery if you are unsure of names or don't want to look up
Interfaces=( $(lshw -c network 2>/dev/null | grep name: | cut -d':' -f2) )
The fourth line automatically discovers the interface names (in my case enp59s0
and wlp60s0
) and builds the array of interfaces (aInterfaces
). If you prefer to manually specify the names in your script then place a comment (#
) at the beginning of the line and uncomment the second line by removing the #
line prefix.
Conky code shrinks considerably
Because the new vnall
script automatically creates parameters as needed, the conky code is a lot smaller than before:
${color}${goto 5}Today ${goto 100}Yesterday ${goto 225}Week ${goto 325}Month ${color green}
# vnstatd updates database every five minutes
${execi 300 vnall "today"} ${goto 110}${execi 300 vnall "yesterday"} ${goto 220}${execi 300 vnall "week"} ${goto 315}${execi 300 vnall "month"}