diff --git a/bumblebee_status/modules/contrib/publicip.py b/bumblebee_status/modules/contrib/publicip.py index 86a21d7..7fba374 100644 --- a/bumblebee_status/modules/contrib/publicip.py +++ b/bumblebee_status/modules/contrib/publicip.py @@ -6,8 +6,8 @@ Displays information about the public IP address associated with the default rou * City Name * Geographic Coordinates -Left mouse click on the widget forces immediate update -Any change to the default route will cause the widget to update +Left mouse click on the widget forces immediate update. +Any change to the default route will cause the widget to update. Requirements: * netifaces @@ -21,7 +21,7 @@ Examples: * bumblebee-status -m publicip -p publicip.format="{ip} which is in {city_name}" * bumblebee-status -m publicip -p publicip.format="Your packets are right here: {coordinates}" -contributed by `tfwiii `_ - many thanks! +contributed by `tfwiii ` - many thanks! """ import re @@ -57,9 +57,15 @@ class Module(core.module.Module): self.__monitor.start() def monitor(self): - current_default_route = None default_route = None + interfaces = None + # Initially set to True to force an info update on first pass + information_changed = True + + self.update() + while threading.main_thread().is_alive(): + # Look for any changes in the netifaces default route information try: current_default_route = netifaces.gateways()["default"][2] except: @@ -67,11 +73,32 @@ class Module(core.module.Module): current_default_route = None if current_default_route != default_route: default_route = current_default_route + information_changed = True + + # netifaces does not check ALL routing tables which might lead to false negatives + # (ref: http://linux-ip.net/html/routing-tables.html) so additionally... look for + # any changes in the netifaces interfaces information which might also be an inticator + # of a change of route/external IP + if not information_changed: # Only check if no routing table change found + try: + current_interfaces = netifaces.interfaces() + except: + # error reading interfaces information -> assume none exists + current_interfaces = None + if current_interfaces != interfaces: + interfaces = current_interfaces + information_changed = True + + # Update either routing or interface information has changed + if information_changed: + information_changed = False self.update() + + # Throttle the calls to netifaces time.sleep(1) def publicip(self, widget): - if widget.get("public_ip") == None: + if widget.get("public_ip") is None: return "n/a" return self._format.format( ip=widget.get("public_ip", "-"), @@ -83,12 +110,17 @@ class Module(core.module.Module): def __click_update(self, event): util.location.reset() + # pause to allow reset time to complete + time.sleep(2) def update(self): widget = self.widget() try: util.location.reset() + # pause to allow reset time to complete + time.sleep(2) + # Fetch fresh location information __info = util.location.location_info() @@ -106,11 +138,12 @@ class Module(core.module.Module): # Update widget values core.event.trigger("update", [widget.module.id], redraw_only=True) - except: + except Exception as ex: widget.set("public_ip", None) + print(ex) def state(self, widget): return widget.get("state", None) -# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 \ No newline at end of file