Remove NetUtil class, don't inherit from object, slight refactoring.

This commit is contained in:
facetoe 2015-01-04 10:46:15 +08:00
parent a9116fa592
commit 8425db8d8d

View File

@ -2,35 +2,32 @@
import netifaces import netifaces
import basiciw import basiciw
import psutil import psutil
from itertools import zip_longest
from i3pystatus import IntervalModule from i3pystatus import IntervalModule
from i3pystatus.core.color import ColorRangeModule from i3pystatus.core.color import ColorRangeModule
from i3pystatus.core.util import make_graph, round_dict, make_bar from i3pystatus.core.util import make_graph, round_dict, make_bar
class NetUtil(object): def count_bits(integer):
@staticmethod
def count_bits(integer):
bits = 0 bits = 0
while (integer): while (integer):
integer &= integer - 1 integer &= integer - 1
bits += 1 bits += 1
return bits return bits
@staticmethod
def v6_to_int(v6): def v6_to_int(v6):
return int(v6.replace(":", ""), 16) return int(v6.replace(":", ""), 16)
@staticmethod
def prefix6(mask):
return NetUtil.count_bits(NetUtil.v6_to_int(mask))
@staticmethod def prefix6(mask):
def cidr6(addr, mask): return count_bits(v6_to_int(mask))
return "{addr}/{bits}".format(addr=addr, bits=NetUtil.prefix6(mask))
@staticmethod
def v4_to_int(v4): def cidr6(addr, mask):
return "{addr}/{bits}".format(addr=addr, bits=prefix6(mask))
def v4_to_int(v4):
sum = 0 sum = 0
mul = 1 mul = 1
for part in reversed(v4.split(".")): for part in reversed(v4.split(".")):
@ -38,16 +35,16 @@ class NetUtil(object):
mul *= 2 ** 8 mul *= 2 ** 8
return sum return sum
@staticmethod
def prefix4(mask):
return NetUtil.count_bits(NetUtil.v4_to_int(mask))
@staticmethod def prefix4(mask):
def cidr4(addr, mask): return count_bits(v4_to_int(mask))
return "{addr}/{bits}".format(addr=addr, bits=NetUtil.prefix4(mask))
@staticmethod
def get_bonded_slaves(): def cidr4(addr, mask):
return "{addr}/{bits}".format(addr=addr, bits=prefix4(mask))
def get_bonded_slaves():
try: try:
with open("/sys/class/net/bonding_masters") as f: with open("/sys/class/net/bonding_masters") as f:
masters = f.read().split() masters = f.read().split()
@ -60,8 +57,8 @@ class NetUtil(object):
slaves[slave] = master slaves[slave] = master
return slaves return slaves
@staticmethod
def sysfs_interface_up(interface, unknown_up=False): def sysfs_interface_up(interface, unknown_up=False):
try: try:
with open("/sys/class/net/{}/operstate".format(interface)) as f: with open("/sys/class/net/{}/operstate".format(interface)) as f:
status = f.read().strip() status = f.read().strip()
@ -72,7 +69,7 @@ class NetUtil(object):
return status == "up" or unknown_up and status == "unknown" return status == "up" or unknown_up and status == "unknown"
class NetworkInfo(object): class NetworkInfo():
""" """
Retrieve network information. Retrieve network information.
""" """
@ -87,21 +84,19 @@ class NetworkInfo(object):
self.unknown_up = unknown_up self.unknown_up = unknown_up
def get_info(self, interface): def get_info(self, interface):
format_dict = dict( format_dict = dict(v4="", v4mask="", v4cidr="", v6="", v6mask="", v6cidr="")
zip_longest(["v4", "v4mask", "v4cidr", "v6", "v6mask", "v6cidr"], [], fillvalue="")) iface_up = sysfs_interface_up(interface, self.unknown_up)
iface_up = NetUtil.sysfs_interface_up(interface, self.unknown_up)
if not iface_up: if not iface_up:
return format_dict return format_dict
network_info = netifaces.ifaddresses(interface) network_info = netifaces.ifaddresses(interface)
slaves = NetUtil.get_bonded_slaves() slaves = get_bonded_slaves()
try: try:
master = slaves[interface] master = slaves[interface]
except KeyError: except KeyError:
pass pass
else: else:
if NetUtil.sysfs_interface_up(interface, self.unknown_up): if sysfs_interface_up(interface, self.unknown_up):
master_info = netifaces.ifaddresses(master) master_info = netifaces.ifaddresses(master)
for af in (netifaces.AF_INET, netifaces.AF_INET6): for af in (netifaces.AF_INET, netifaces.AF_INET6):
try: try:
@ -128,25 +123,25 @@ class NetworkInfo(object):
v4 = network_info[netifaces.AF_INET][0] v4 = network_info[netifaces.AF_INET][0]
info["v4"] = v4["addr"] info["v4"] = v4["addr"]
info["v4mask"] = v4["netmask"] info["v4mask"] = v4["netmask"]
info["v4cidr"] = NetUtil.cidr4(v4["addr"], v4["netmask"]) info["v4cidr"] = cidr4(v4["addr"], v4["netmask"])
if netifaces.AF_INET6 in network_info: if netifaces.AF_INET6 in network_info:
for v6 in network_info[netifaces.AF_INET6]: for v6 in network_info[netifaces.AF_INET6]:
info["v6"] = v6["addr"] info["v6"] = v6["addr"]
info["v6mask"] = v6["netmask"] info["v6mask"] = v6["netmask"]
info["v6cidr"] = NetUtil.cidr6(v6["addr"], v6["netmask"]) info["v6cidr"] = cidr6(v6["addr"], v6["netmask"])
if not v6["addr"].startswith("fe80::"): # prefer non link-local addresses if not v6["addr"].startswith("fe80::"): # prefer non link-local addresses
break break
return info return info
@staticmethod @staticmethod
def extract_wireless_info(interface): def extract_wireless_info(interface):
info = dict(essid="", freq="", quality=0.0, quality_bar="")
try: try:
iwi = basiciw.iwinfo(interface) iwi = basiciw.iwinfo(interface)
except Exception: except Exception:
# Not a wireless interface # Not a wireless interface
return dict(essid="", freq="", quality=0.0, quality_bar="") return info
info = dict()
info["essid"] = iwi["essid"] info["essid"] = iwi["essid"]
info["freq"] = iwi["freq"] info["freq"] = iwi["freq"]
quality = iwi["quality"] quality = iwi["quality"]
@ -160,7 +155,7 @@ class NetworkInfo(object):
return info return info
class NetworkTraffic(object): class NetworkTraffic():
""" """
Retrieve network traffic information Retrieve network traffic information
""" """
@ -198,7 +193,7 @@ class NetworkTraffic(object):
self.update_counters(interface) self.update_counters(interface)
usage = dict(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0) usage = dict(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0)
if not NetUtil.sysfs_interface_up(interface, self.unknown_up) or not self.pnic_before: if not sysfs_interface_up(interface, self.unknown_up) or not self.pnic_before:
return usage return usage
else: else:
usage["bytes_sent"] = self.get_bytes_sent() usage["bytes_sent"] = self.get_bytes_sent()
@ -330,11 +325,11 @@ class Network(IntervalModule, ColorRangeModule):
else: else:
raise Exception("graph_type must be either 'input' or 'output'!") raise Exception("graph_type must be either 'input' or 'output'!")
format_values['interface'] = self.interface
format_values['network_graph'] = self.get_network_graph(kbs) format_values['network_graph'] = self.get_network_graph(kbs)
format_values['kbs'] = "{0:.1f}".format(round(kbs, 2)).rjust(6) format_values['kbs'] = "{0:.1f}".format(round(kbs, 2)).rjust(6)
format_values['interface'] = self.interface
if NetUtil.sysfs_interface_up(self.interface, self.unknown_up): if sysfs_interface_up(self.interface, self.unknown_up):
if self.dynamic_color: if self.dynamic_color:
color = self.get_gradient(kbs, self.colors, self.upper_limit) color = self.get_gradient(kbs, self.colors, self.upper_limit)
else: else: