How can I check the data transfer on a network interface in python?
The best way to poll ethernet interface statistics is through SNMP...
It looks like you're using linux... if so, load up your
snmpd
with these options... after installingsnmpd
, in your /etc/defaults/snmpd (make sure the line withSNMPDOPTS
looks like this):SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux,usmConf,iquery,dlmod,diskio,lmSensors,hr_network,snmpEngine,system_mib,at,interface,ifTable,ipAddressTable,ifXTable,ip,cpu,tcpTable,udpTable,ipSystemStatsTable,ip,snmp_mib,tcp,icmp,udp,proc,memory,snmpNotifyTable,inetNetToMediaTable,ipSystemStatsTable,disk -Lsd -p /var/run/snmpd.pid'
You might also need to change the ro community to
public
See Note 1 and set your listening interfaces in/etc/snmp/snmpd.conf
(if not on the loopback)...Assuming you have a functional
snmpd
, at this point, you can pollifHCInBytes
andifHCOutBytes
See Note 2 for your interface(s) in question using this...
poll_bytes.py:
from SNMP import v2Manager
import time
def poll_eth0(manager=None):
# NOTE: 2nd arg to get_index should be a valid ifName value
in_bytes = manager.get_index('ifHCInOctets', 'eth0')
out_bytes = manager.get_index('ifHCOutOctets', 'eth0')
return (time.time(), int(in_bytes), int(out_bytes))
# Prep an SNMP manager object...
mgr = v2Manager('localhost')
mgr.index('ifName')
stats = list()
# Insert condition below, instead of True...
while True:
stats.append(poll_eth0(mgr))
print poll_eth0(mgr)
time.sleep(5)
SNMP.py
:
from subprocess import Popen, PIPE
import re
class v2Manager(object):
def __init__(self, addr='127.0.0.1', community='public'):
self.addr = addr
self.community = community
self._index = dict()
def bulkwalk(self, oid='ifName'):
cmd = 'snmpbulkwalk -v 2c -Osq -c %s %s %s' % (self.community,
self.addr, oid)
po = Popen(cmd, shell=True, stdout=PIPE, executable='/bin/bash')
output = po.communicate()[0]
result = dict()
for line in re.split(r'\r*\n', output):
if line.strip()=="":
continue
idx, value = re.split(r'\s+', line, 1)
idx = idx.replace(oid+".", '')
result[idx] = value
return result
def bulkwalk_index(self, oid='ifOutOctets'):
result = dict()
if not (self._index==dict()):
vals = self.bulkwalk(oid=oid)
for key, val in vals.items():
idx = self._index.get(key, None)
if not (idx is None):
result[idx] = val
else:
raise ValueError, "Could not find '%s' in the index (%s)" % self.index
else:
raise ValueError, "Call the index() method before calling bulkwalk_index()"
return result
def get_index(self, oid='ifOutOctets', index=''):
# This method is horribly inefficient... improvement left as exercise for the reader...
if index:
return self.bulkwalk_index().get(index, "<unknown>")
else:
raise ValueError, "Please include an index to get"
def index(self, oid='ifName'):
self._index = self.bulkwalk(oid=oid)
END NOTES:
SNMP v2c uses clear-text authentication. If you are worried about security / someone sniffing your traffic, change your community and restrict queries to your linux machine by source ip address. The perfect world would be to modify the
SNMP.py
above to use SNMPv3 (which encrypts sensitive data); most people just use a non-public community and restrict snmp queries by source IP.ifHCInOctets
andifHCOutOctets
provide instantaneous values for the number of bytes transferred through the interface. If you are looking for data transfer rate, of course there will be some additional math involved.
Easiest Way to Transfer Data Over the Internet, Python
As long as its not asynchronous (doing sending and receiving at once), you can use the socket interface.
If you like abstractions (or need asynchronous support), there is always Twisted.
Here is an example with the socket interface (which will become harder to use as your program grows larger, so, I would suggest either Twisted or asyncore)
import socket
def mysend(sock, msg):
totalsent = 0
while totalsent < MSGLEN:
sent = sock.send(msg[totalsent:])
if sent == 0:
raise RuntimeError("socket connection broken")
totalsent = totalsent + sent
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("where ever you have your other computer", "port number"))
i = 2
mysend(s, str(i))
The python documentation is excellent, I picked up the mysend() function from there.
If you are doing computation related work, check out XML-RPC, which python has all nicely packaged up for you.
Remember, sockets are just like files, so they're not really much different to write code for, so, as long as you can do basic file io, and understand events, socket programming isn't hard, at all (as long as you don't get too complicated like multiplexing VoIP streams...)
Related Topics
Ignore Case in Glob() on Linux
Mismatch Between Sys.Executable and Sys.Version in Python
Datastax Python Cassandra Driver Build Fails on Ubuntu
Typeerror: Argument 1 Must Be Pygame.Surface, Not Str How to Fix
Python Logging - Check Location of Log Files
How to Get a Process's Stdin by a Process Id
How to Get the Python Call Stack with the Linux Perf
Cross Platform Numpy.Random.Seed()
Launch Default Image Viewer from Pygtk Program
Python Multiprocessing Memory Usage
Detect Log File Rotation (While Watching Log File for Modification)
What Conditions Result in an Opened, Nonblocking Named Pipe (Fifo) Being "Unavailable" for Reads
A Function Callback Every Time a Key Is Pressed (Regardless of Which Window Has Focus)
Subprocess.Popen: 'Oserror: [Errno 13] Permission Denied' Only on Linux
How to Kill Zombie Processes Created by Multiprocessing Module
How to Find Out the Date of the Last Saturday in Linux Shell Script or Python