Refactoring, making use of netifaces

This commit is contained in:
nepoz 2021-07-08 09:04:40 -05:00
parent 911230c659
commit 3f524ab371

View file

@ -13,78 +13,84 @@ import core.module
import core.widget import core.widget
import core.input import core.input
import netifaces
import socket
class Module(core.module.Module): class Module(core.module.Module):
@core.decorators.every(seconds=10) @core.decorators.every(seconds=10)
def __init__(self, config, theme): def __init__(self, config, theme):
super().__init__(config, theme, core.widget.Widget(self.network)) super().__init__(config, theme, core.widget.Widget(self.network))
self.__is_wireless = False self.__is_wireless = False
self.__is_connected = False
self.__interface = None self.__interface = None
self.__message = None self.__message = None
self.__signal = -110 self.__signal = -110
# Set up event handler for left mouse click
core.input.register(
self, button=core.input.LEFT_MOUSE, cmd="nm-connection-editor"
)
# Get network information to display to the user # Get network information to display to the user
def network(self, widgets): def network(self, widgets):
# run ip route command, tokenize output # Determine whether there is an internet connection
cmd = "ip route get 8.8.8.8" try:
std_out = util.cli.execute(cmd) socket.create_connection(("1.1.1.1", 53))
route_str = " ".join(std_out.split()) self.__is_connected = True
route_tokens = route_str.split(" ") except OSError:
self.__is_connected = False
# Attempt to extract a valid network interface device # Attempt to extract a valid network interface device
try: self.__interface = netifaces.gateways()["default"][netifaces.AF_INET][1]
self.__interface = route_tokens[route_tokens.index("dev") + 1]
except ValueError:
self.__interface = None
# Check to see if the interface (if it exists) is wireless # Check to see if the interface (if connected to the internet) is wireless
if self.__interface: if self.__is_connected:
with open("/proc/net/wireless", "r") as f: with open("/proc/net/wireless", "r") as f:
self.__is_wireless = self.__interface in f.read() self.__is_wireless = self.__interface in f.read()
f.close() f.close()
# setup message to send to the user # setup message to send to the user
if self.__interface is None: if not self.__is_connected:
self.__message = " No connection" self.__message = "No connection"
elif self.__is_wireless: elif not self.__is_wireless:
# Assuming that if user is connected via non-wireless means that it will be ethernet
self.__signal = -30
self.__message = "Ethernet"
else:
# We have a wireless connection
iw_dat = util.cli.execute("iwgetid") iw_dat = util.cli.execute("iwgetid")
has_ssid = "ESSID" in iw_dat has_ssid = "ESSID" in iw_dat
signal = self.__compute_signal(self.__interface)
self.__signal = util.format.asint(signal, minimum=-110, maximum=-30)
ssid = ( ssid = (
iw_dat[iw_dat.index(":") + 1 :].replace('"', "").strip() iw_dat[iw_dat.index(":") + 1 :].replace('"', "").strip()
if has_ssid if has_ssid
else "Unknown" else "Unknown"
) )
# Get connection strength
cmd = "iwconfig {}".format(self.__interface)
config_dat = " ".join(util.cli.execute(cmd).split())
config_tokens = config_dat.replace("=", " ").split()
strength = config_tokens[config_tokens.index("level") + 1]
self.__signal = util.format.asint(strength, minimum=-110, maximum=-30)
self.__message = self.__generate_wireles_message(ssid, self.__signal) self.__message = self.__generate_wireles_message(ssid, self.__signal)
else:
# Set signal to -30 as ethernet shouldn't have signal issues
self.__signal = -30
self.__message = " Ethernet"
return self.__message return self.__message
# The signal is measured in decibels/milliwatt, hence the weird numbers # State determined by signal strength
def state(self, widget): def state(self, widget):
if self.__signal < -80: if self.__compute_strength(self.__signal) < 50:
return "critical" return "critical"
if self.__signal < -65: if self.__compute_strength(self.__signal) < 75:
return "warning" return "warning"
return None return None
# manually done for better granularity / ease of parsing strength data # manually done for better granularity / ease of parsing strength data
def __generate_wireles_message(self, ssid, strength): def __generate_wireles_message(self, ssid, signal):
computed_strength = 100 * ((strength + 100) / 70.0) computed_strength = self.__compute_strength(signal)
return "{} {}%".format(ssid, int(computed_strength)) return "{} {}%".format(ssid, int(computed_strength))
def __compute_strength(self, signal):
return 100 * ((signal + 100) / 70.0)
# get signal strength in decibels/milliwat
def __compute_signal(self, interface):
# Get connection strength
cmd = "iwconfig {}".format(interface)
config_dat = " ".join(util.cli.execute(cmd).split())
config_tokens = config_dat.replace("=", " ").split()
signal = config_tokens[config_tokens.index("level") + 1]
return signal