summaryrefslogtreecommitdiffstats
path: root/glances/plugins/ip/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'glances/plugins/ip/__init__.py')
-rw-r--r--glances/plugins/ip/__init__.py143
1 files changed, 31 insertions, 112 deletions
diff --git a/glances/plugins/ip/__init__.py b/glances/plugins/ip/__init__.py
index da644f2c..449f01d4 100644
--- a/glances/plugins/ip/__init__.py
+++ b/glances/plugins/ip/__init__.py
@@ -27,17 +27,6 @@ except ImportError as e:
else:
import_error_tag = False
-# List of online services to retrieve public IP address
-# List of tuple (url, json, key)
-# - url: URL of the Web site
-# - json: service return a JSON (True) or string (False)
-# - key: key of the IP address in the JSON structure
-urls = [
- ('https://httpbin.org/ip', True, 'origin'),
- ('https://api.ipify.org/?format=json', True, 'ip'),
- ('https://ipv4.jsonip.com', True, 'ip'),
-]
-
# Fields description
# description: human readable description
# short_name: shortname to use un UI
@@ -74,7 +63,6 @@ class PluginModel(GlancesPluginModel):
"""
_default_public_refresh_interval = 300
- _default_public_ip_disabled = ["False"]
def __init__(self, args=None, config=None):
"""Init the plugin."""
@@ -86,28 +74,22 @@ class PluginModel(GlancesPluginModel):
# We want to display the stat in the curse interface
self.display_curse = True
- # For public IP address
+ # Public information (see issue #2732)
self.public_address = ""
+ self.public_info = ""
+ self.public_api = self.get_conf_value("public_api", default=[None])[0]
+ self.public_username = self.get_conf_value("public_username", default=[None])[0]
+ self.public_password = self.get_conf_value("public_password", default=[None])[0]
+ self.public_field = self.get_conf_value("public_field", default=[None])
+ self.public_template = self.get_conf_value("public_template", default=[None])[0]
+ self.public_disabled = (
+ self.get_conf_value('public_disabled', default='False')[0].lower() != 'false' or
+ self.public_api is None or self.public_field is None
+ )
self.public_address_refresh_interval = self.get_conf_value(
"public_refresh_interval", default=self._default_public_refresh_interval
)
- public_ip_disabled = self.get_conf_value("public_ip_disabled", default=self._default_public_ip_disabled)
- self.public_ip_disabled = True if public_ip_disabled == ["True"] else False
-
- # For the Censys options (see issue #2105)
- self.public_info = ""
- self.censys_url = self.get_conf_value("censys_url", default=[None])[0]
- self.censys_username = self.get_conf_value("censys_username", default=[None])[0]
- self.censys_password = self.get_conf_value("censys_password", default=[None])[0]
- self.censys_fields = self.get_conf_value("censys_fields", default=[None])
- self.public_info_disabled = (
- self.censys_url is None
- or self.censys_username is None
- or self.censys_password is None
- or self.censys_fields is None
- )
-
@GlancesPluginModel._check_decorator
@GlancesPluginModel._log_result_decorator
def update(self):
@@ -119,47 +101,41 @@ class PluginModel(GlancesPluginModel):
stats = self.get_init_value()
if self.input_method == 'local' and not import_error_tag:
- # Update stats using the netifaces lib
- # Start with the default IP gateway
+ # Private IP address
+ # Get the default gateway thanks to the netifaces lib
try:
default_gw = netifaces.gateways()['default'][netifaces.AF_INET]
except (KeyError, AttributeError) as e:
logger.debug("Cannot grab default gateway IP address ({})".format(e))
- return {}
+ return self.get_init_value()
else:
stats['gateway'] = default_gw[0]
-
- # Then the private IP address
# If multiple IP addresses are available, only the one with the default gateway is returned
try:
address = netifaces.ifaddresses(default_gw[1])[netifaces.AF_INET][0]['addr']
mask = netifaces.ifaddresses(default_gw[1])[netifaces.AF_INET][0]['netmask']
except (KeyError, AttributeError) as e:
logger.debug("Cannot grab private IP address ({})".format(e))
- return {}
+ return self.get_init_value()
else:
stats['address'] = address
stats['mask'] = mask
stats['mask_cidr'] = self.ip_to_cidr(stats['mask'])
- # Finally with the public IP address
+ # Public IP address
time_since_update = getTimeSinceLastUpdate('public-ip')
try:
- if not self.public_ip_disabled and (
- self.stats.get('address') != address or time_since_update > self.public_address_refresh_interval
+ if not self.public_disabled and (
+ self.public_address == "" or time_since_update > self.public_address_refresh_interval
):
- self.public_address = PublicIpAddress().get()
- if not self.public_info_disabled:
- self.public_info = PublicIpInfo(
- self.public_address, self.censys_url, self.censys_username, self.censys_password
- ).get()
+ self.public_info = PublicIpInfo(
+ self.public_api, self.public_username, self.public_password
+ ).get()
+ self.public_address = self.public_info['ip']
except (KeyError, AttributeError) as e:
logger.debug("Cannot grab public IP information ({})".format(e))
else:
stats['public_address'] = self.public_address
- # Too much information provided in the public_info
- # Limit it to public_info_for_human
- # stats['public_info'] = self.public_info
stats['public_info_human'] = self.public_info_for_human(self.public_info)
elif self.input_method == 'snmp':
@@ -217,14 +193,7 @@ class PluginModel(GlancesPluginModel):
if not public_info:
return ''
- field_result = []
- for f in self.censys_fields:
- field = f.split(':')
- if len(field) == 1 and field[0] in public_info:
- field_result.append('{}'.format(public_info[field[0]]))
- elif len(field) == 2 and field[0] in public_info and field[1] in public_info[field[0]]:
- field_result.append('{}'.format(public_info[field[0]][field[1]]))
- return '/'.join(field_result)
+ return self.public_template.format(**public_info)
@staticmethod
def ip_to_cidr(ip):
@@ -240,57 +209,11 @@ class PluginModel(GlancesPluginModel):
return sum(bin(int(x)).count('1') for x in ip.split('.'))
-class PublicIpAddress(object):
- """Get public IP address from online services."""
-
- def __init__(self, timeout=2):
- """Init the class."""
- self.timeout = timeout
-
- def get(self):
- """Get the first public IP address returned by one of the online services."""
- q = queue.Queue()
-
- for u, j, k in urls:
- t = threading.Thread(target=self._get_ip_public, args=(q, u, j, k))
- t.daemon = True
- t.start()
-
- timer = Timer(self.timeout)
- ip = None
- while not timer.finished() and ip is None:
- if q.qsize() > 0:
- ip = q.get()
-
- if ip is None:
- return None
-
- return ', '.join(set([x.strip() for x in ip.split(',')]))
-
- def _get_ip_public(self, queue_target, url, json=False, key=None):
- """Request the url service and put the result in the queue_target."""
- try:
- response = urlopen(url, timeout=self.timeout).read().decode('utf-8')
- except Exception as e:
- logger.debug("IP plugin - Cannot open URL {} ({})".format(url, e))
- queue_target.put(None)
- else:
- # Request depend on service
- try:
- if not json:
- queue_target.put(response)
- else:
- queue_target.put(loads(response)[key])
- except ValueError:
- queue_target.put(None)
-
-
class PublicIpInfo(object):
- """Get public IP information from Censys online service."""
+ """Get public IP information from online service."""
- def __init__(self, ip, url, username, password, timeout=2):
+ def __init__(self, url, username, password, timeout=2):
"""Init the class."""
- self.ip = ip
self.url = url
self.username = username
self.password = password
@@ -300,7 +223,7 @@ class PublicIpInfo(object):
"""Return the public IP information returned by one of the online service."""
q = queue.Queue()
- t = threading.Thread(target=self._get_ip_public_info, args=(q, self.ip, self.url, self.username, self.password))
+ t = threading.Thread(target=self._get_ip_public_info, args=(q, self.url, self.username, self.password))
t.daemon = True
t.start()
@@ -310,22 +233,18 @@ class PublicIpInfo(object):
if q.qsize() > 0:
info = q.get()
- if info is None:
- return None
-
return info
- def _get_ip_public_info(self, queue_target, ip, url, username, password):
+ def _get_ip_public_info(self, queue_target, url, username, password):
"""Request the url service and put the result in the queue_target."""
- request_url = "{}/v2/hosts/{}".format(url, ip)
try:
- response = urlopen_auth(request_url, username, password).read()
+ response = urlopen_auth(url, username, password).read()
except Exception as e:
- logger.debug("IP plugin - Cannot open URL {} ({})".format(request_url, e))
+ logger.debug("IP plugin - Cannot get public IP information from {} ({})".format(url, e))
queue_target.put(None)
else:
try:
- queue_target.put(loads(response)['result'])
+ queue_target.put(loads(response))
except (ValueError, KeyError) as e:
- logger.debug("IP plugin - Cannot get result field from {} ({})".format(request_url, e))
+ logger.debug("IP plugin - Cannot load public IP information from {} ({})".format(url, e))
queue_target.put(None)