summaryrefslogtreecommitdiffstats
path: root/glances/core/glances_client_browser.py
diff options
context:
space:
mode:
Diffstat (limited to 'glances/core/glances_client_browser.py')
-rw-r--r--glances/core/glances_client_browser.py94
1 files changed, 55 insertions, 39 deletions
diff --git a/glances/core/glances_client_browser.py b/glances/core/glances_client_browser.py
index a198399b..804b29de 100644
--- a/glances/core/glances_client_browser.py
+++ b/glances/core/glances_client_browser.py
@@ -38,7 +38,7 @@ from glances.outputs.glances_curses import GlancesCursesBrowser
class GlancesClientBrowser(object):
- """This class creates and manages the TCP client browser (servers' list)."""
+ """This class creates and manages the TCP client browser (servers list)."""
def __init__(self, config=None, args=None):
# Store the arg/config
@@ -58,9 +58,9 @@ class GlancesClientBrowser(object):
self.screen = GlancesCursesBrowser(args=self.args)
def get_servers_list(self):
- """
- Return the current server list (list of dict)
- Merge of static + autodiscover servers list
+ """Return the current server list (list of dict).
+
+ Merge of static + autodiscover servers list.
"""
ret = []
@@ -71,7 +71,16 @@ class GlancesClientBrowser(object):
return ret
- def serve_forever(self):
+ def __get_uri(self, server):
+ """Return the URI for the given server dict."""
+ # Select the connection mode (with or without password)
+ if server['password'] != "":
+ return 'http://{0}:{1}@{2}:{3}'.format(server['username'], server['password'],
+ server['ip'], server['port'])
+ else:
+ return 'http://{0}:{1}'.format(server['ip'], server['port'])
+
+ def __serve_forever(self):
"""Main client loop."""
while True:
# No need to update the server list
@@ -84,15 +93,11 @@ class GlancesClientBrowser(object):
# Do not retreive stats for statics server
# Why ? Because for each offline servers, the timeout will be reached
# So ? The curse interface freezes
- if (v['type'] == 'STATIC' and v['status'] in ['UNKNOWN', 'SNMP', 'OFFLINE']):
+ if v['type'] == 'STATIC' and v['status'] in ['UNKNOWN', 'SNMP', 'OFFLINE']:
continue
- # Select the connection mode (with or without password)
- if v['password'] != "":
- uri = 'http://{0}:{1}@{2}:{3}'.format(v['username'], v['password'],
- v['ip'], v['port'])
- else:
- uri = 'http://{0}:{1}'.format(v['ip'], v['port'])
+ # Get the server URI
+ uri = self.__get_uri(v)
# Try to connect to the server
t = GlancesClientTransport()
@@ -146,46 +151,48 @@ class GlancesClientBrowser(object):
"Server list dictionnary change inside the loop (wait next update)")
# Update the screen (list or Glances client)
- if self.screen.get_active() is None:
+ if self.screen.active_server is None:
# Display the Glances browser
self.screen.update(self.get_servers_list())
else:
# Display the Glances client for the selected server
- logger.debug("Selected server: %s" % self.get_servers_list()[self.screen.get_active()])
+ logger.debug("Selected server: {0}".format(self.get_servers_list()[self.screen.active_server]))
# Connection can take time
# Display a popup
- self.screen.display_popup(_("Connect to %s:%s" % (v['name'], v['port'])), duration=1)
+ self.screen.display_popup(
+ 'Connect to {0}:{1}'.format(v['name'], v['port']), duration=1)
# A password is needed to access to the server's stats
- if self.get_servers_list()[self.screen.get_active()]['password'] is None:
+ if self.get_servers_list()[self.screen.active_server]['password'] is None:
from hashlib import sha256
# Display a popup to enter password
- clear_password = self.screen.display_popup(_("Password needed for %s: " % v['name']), is_input=True)
+ clear_password = self.screen.display_popup(
+ 'Password needed for {0}: '.format(v['name']), is_input=True)
# Hash with SHA256
- encoded_password = sha256(clear_password).hexdigest()
+ encoded_password = sha256(clear_password.encode('utf-8')).hexdigest()
# Store the password for the selected server
self.set_in_selected('password', encoded_password)
# Display the Glance client on the selected server
- logger.info("Connect Glances client to the %s server" %
- self.get_servers_list()[self.screen.get_active()]['key'])
+ logger.info("Connect Glances client to the {0} server".format(
+ self.get_servers_list()[self.screen.active_server]['key']))
# Init the client
args_server = self.args
# Overwrite connection setting
- args_server.client = self.get_servers_list()[self.screen.get_active()]['ip']
- args_server.port = self.get_servers_list()[self.screen.get_active()]['port']
- args_server.username = self.get_servers_list()[self.screen.get_active()]['username']
- args_server.password = self.get_servers_list()[self.screen.get_active()]['password']
- client = GlancesClient(config=self.config,
- args=args_server,
- return_to_browser=True)
+ args_server.client = self.get_servers_list()[self.screen.active_server]['ip']
+ args_server.port = self.get_servers_list()[self.screen.active_server]['port']
+ args_server.username = self.get_servers_list()[self.screen.active_server]['username']
+ args_server.password = self.get_servers_list()[self.screen.active_server]['password']
+ client = GlancesClient(config=self.config, args=args_server, return_to_browser=True)
# Test if client and server are in the same major version
if not client.login():
- self.screen.display_popup(_("Sorry, cannot connect to %s (see log file for additional information)" % v['name']))
+ self.screen.display_popup(
+ "Sorry, cannot connect to '{0}'\n"
+ "See 'glances.log' for more details".format(v['name']))
# Set the ONLINE status for the selected server
self.set_in_selected('status', 'OFFLINE')
@@ -195,8 +202,8 @@ class GlancesClientBrowser(object):
connection_type = client.serve_forever()
try:
- logger.debug("Disconnect Glances client from the %s server" %
- self.get_servers_list()[self.screen.get_active()]['key'])
+ logger.debug("Disconnect Glances client from the {0} server".format(
+ self.get_servers_list()[self.screen.active_server]['key']))
except IndexError:
# Server did not exist anymore
pass
@@ -208,19 +215,28 @@ class GlancesClientBrowser(object):
self.set_in_selected('status', 'ONLINE')
# Return to the browser (no server selected)
- self.screen.set_active(None)
+ self.screen.active_server = None
+
+ def serve_forever(self):
+ """Wrapper to the serve_forever function.
+
+ This function will restore the terminal to a sane state
+ before re-raising the exception and generating a traceback.
+ """
+ try:
+ return self.__serve_forever()
+ finally:
+ self.end()
def set_in_selected(self, key, value):
- """Set the (key, value) for the selected server in the list"""
+ """Set the (key, value) for the selected server in the list."""
# Static list then dynamic one
- if self.screen.get_active() >= len(self.static_server.get_servers_list()):
- self.autodiscover_server.set_server(self.screen.get_active() - len(self.static_server.get_servers_list()),
- key,
- value)
+ if self.screen.active_server >= len(self.static_server.get_servers_list()):
+ self.autodiscover_server.set_server(
+ self.screen.active_server - len(self.static_server.get_servers_list()),
+ key, value)
else:
- self.static_server.set_server(self.screen.get_active(),
- key,
- value)
+ self.static_server.set_server(self.screen.active_server, key, value)
def end(self):
"""End of the client browser session."""