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()
def monitor(self):
default_route = None
interfaces = None
__previous_ips = set()
__current_ips = set()
# Initially set to True to force an info update on first pass
information_changed = True
__information_changed = True
self.update()
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:
current_default_route = netifaces.gateways()["default"][2]
except:
# 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
for interface in netifaces.interfaces():
__current_ips.add(netifaces.ifaddresses(interface)[2][0]['addr'])
# 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
# If not ip address information found clear __current_ips
__current_ips.clear()
# Update either routing or interface information has changed
if information_changed:
information_changed = False
# If a change of any interfaces' IP then flag change
if __current_ips.symmetric_difference(__previous_ips):
__previous_ips = __current_ips.copy()
__information_changed = True
# Update if change is flagged
if __information_changed:
__information_changed = False
self.update()
# Throttle the calls to netifaces
@ -104,11 +95,11 @@ class Module(core.module.Module):
if widget.get("public_ip") is None:
return "n/a"
return self._format.format(
ip=widget.get("public_ip", "-"),
country_name=widget.get("country_name", "-"),
country_code=widget.get("country_code", "-"),
city_name=widget.get("city_name", "-"),
coordinates=widget.get("coordinates", "-"),
ip = widget.get("public_ip", "-"),
country_name = widget.get("country_name", "-"),
country_code = widget.get("country_code", "-"),
city_name = widget.get("city_name", "-"),
coordinates = widget.get("coordinates", "-"),
)
def __click_update(self, event):
@ -116,31 +107,30 @@ class Module(core.module.Module):
def update(self):
widget = self.widget()
__lat = None
__lon = None
try:
util.location.reset()
time.sleep(5) # wait for reset to complete before querying results
# Fetch fresh location information
__info = util.location.location_info()
__raw_lat = __info["latitude"]
__raw_lon = __info["longitude"]
# Contstruct coordinates string if util.location has provided required info
if __lat and __lon:
__lat = "{:.2f}".format(__info["latitude"])
__lon = "{:.2f}".format(__info["longitude"])
if isinstance(__raw_lat, float) and isinstance(__raw_lon, float):
__lat = float("{:.2f}".format(__raw_lat))
__lon = float("{:.2f}".format(__raw_lon))
if __lat < 0:
__coords = __lat + "°S"
__coords = str(__lat) + "°S"
else:
__coords = __lat + "°N"
__coords = str(__lat) + "°N"
__coords += ","
if __lon < 0:
__coords += __lon + "°W"
__coords += str(__lon) + "°W"
else:
__coords += __lon + "°E"
__coords += str(__lon) + "°E"
else:
__lat = "Unknown"
__lon = "Unknown"
__coords = "Unknown"
# Set widget values

View file

@ -18,17 +18,6 @@ __document = None
__data = {}
__next = 0
__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/",
"mapping": {
@ -51,6 +40,17 @@ __sources = [
"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",
},
}
]