提交 43027f4a 编写于 作者: N Nicolargo

Upgrade status in the browser list

上级 84e4d77a
......@@ -135,10 +135,11 @@ list_2_countmin=1
# Define the static server list
server_1_name=localhost
server_1_alias=MonXPS
server_1_port=61234
server_1_port=61209
server_2_name=localhost
server_2_port=61235
server_3_name=localhost
server_3_port=61236
server_3_name=192.168.0.17
server_3_alias=VMWin7
server_3_port=61209
server_4_name=pasbon
server_4_port=61237
......@@ -2,11 +2,11 @@
Glances
=======
This manual describes *Glances* version 2.1.2.
This manual describes *Glances* version 2.2.
Copyright © 2012-2014 Nicolas Hennion <nicolas@nicolargo.com>
October 2014
December 2014
.. contents:: Table of Contents
......@@ -67,7 +67,7 @@ and on the client:
where ``@server`` is the IP address or hostname of the server.
Glances can centralize available Glances servers using the ``--browser`` option. The server list can be staticaly defined in the Glances configuration file (section [serverlist]). Glances can also detect and display all Glances servers available on you network (auto discover mode is based on the the Zeroconf protocol):
Glances can centralize available Glances servers using the ``--browser`` option. The server list can be staticaly defined in the Glances configuration file (section [serverlist]). Glances can also detect and display all Glances servers available on you network (auto discover mode is based on the the Zeroconf protocol only available on GNU/Linux and Mac OS X):
.. code-block:: console
......
......@@ -66,6 +66,7 @@ class AutoDiscovered(object):
'username': 'glances', # Default username
'password': '', # Default password
'status': 'UNKNOWN', # Server status: 'UNKNOWN', 'OFFLINE', 'ONLINE', 'PROTECTED'
'type': 'DYNAMIC', # Server type: 'STATIC' or 'DYNAMIC'
}
self._server_list.append(new_server)
logger.debug("Updated servers list (%s servers): %s" %
......
......@@ -235,6 +235,8 @@ class GlancesClient(object):
cs_status=cs_status,
return_to_browser=return_to_browser)
return self.get_mode()
def end(self):
"""End of the client session."""
self.screen.end()
......@@ -76,19 +76,28 @@ class GlancesClientBrowser(object):
while True:
# No need to update the server list
# It's done by the GlancesAutoDiscoverListener class (glances_autodiscover.py)
# Or define staticaly in the configuration file (module glances_staticlist.py)
# For each server in the list, grab elementary stats (CPU, LOAD, MEM, OS...)
# logger.debug(self.get_servers_list())
try:
for v in self.get_servers_list():
# !!! Perhaps, it will be better to store the ServerProxy instance in the get_servers_list
# 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']):
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'])
# Try to connect to the URI
# Try to connect to the server
t = GlancesClientTransport()
t.set_timeout(3)
# Get common stats
try:
s = ServerProxy(uri, transport=t)
......@@ -96,9 +105,8 @@ class GlancesClientBrowser(object):
logger.warning(
"Client browser couldn't create socket {0}: {1}".format(uri, e))
else:
# Mandatory stats
try:
# LOAD
v['load_min5'] = json.loads(s.getLoad())['min5']
# CPU%
cpu_percent = 100 - json.loads(s.getCpu())['idle']
v['cpu_percent'] = '{0:.1f}'.format(cpu_percent)
......@@ -106,8 +114,6 @@ class GlancesClientBrowser(object):
v['mem_percent'] = json.loads(s.getMem())['percent']
# OS (Human Readable name)
v['hr_name'] = json.loads(s.getSystem())['hr_name']
# Status
v['status'] = 'ONLINE'
except (socket.error, Fault, KeyError) as e:
logger.debug(
"Error while grabbing stats form {0}: {1}".format(uri, e))
......@@ -122,6 +128,17 @@ class GlancesClientBrowser(object):
v['status'] = 'OFFLINE'
logger.debug(
"Can not grab stats from {0}: {1}".format(uri, e))
else:
# Status
v['status'] = 'ONLINE'
# Optional stats (load is not available on Windows OS)
try:
# LOAD
v['load_min5'] = json.loads(s.getLoad())['min5']
except Exception as e:
logger.warning(
"Error while grabbing stats form {0}: {1}".format(uri, e))
# List can change size during iteration...
except RuntimeError:
logger.debug(
......@@ -134,6 +151,11 @@ class GlancesClientBrowser(object):
else:
# Display the Glances client for the selected server
logger.debug("Selected server: %s" % self.get_servers_list()[self.screen.get_active()])
# Connection can take time
# Display a popup
self.screen.display_popup(_("Connect to %s:%s" % (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:
from hashlib import sha256
......@@ -141,15 +163,8 @@ class GlancesClientBrowser(object):
clear_password = self.screen.display_popup(_("Password needed for %s: " % v['name']), is_input=True)
# Hash with SHA256
encoded_password = sha256(clear_password).hexdigest()
# 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()),
'password',
encoded_password)
else:
self.static_server.set_server(self.screen.get_active(),
'password',
encoded_password)
# 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" %
......@@ -169,16 +184,39 @@ class GlancesClientBrowser(object):
# Test if client and server are in the same major version
if not client.login(return_to_browser=True):
self.screen.display_popup(_("Sorry, can not connect to %s (see log file for additional information)" % v['name']))
# Set the ONLINE status for the selected server
self.set_in_selected('status', 'OFFLINE')
else:
# Start the client loop
client.serve_forever(return_to_browser=True)
# Return connection type: 'glances' or 'snmp'
connection_type = client.serve_forever(return_to_browser=True)
logger.debug("Disconnect Glances client from the %s server" %
self.get_servers_list()[self.screen.get_active()]['key'])
# Set the ONLINE status for the selected server
if connection_type == 'snmp':
self.set_in_selected('status', 'SNMP')
else:
self.set_in_selected('status', 'ONLINE')
# Return to the browser (no server selected)
self.screen.set_active(None)
def set_in_selected(self, key, value):
"""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)
else:
self.static_server.set_server(self.screen.get_active(),
key,
value)
def end(self):
"""End of the client browser session."""
self.screen.end()
......@@ -67,8 +67,13 @@ class GlancesStaticServer(object):
logger.error("Can not get IP address for server %s (%s)" % (new_server['name'], e))
continue
new_server['key'] = new_server['name'] + ':' + new_server['port']
# Default status is 'UNKNOWN'
new_server['status'] = 'UNKNOWN'
# Server type is 'STATIC'
new_server['type'] = 'STATIC'
# Add the server to the list
logger.debug("Add server %s to the static list" % new_server['name'])
server_list.append(new_server)
......
......@@ -845,6 +845,7 @@ class GlancesCursesBrowser(_GlancesCurses):
_colors_list = {
'UNKNOWN': self.no_color,
'SNMP': self.default_color2,
'ONLINE': self.default_color2,
'OFFLINE': self.ifCRITICAL_color2,
'PROTECTED': self.ifWARNING_color2,
......@@ -886,16 +887,20 @@ class GlancesCursesBrowser(_GlancesCurses):
"""Return the cursor position"""
return self.cursor_position
def cursor_up(self):
def cursor_up(self, servers_list):
"""Set the cursor to position N-1 in the list"""
if self.cursor_position > 0:
self.cursor_position -= 1
else:
self.cursor_position = len(servers_list) - 1
return self.cursor_position
def cursor_down(self, servers_list):
"""Set the cursor to position N-1 in the list"""
if self.cursor_position < len(servers_list) - 1:
self.cursor_position += 1
else:
self.cursor_position = 0
return self.cursor_position
def __catch_key(self, servers_list):
......@@ -915,7 +920,7 @@ class GlancesCursesBrowser(_GlancesCurses):
elif self.pressedkey == 259:
# 'UP' > Up in the server list
logger
self.cursor_up()
self.cursor_up(servers_list)
elif self.pressedkey == 258:
# 'DOWN' > Down in the server list
self.cursor_down(servers_list)
......@@ -1046,8 +1051,11 @@ class GlancesCursesBrowser(_GlancesCurses):
"Can not grab stats {0} from server (KeyError: {1})".format(c[0], e))
server_stat[c[0]] = '?'
# Display alias instead of name
if c[0] == 'alias' and v[c[0]] is not None:
server_stat['name'] = v[c[0]]
try:
if c[0] == 'alias' and v[c[0]] is not None:
server_stat['name'] = v[c[0]]
except KeyError as e:
pass
# Display line for server stats
cpt = 0
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册