Merge branch 'feature/autodetect-network-interfaces' into develop

This commit is contained in:
Kim Silkebækken 2013-03-21 17:25:35 +01:00
commit 49b54353a1
2 changed files with 48 additions and 4 deletions

View File

@ -67,11 +67,14 @@ class ThreadedSegment(Thread):
self.update()
def startup(self, **kwargs):
# Normally .update() succeeds to run before value is requested, meaning
# that user is getting values he needs directly at vim startup. Without
# .startup() we will not have to wait long until receiving bug “I opened
# vim, but branch information is only shown after I move cursor”.
self.run_once = False
self.set_state(**kwargs)
if not self.is_alive():
self.set_state(**kwargs)
self.start()

View File

@ -452,6 +452,12 @@ try:
return None
return if_io.bytes_recv, if_io.bytes_sent
def _get_interfaces():
io_counters = psutil.network_io_counters(pernic=True)
for interface, data in io_counters.items():
if data:
yield interface, data.bytes_recv, data.bytes_sent
def _get_user():
return psutil.Process(os.getpid()).username
@ -476,6 +482,12 @@ except ImportError:
except IOError:
return None
def _get_interfaces():
for interface in os.listdir('/sys/class/net'):
x = _get_bytes(interface)
if x is not None:
yield interface, x[0], x[1]
def _get_user(): # NOQA
return os.environ.get('USER', None)
@ -552,13 +564,42 @@ def uptime(format='{days}d {hours:02d}h {minutes:02d}m'):
class NetworkLoadSegment(KwThreadedSegment):
import re
interfaces = {}
replace_num_pat = re.compile(r'[a-zA-Z]+')
@staticmethod
def key(interface='eth0', **kwargs):
def key(interface='detect', **kwargs):
return interface
def compute_state(self, interface):
if interface == 'detect':
proc_exists = getattr(self, 'proc_exists', None)
if proc_exists is None:
proc_exists = self.proc_exists = os.path.exists('/proc/net/route')
if proc_exists:
# Look for default interface in routing table
with open('/proc/net/route', 'rb') as f:
for line in f.readlines():
parts = line.split()
if len(parts) > 1:
iface, destination = parts[:2]
if not destination.replace(b'0', b''):
interface = iface.decode('utf-8')
break
if interface == 'detect':
# Choose interface with most total activity, excluding some
# well known interface names
interface, total = 'eth0', -1
for name, rx, tx in _get_interfaces():
base = self.replace_num_pat.match(name)
if None in (base, rx, tx) or base.group() in ('lo', 'vmnet', 'sit'):
continue
activity = rx + tx
if activity > total:
total = activity
interface = name
if interface in self.interfaces:
idata = self.interfaces[interface]
try:
@ -603,7 +644,7 @@ falls back to reading
:file:`/sys/class/net/{interface}/statistics/{rx,tx}_bytes`.
:param str interface:
network interface to measure
network interface to measure (use the special value "detect" to have powerline try to auto-detect the network interface)
:param str suffix:
string appended to each load string
:param bool si_prefix: