Merge pull request #933 from tfwiii/main

publicip module - Fixed bug and minor improvements in output
This commit is contained in:
tobi-wan-kenobi 2022-10-08 06:08:41 +02:00 committed by GitHub
commit 1682a47554
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 48 deletions

View file

@ -60,43 +60,34 @@ 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]
for interface in netifaces.interfaces():
__current_ips.add(netifaces.ifaddresses(interface)[2][0]['addr'])
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
# If not ip address information found clear __current_ips
__current_ips.clear()
# 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
# 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
# Update if change is flagged
if __information_changed:
__information_changed = False
self.update()
# Throttle the calls to netifaces
time.sleep(1)
@ -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):
@ -119,14 +110,28 @@ class Module(core.module.Module):
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
__lat = "{:.2f}".format(__info["latitude"])
__lon = "{:.2f}".format(__info["longitude"])
__coords = __lat + "°N" + "," + " " + __lon + "°E"
# Contstruct coordinates string if util.location has provided required info
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 = str(__lat) + "°S"
else:
__coords = str(__lat) + "°N"
__coords += ","
if __lon < 0:
__coords += str(__lon) + "°W"
else:
__coords += str(__lon) + "°E"
else:
__coords = "Unknown"
# Set widget values
widget.set("public_ip", __info["public_ip"])

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",
},
}
]