-
Notifications
You must be signed in to change notification settings - Fork 2
/
ifbw.py
136 lines (125 loc) · 4.09 KB
/
ifbw.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import argparse
import time
import signal
#
# Parameter parsing
#
argparser = argparse.ArgumentParser()
argparser.add_argument(
'-n',
metavar='<iterations>',
dest='iterations',
default=-1,
help='how many iterations to perform before exiting (defaults to infinite)'
)
argparser.add_argument(
'-i',
'--interval',
metavar='<seconds>',
default=1,
help='interval between measurements'
)
argparser.add_argument(
metavar='interface',
dest='interface_list',
nargs='*',
default='all',
help='list of interfaces, separated by spaces, defaults to all interfaces'
)
argparser.add_argument(
'-d',
action='store_const',
const='True',
dest='debug',
help='turn on debug mode (developers only)'
)
arguments = argparser.parse_args()
if arguments.debug: print(arguments)
#
# Function for gathering data from system counters
#
def gather_interface_data():
datafile = open("/proc/net/dev","r")
# Skip the headers
datafile.readline()
datafile.readline()
interfaces = {}
for line in datafile:
interface_info = line.replace(':', ' ').split()
interface = interface_info[0]
# check if reading info about an interface we're interested in
if \
interface not in arguments.interface_list and \
'all' != arguments.interface_list \
:
continue
interfaces[interface] = {}
interfaces[interface]['bytes_received'] = int(interface_info[ 1])
interfaces[interface]['packets_received'] = int(interface_info[ 2])
interfaces[interface]['bytes_sent'] = int(interface_info[ 9])
interfaces[interface]['packets_sent'] = int(interface_info[10])
datafile.close()
return interfaces
#
# Function for making larger numbers (of data) more human-readable
#
def data_human(data):
data = float(data)
order = 0 # of magnitude - index for the array below
units = ['B', 'kB', 'MB', 'GB']
while True:
if data > 1024:
data /= 1024
order += 1
else:
break
return { 'amount':data, 'units':units[order] }
#
# Function that calculates the rates and prints them
#
def print_rates():
counters_before = gather_interface_data()
time.sleep( float(arguments.interval) )
counters_after = gather_interface_data()
# loop through interfaces that data has been collected about
for interface in counters_before:
# Calculate differences
bytes_received = counters_after[interface]['bytes_received'] - \
counters_before[interface]['bytes_received']
packets_received = counters_after[interface]['packets_received'] - \
counters_before[interface]['packets_received']
bytes_sent = counters_after[interface]['bytes_sent'] - \
counters_before[interface]['bytes_sent']
packets_sent = counters_after[interface]['packets_sent'] - \
counters_before[interface]['packets_sent']
# Data rates per second
bytes_received_rate = int( bytes_received / float(arguments.interval) )
packets_received_rate = int( packets_received / float(arguments.interval) )
bytes_sent_rate = int( bytes_sent / float(arguments.interval) )
packets_sent_rate = int( packets_sent / float(arguments.interval) )
# Print the result
print(
'{0:>4s}: Download: {1:>5.1f} {2:<4s}, Upload: {3:>5.1f} {4:s}'.format(
interface,
data_human(bytes_received_rate)['amount'],
data_human(bytes_received_rate)['units'] + '/s',
data_human(bytes_sent_rate)['amount'],
data_human(bytes_sent_rate)['units'] + '/s'
)
)
#
# ctrl+c handler
#
def sigint_handler(signum, frame):
print
exit(0)
#
# Main loop
#
signal.signal(signal.SIGINT, sigint_handler)
if (-1) == arguments.iterations:
while True:
print_rates()
else:
for iteration in range(0, int(arguments.iterations)):
print_rates()