Bug fix improvements to publicip and util.location

Fixed publicip bug arising from last PR review
Simplified ip change detection code
Added pause after location.reset() call to allow completion before query
util.location - change order of information providers as default was not returning geo coords
This commit is contained in:
tfwiii 2022-10-08 10:42:12 +07:00
parent 605b749e22
commit cace02909e
2 changed files with 45 additions and 55 deletions

View file

@ -60,43 +60,34 @@ class Module(core.module.Module):
self.__monitor.start() self.__monitor.start()
def monitor(self): def monitor(self):
default_route = None __previous_ips = set()
interfaces = None __current_ips = set()
# Initially set to True to force an info update on first pass # Initially set to True to force an info update on first pass
information_changed = True __information_changed = True
self.update() self.update()
while threading.main_thread().is_alive(): while threading.main_thread().is_alive():
# Look for any changes in the netifaces default route information __current_ips.clear()
# Look for any changes to IP addresses
try: try:
current_default_route = netifaces.gateways()["default"][2] for interface in netifaces.interfaces():
__current_ips.add(netifaces.ifaddresses(interface)[2][0]['addr'])
except: except:
# error reading out default gw -> assume none exists # If not ip address information found clear __current_ips
current_default_route = None __current_ips.clear()
if current_default_route != default_route:
default_route = current_default_route # If a change of any interfaces' IP then flag change
information_changed = True if __current_ips.symmetric_difference(__previous_ips):
__previous_ips = __current_ips.copy()
__information_changed = True
# netifaces does not check ALL routing tables which might lead to false negatives # Update if change is flagged
# (ref: http://linux-ip.net/html/routing-tables.html) so additionally... look for if __information_changed:
# any changes in the netifaces interfaces information which might also be an inticator __information_changed = False
# 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() self.update()
# Throttle the calls to netifaces # Throttle the calls to netifaces
time.sleep(1) time.sleep(1)
@ -104,11 +95,11 @@ class Module(core.module.Module):
if widget.get("public_ip") is None: if widget.get("public_ip") is None:
return "n/a" return "n/a"
return self._format.format( return self._format.format(
ip=widget.get("public_ip", "-"), ip = widget.get("public_ip", "-"),
country_name=widget.get("country_name", "-"), country_name = widget.get("country_name", "-"),
country_code=widget.get("country_code", "-"), country_code = widget.get("country_code", "-"),
city_name=widget.get("city_name", "-"), city_name = widget.get("city_name", "-"),
coordinates=widget.get("coordinates", "-"), coordinates = widget.get("coordinates", "-"),
) )
def __click_update(self, event): def __click_update(self, event):
@ -116,31 +107,30 @@ class Module(core.module.Module):
def update(self): def update(self):
widget = self.widget() widget = self.widget()
__lat = None
__lon = None
try: try:
util.location.reset() util.location.reset()
time.sleep(5) # wait for reset to complete before querying results
# Fetch fresh location information # Fetch fresh location information
__info = util.location.location_info() __info = util.location.location_info()
__raw_lat = __info["latitude"]
__raw_lon = __info["longitude"]
# Contstruct coordinates string if util.location has provided required info # Contstruct coordinates string if util.location has provided required info
if __lat and __lon: if isinstance(__raw_lat, float) and isinstance(__raw_lon, float):
__lat = "{:.2f}".format(__info["latitude"]) __lat = float("{:.2f}".format(__raw_lat))
__lon = "{:.2f}".format(__info["longitude"]) __lon = float("{:.2f}".format(__raw_lon))
if __lat < 0: if __lat < 0:
__coords = __lat + "°S" __coords = str(__lat) + "°S"
else: else:
__coords = __lat + "°N" __coords = str(__lat) + "°N"
__coords += "," __coords += ","
if __lon < 0: if __lon < 0:
__coords += __lon + "°W" __coords += str(__lon) + "°W"
else: else:
__coords += __lon + "°E" __coords += str(__lon) + "°E"
else: else:
__lat = "Unknown"
__lon = "Unknown"
__coords = "Unknown" __coords = "Unknown"
# Set widget values # Set widget values

View file

@ -18,17 +18,6 @@ __document = None
__data = {} __data = {}
__next = 0 __next = 0
__sources = [ __sources = [
{
"url": "http://ipapi.co/json",
"mapping": {
"latitude": "latitude",
"longitude": "longitude",
"country_name": "country_name",
"country_code": "country_code",
"city": "city_name",
"ip": "public_ip",
},
},
{ {
"url": "http://free.ipwhois.io/json/", "url": "http://free.ipwhois.io/json/",
"mapping": { "mapping": {
@ -51,6 +40,17 @@ __sources = [
"query": "public_ip", "query": "public_ip",
}, },
}, },
{
"url": "http://ipapi.co/json",
"mapping": {
"latitude": "latitude",
"longitude": "longitude",
"country_name": "country_name",
"country_code": "country_code",
"city": "city_name",
"ip": "public_ip",
},
}
] ]