#!/usr/bin/python

# Written by Philip M. White <pmw@qnan.org>
# I place this code in the public domain.

import datetime
import sys
import time

PAUSE_SECS = 10
DEVICE = 'ppp0'

def show_stats(device, pause_secs=10):
	devstatus = 1	# 0=present, 1=unknown, 2=not present
	rx_b_last = rx_b_curr = None
	rx_p_last = rx_p_curr = None
	tx_b_last = tx_b_curr = None
	tx_p_last = tx_p_curr = None
	first_time = True
	while True:
		if devstatus == 0:
			devstatus = 1
		f = open('/proc/net/dev', 'r')
		for line in f.readlines():
			line = line.replace(':', ' ').strip()
			tokens = line.split()
			if tokens[0] != device:
				continue
			if devstatus == 2:
				sys.stderr.write(str(datetime.datetime.now())+': Device '+device+' appeared.\n')
			devstatus = 0
			rx_b_last = rx_b_curr
			rx_p_last = rx_p_curr
			tx_b_last = tx_b_curr
			tx_p_last = tx_p_curr
			rx_b_curr = int(tokens[1])
			rx_p_curr = int(tokens[2])
			tx_b_curr = int(tokens[9])
			tx_p_curr = int(tokens[10])
			if not first_time:
				print '%s %s: rx %6.2f KB/s, %6.2f p/s     tx %6.2f KB/s, %6.2f p/s' % \
					(datetime.datetime.now().strftime("%H:%M:%S"),
					device,
					float(rx_b_curr-rx_b_last)/pause_secs/1024,
					float(rx_p_curr-rx_p_last)/pause_secs,
					float(tx_b_curr-tx_b_last)/pause_secs/1024,
					float(tx_p_curr-tx_p_last)/pause_secs)
			first_time = False
		f.close()
		if devstatus == 0:
			time.sleep(pause_secs)
		elif devstatus == 1:
			if first_time:
				sys.stderr.write('Device '+device+' is not present.\n')
			else:
				sys.stderr.write(str(datetime.datetime.now())+': Device '+device+' disappeared.\n')
			rx_b_last = rx_p_last = tx_b_last = tx_p_last = None
			rx_b_curr = rx_p_curr = tx_b_curr = tx_p_curr = None
			first_time = True
			devstatus = 2
		elif devstatus == 2:
			time.sleep(1)

if len(sys.argv) > 3:
	sys.stderr.write('Syntax: '+sys.argv[0]+' [dev] [refresh-rate]\n')
	sys.exit(1)
if len(sys.argv) >= 2:
	DEVICE = sys.argv[1]
if len(sys.argv) == 3:
	PAUSE_SECS = int(sys.argv[2])

print 'Observing device '+DEVICE+' every '+str(PAUSE_SECS)+' seconds.'
try:
	show_stats(DEVICE, PAUSE_SECS)
except KeyboardInterrupt:
	sys.exit(0)
