Support bonded interfaces under Linux

The "network" and "wireless" modules now support interfaces enslaved to
a bonding master. We check sysfs for bonded interfaces, and update each
slave's AF_INET/AF_INET6 from its master.
This commit is contained in:
Tom X. Tobin 2014-06-10 20:56:42 -04:00
parent 7b36808b0b
commit df50913332

View File

@ -45,6 +45,20 @@ def cidr4(addr, mask):
return "{addr}/{bits}".format(addr=addr, bits=prefix4(mask)) return "{addr}/{bits}".format(addr=addr, bits=prefix4(mask))
def get_bonded_slaves():
try:
with open("/sys/class/net/bonding_masters") as f:
masters = f.read().split()
except FileNotFoundError:
return {}
slaves = {}
for master in masters:
with open("/sys/class/net/{}/bonding/slaves".format(master)) as f:
for slave in f.read().split():
slaves[slave] = master
return slaves
class Network(IntervalModule): class Network(IntervalModule):
""" """
Display network information about a interface. Display network information about a interface.
@ -93,6 +107,18 @@ class Network(IntervalModule):
return self.color_down, self.format_down, {"interface": self.interface, "name": self.name}, False return self.color_down, self.format_down, {"interface": self.interface, "name": self.name}, False
info = netifaces.ifaddresses(self.interface) info = netifaces.ifaddresses(self.interface)
slaves = get_bonded_slaves()
try:
master = slaves[self.interface]
except KeyError:
pass
else:
master_info = netifaces.ifaddresses(master)
for af in (netifaces.AF_INET, netifaces.AF_INET6):
try:
info[af] = master_info[af]
except KeyError:
pass
up = netifaces.AF_INET in info or netifaces.AF_INET6 in info up = netifaces.AF_INET in info or netifaces.AF_INET6 in info
fdict = dict( fdict = dict(
zip_longest(["v4", "v4mask", "v4cidr", "v6", "v6mask", "v6cidr"], [], fillvalue="")) zip_longest(["v4", "v4mask", "v4cidr", "v6", "v6mask", "v6cidr"], [], fillvalue=""))