diff --git a/bumblebee_status/modules/contrib/network.py b/bumblebee_status/modules/contrib/network.py index 37115e1..c40d0d8 100644 --- a/bumblebee_status/modules/contrib/network.py +++ b/bumblebee_status/modules/contrib/network.py @@ -3,8 +3,9 @@ A module to show currently active network connection (ethernet or wifi) and connection strength. """ -import subprocess -import os + +import util.cli +import util.format import core.module import core.widget @@ -18,31 +19,55 @@ class Module(core.module.Module): self._message = None def network(self, widgets): - # start subprocess to get networked data - std_out = os.popen("ip route get 8.8.8.8") - route_str = " ".join(std_out.read().split()) + # run ip route command, tokenize output + cmd = "ip route get 8.8.8.8" + std_out = util.cli.execute(cmd) + route_str = " ".join(std_out.split()) route_tokens = route_str.split(" ") + # Attempt to extract a valid network interface device try: - self._interface = route_tokens[route_tokens.index("dev") + 1] + ":" + self._interface = route_tokens[route_tokens.index("dev") + 1] except ValueError: self._interface = None - with open("/proc/net/wireless", "r") as f: - if self._interface: + # Check to see if the interface (if it exists) is wireless + if self._interface: + with open("/proc/net/wireless", "r") as f: self._is_wireless = self._interface in f.read() + f.close() - # setup message to send to bar + # setup message to send to the user if self._interface is None: self._message = "Not connected to a network" elif self._is_wireless: - self._message = "Connected to WiFi" + cmd = "iwgetid" + iw_dat = util.cli.execute(cmd) + has_ssid = "ESSID" in iw_dat + ssid = iw_dat[iw_dat.index(":") + 2: -2] if has_ssid 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] + strength = util.format.asint(strength, minimum=-110, maximum=-30) + + self._message = self.__generate_wireless_message(ssid, strength) else: - # self._message = "Connected to Ethernet" self._message = self._message - return self._message + def __generate_wireless_message(self, ssid, strength): + computed_strength = 100 * (strength + 110) / 70.0 + if computed_strength < 25: + return ssid + " poor" + if computed_strength < 50: + return ssid + " fair" + if computed_strength < 75: + return ssid + " good" + + return ssid + " excellent"