summaryrefslogtreecommitdiffstats
path: root/glances/core/glances_client.py
diff options
context:
space:
mode:
Diffstat (limited to 'glances/core/glances_client.py')
-rw-r--r--glances/core/glances_client.py84
1 files changed, 52 insertions, 32 deletions
diff --git a/glances/core/glances_client.py b/glances/core/glances_client.py
index 27fdeeae..faf70ae1 100644
--- a/glances/core/glances_client.py
+++ b/glances/core/glances_client.py
@@ -24,18 +24,28 @@ import json
import socket
import sys
try:
- from xmlrpc.client import ServerProxy, ProtocolError, Fault
+ from xmlrpc.client import Transport, ServerProxy, ProtocolError, Fault
except ImportError: # Python 2
- from xmlrpclib import ServerProxy, ProtocolError, Fault
+ from xmlrpclib import Transport, ServerProxy, ProtocolError, Fault
+import httplib
# Import Glances libs
-from glances.core.glances_globals import version
+from glances.core.glances_globals import version, logger
from glances.core.glances_stats import GlancesStatsClient
from glances.outputs.glances_curses import GlancesCurses
-class GlancesClient(object):
+class GlancesClientTransport(Transport):
+ """This class overwrite the default XML-RPC transport and manage timeout"""
+
+ def set_timeout(self, timeout):
+ self.timeout = timeout
+
+ def make_connection(self, host):
+ return httplib.HTTPConnection(host, timeout=self.timeout)
+
+class GlancesClient(object):
"""This class creates and manages the TCP client."""
def __init__(self, config=None, args=None):
@@ -54,10 +64,13 @@ class GlancesClient(object):
uri = 'http://{0}:{1}'.format(args.client, args.port)
# Try to connect to the URI
+ transport = GlancesClientTransport()
+ # Configure the server timeout to 7 seconds
+ transport.set_timeout(7)
try:
- self.client = ServerProxy(uri)
+ self.client = ServerProxy(uri, transport = transport)
except Exception as e:
- print(_("Error: Couldn't create socket {0}: {1}").format(uri, e))
+ logger.error(_("Couldn't create socket {0}: {1}").format(uri, e))
sys.exit(2)
def set_mode(self, mode='glances'):
@@ -81,39 +94,47 @@ class GlancesClient(object):
"""Logon to the server."""
ret = True
- # First of all, trying to connect to a Glances server
- try:
- client_version = self.client.init()
+ if not self.args.snmp_force:
+ # First of all, trying to connect to a Glances server
self.set_mode('glances')
- except socket.error as err:
- # print(_("Error: Connection to {0} server failed").format(self.get_mode()))
- # Fallback to SNMP
- self.set_mode('snmp')
- except ProtocolError as err:
- # Others errors
- if str(err).find(" 401 ") > 0:
- print(_("Error: Connection to server failed: Bad password"))
+ client_version = None
+ try:
+ client_version = self.client.init()
+ except socket.error as err:
+ # Fallback to SNMP
+ logger.error(_("Connection to Glances server failed"))
+ self.set_mode('snmp')
+ fallbackmsg = _("Trying fallback to SNMP...")
+ print(fallbackmsg)
+ except ProtocolError as err:
+ # Others errors
+ if str(err).find(" 401 ") > 0:
+ logger.error(_("Connection to server failed (Bad password)"))
+ else:
+ logger.error(_("Connection to server failed ({0})").format(err))
+ sys.exit(2)
+
+ if self.get_mode() == 'glances' and version[:3] == client_version[:3]:
+ # Init stats
+ self.stats = GlancesStatsClient()
+ self.stats.set_plugins(json.loads(self.client.getAllPlugins()))
else:
- print(_("Error: Connection to server failed: {0}").format(err))
- sys.exit(2)
+ logger.error("Client version: %s / Server version: %s" % (version, client_version))
- if self.get_mode() == 'glances' and version[:3] == client_version[:3]:
- # Init stats
- self.stats = GlancesStatsClient()
- self.stats.set_plugins(json.loads(self.client.getAllPlugins()))
- elif self.get_mode() == 'snmp':
- print (_("Info: Connection to Glances server failed. Trying fallback to SNMP..."))
- # Then fallback to SNMP if needed
+ else:
+ self.set_mode('snmp')
+
+ if self.get_mode() == 'snmp':
+ logger.info(_("Trying to grab stats by SNMP..."))
+ # Fallback to SNMP if needed
from glances.core.glances_stats import GlancesStatsClientSNMP
# Init stats
self.stats = GlancesStatsClientSNMP(args=self.args)
if not self.stats.check_snmp():
- print(_("Error: Connection to SNMP server failed"))
+ logger.error(_("Connection to SNMP server failed"))
sys.exit(2)
- else:
- ret = False
if ret:
# Load limits from the configuration file
@@ -133,7 +154,8 @@ class GlancesClient(object):
elif self.get_mode() == 'snmp':
return self.update_snmp()
else:
- print(_("Error: Unknown server mode: {0}").format(self.get_mode()))
+ self.end()
+ logger.critical(_("Unknown server mode: {0}").format(self.get_mode()))
sys.exit(2)
def update_glances(self):
@@ -183,8 +205,6 @@ class GlancesClient(object):
# Update the screen
self.screen.update(self.stats, cs_status=cs_status)
- # print self.stats
- # print self.stats.getAll()
def end(self):
"""End of the client session."""