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,41 +60,32 @@ 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():
except: __current_ips.add(netifaces.ifaddresses(interface)[2][0]['addr'])
# error reading out default gw -> assume none exists
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: except:
# error reading interfaces information -> assume none exists # If not ip address information found clear __current_ips
current_interfaces = None __current_ips.clear()
if current_interfaces != interfaces:
interfaces = current_interfaces
information_changed = True
# Update either routing or interface information has changed # If a change of any interfaces' IP then flag change
if information_changed: if __current_ips.symmetric_difference(__previous_ips):
information_changed = False __previous_ips = __current_ips.copy()
__information_changed = True
# Update if change is flagged
if __information_changed:
__information_changed = False
self.update() self.update()
# Throttle the calls to netifaces # Throttle the calls to netifaces
@ -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",
},
}
] ]