#!/bin/sh -e
#
#    network: calculate the network up/down rates
#
#    Copyright (C) 2008 Canonical Ltd.
#    Copyright (C) 2011-2014 Dustin Kirkland
#
#    Authors: Dustin Kirkland <kirkland@byobu.org>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, version 3 of the License.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.

__network_detail() {
	get_network_interface; local interface="$_RET"
	if [ -x /sbin/ip ]; then
		LC_ALL=C /sbin/ip addr show "$interface" | $BYOBU_SED 's/\s*$//'
	else
		ifconfig "$interface" 2>/dev/null
	fi
}

__network() {
	get_network_interface; local interface="$_RET"
	local x1=0 x2=0 have_cache= i= t= unit= symbol= cache= rate=
	status_freq network
	t="$_RET"
	# By default, we won't bug the user with the display of network traffic
	# below NETWORK_THRESHOLD in kbps; override in $BYOBU_CONFIG_DIR/status
	[ -n "$NETWORK_THRESHOLD" ] || NETWORK_THRESHOLD=20
	# OpenBSD: cache netstat output once for both directions
	local _netstat_out=""
	if [ "$BYOBU_OSTYPE" = "OpenBSD" ]; then
		_netstat_out=$(netstat -ibn 2>/dev/null)
	fi
	for i in up down; do
		unit="kb"
		case $i in
			up) symbol="$ICON_UP" ;;
			down) symbol="$ICON_DN" ;;
		esac
		cache="$BYOBU_RUN_DIR/cache.$BYOBU_BACKEND/network.$i"
		if [ -r "$cache" ]; then
			read x1 < "$cache"
			have_cache=1
		else
			x1=0
			have_cache=0
		fi
		if [ -n "$_netstat_out" ]; then
			# OpenBSD netstat -ibn columns:
			# Name Mtu Network Address Ipkts Ierrs Ibytes Opkts Oerrs Obytes Coll
			local nb
			if [ "$i" = "up" ]; then
				nb=$(printf '%s\n' "$_netstat_out" | awk -v iface="$interface" '$1 == iface && $4 ~ /:/ { print $10; exit }')
			else
				nb=$(printf '%s\n' "$_netstat_out" | awk -v iface="$interface" '$1 == iface && $4 ~ /:/ { print $7; exit }')
			fi
			[ -n "$nb" ] && x2="$nb" || x2=0
			printf "%s" "$x2" > "$cache"
			[ "${t:-0}" -gt 0 ] 2>/dev/null || continue
			[ "$have_cache" -eq 1 ] || continue
		else
			local iface rbytes rpackets rerrs rdrop rfifo rframe rcompressed rmulticast tbytes tpackets terrs tdrop tfifo tcolls tcarrier tcompressed
			cat /proc/net/dev > "$cache".dev
			while read iface rbytes rpackets rerrs rdrop rfifo rframe rcompressed rmulticast tbytes tpackets terrs tdrop tfifo tcolls tcarrier tcompressed; do
				case "$iface" in
					${interface}:)
						[ "$i" = "up" ] && x2=${tbytes} || x2=${rbytes}
						break;
					;;
					${interface}:*)
						# Interface and tbytes got munged together
						[ "$i" = "up" ] && x2=${rmulticast##*:} || x2=${iface##*:}
						break;
					;;
				esac
			done < "$cache".dev
			printf "%s" "$x2" > "$cache"
			[ "$have_cache" -eq 1 ] || continue
		fi
		rate=$((8*($x2 - $x1) / $t / 1024))  # in kbps
		[ "$rate" -lt 0 ] && rate=0
		if [ $rate -gt $NETWORK_THRESHOLD ]; then
			case "$NETWORK_UNITS" in
				bytes)
					rate=$(($rate/8))
					if [ "$rate" -gt 1048576 ]; then
						fpdiv "$rate" 1048576 1
						rate=${_RET}
						unit="GB/s"
					elif [ "$rate" -gt 1024 ]; then
						fpdiv "$rate" 1024 1
						rate=${_RET}
						unit="MB/s"
					else
						unit="kB/s"
					fi
				;;
				*)
					# Default to bps
					# Why 1000 and not 1024?  http://en.wikipedia.org/wiki/Data_rate_units
					if [ "$rate" -gt 1000000 ]; then
						fpdiv "$rate" 1000000 1
						rate=${_RET}
						unit="Gb"
					elif [ "$rate" -gt 1000 ]; then
						fpdiv "$rate" 1000 1
						rate=${_RET}
						unit="Mb"
					fi
				;;
			esac
			[ -n "$rate" ] || continue
			color b m w; printf "%s%s" "$symbol" "$rate"; color -; color m w; printf "%s" "$unit"; color --
		else
			rm -f "$BYOBU_RUN_DIR/status.$BYOBU_BACKEND/network"*
		fi
	done
}

# vi: syntax=sh ts=4 noexpandtab
