diff options
author | nicolargo <nicolas@nicolargo.com> | 2017-03-15 21:06:52 +0100 |
---|---|---|
committer | nicolargo <nicolas@nicolargo.com> | 2017-03-15 21:06:52 +0100 |
commit | 731a72e708a2d5d0d9db7ee1f579e39032bbc151 (patch) | |
tree | 51c5661d88562f90c88d5d66c360145e57c71acd | |
parent | 75f7515487df1f13c21f2ae6701f367c38e7e915 (diff) |
Refactor __init__ and main scripts #1050 - Need to find a way to kill server when CTRL-C
-rw-r--r-- | glances/__init__.py | 151 | ||||
-rw-r--r-- | glances/client.py | 7 | ||||
-rw-r--r-- | glances/compat.py | 4 | ||||
-rw-r--r-- | glances/main.py | 34 | ||||
-rw-r--r-- | glances/server.py | 35 |
5 files changed, 78 insertions, 153 deletions
diff --git a/glances/__init__.py b/glances/__init__.py index 9b4cb49f..9e3486af 100644 --- a/glances/__init__.py +++ b/glances/__init__.py @@ -70,130 +70,40 @@ def __signal_handler(signal, frame): def end(): """Stop Glances.""" - if core.is_standalone() and not WINDOWS: - # Stop the standalone (CLI) - standalone.end() - logger.info("Stop Glances (with CTRL-C)") - elif core.is_client() and not WINDOWS: - # Stop the client - client.end() - logger.info("Stop Glances client (with CTRL-C)") - elif core.is_server(): - # Stop the server - server.end() - logger.info("Stop Glances server (with CTRL-C)") - elif core.is_webserver(): - # Stop the Web server - webserver.end() - logger.info("Stop Glances web server(with CTRL-C)") + mode.end() + logger.info("Glances stopped with CTRL-C") # The end... sys.exit(0) -def start_standalone(config, args): - """Start the standalone mode""" - logger.info("Start standalone mode") - - # Share global var - global standalone - - # Import the Glances standalone module - from glances.standalone import GlancesStandalone - - # Init the standalone mode - standalone = GlancesStandalone(config=config, args=args) - - # Start the standalone (CLI) loop - standalone.serve_forever() - - -def start_clientbrowser(config, args): - """Start the browser client mode""" - logger.info("Start client mode (browser)") - - # Share global var - global client - - # Import the Glances client browser module - from glances.client_browser import GlancesClientBrowser - - # Init the client - client = GlancesClientBrowser(config=config, args=args) - - # Start the client loop - client.serve_forever() - - # Shutdown the client - client.end() - - -def start_client(config, args): - """Start the client mode""" - logger.info("Start client mode") - - # Share global var - global client - - # Import the Glances client browser module - from glances.client import GlancesClient - - # Init the client - client = GlancesClient(config=config, args=args) - - # Test if client and server are in the same major version - if not client.login(): - logger.critical("The server version is not compatible with the client") - sys.exit(2) - - # Start the client loop - client.serve_forever() +def start(config, args): + """Start Glances""" - # Shutdown the client - client.end() + # Load mode + global mode + if core.is_standalone() and not WINDOWS: + from glances.standalone import GlancesStandalone as GlancesMode + elif core.is_client() and not WINDOWS: + if core.is_client_browser(): + from glances.client_browser import GlancesClientBrowser as GlancesMode + else: + from glances.client import GlancesClient as GlancesMode + elif core.is_server(): + from glances.server import GlancesServer as GlancesMode + elif core.is_webserver(): + from glances.webserver import GlancesWebServer as GlancesMode -def start_server(config, args): - """Start the server mode""" - logger.info("Start server mode") - - # Share global var - global server - - # Import the Glances server module - from glances.server import GlancesServer - - server = GlancesServer(cached_time=args.cached_time, - config=config, - args=args) - print('Glances server is running on {}:{}'.format(args.bind_address, args.port)) - - # Set the server login/password (if -P/--password tag) - if args.password != "": - server.add_user(args.username, args.password) - - # Start the server loop - server.serve_forever() - - # Shutdown the server? - server.server_close() - - -def start_webserver(config, args): - """Start the Web server mode""" - logger.info("Start web server mode") - - # Share global var - global webserver - - # Import the Glances web server module - from glances.webserver import GlancesWebServer + # Init the mode + logger.info("Start {} mode".format(GlancesMode.__name__)) + mode = GlancesMode(config=config, args=args) - # Init the web server mode - webserver = GlancesWebServer(config=config, args=args) + # Start the main loop + mode.serve_forever() - # Start the web server loop - webserver.serve_forever() + # Shutdown + mode.end() def main(): @@ -221,15 +131,4 @@ def main(): signal.signal(signal.SIGINT, __signal_handler) # Glances can be ran in standalone, client or server mode - if core.is_standalone() and not WINDOWS: - start_standalone(config=config, args=args) - elif core.is_client() and not WINDOWS: - if core.is_client_browser(): - start_clientbrowser(config=config, args=args) - else: - start_client(config=config, args=args) - elif core.is_server(): - start_server(config=config, args=args) - elif core.is_webserver(): - # Web server mode replace the standalone mode on Windows OS - start_webserver(config=config, args=args) + start(config=config, args=args) diff --git a/glances/client.py b/glances/client.py index 02f3c572..f58f55e3 100644 --- a/glances/client.py +++ b/glances/client.py @@ -223,6 +223,13 @@ class GlancesClient(object): def serve_forever(self): """Main client loop.""" + + # Test if client and server are in the same major version + if not self.login(): + logger.critical("The server version is not compatible with the client") + self.end() + return self.client_mode + exitkey = False try: while True and not exitkey: diff --git a/glances/compat.py b/glances/compat.py index 996e6986..bfec1433 100644 --- a/glances/compat.py +++ b/glances/compat.py @@ -31,7 +31,7 @@ PY3 = sys.version_info[0] == 3 if PY3: import queue from configparser import ConfigParser, NoOptionError, NoSectionError - from xmlrpc.client import Fault, ProtocolError, ServerProxy, Transport + from xmlrpc.client import Fault, ProtocolError, ServerProxy, Transport, Server from xmlrpc.server import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer from urllib.request import urlopen from urllib.error import HTTPError, URLError @@ -88,7 +88,7 @@ else: from itertools import imap as map from ConfigParser import SafeConfigParser as ConfigParser, NoOptionError, NoSectionError from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer - from xmlrpclib import Fault, ProtocolError, ServerProxy, Transport + from xmlrpclib import Fault, ProtocolError, ServerProxy, Transport, Server from urllib2 import urlopen, HTTPError, URLError input = raw_input diff --git a/glances/main.py b/glances/main.py index d2bf30c9..c08c7fd2 100644 --- a/glances/main.py +++ b/glances/main.py @@ -406,21 +406,6 @@ Examples of use: return args - def __get_username(self, description=''): - """Read a username from the command line. - """ - return input(description) - - def __get_password(self, description='', confirm=False, clear=False, username='glances'): - """Read a password from the command line. - - - if confirm = True, with confirmation - - if clear = True, plain (clear password) - """ - from glances.password import GlancesPassword - password = GlancesPassword(username=username) - return password.get_password(description, confirm, clear) - def is_standalone(self): """Return True if Glances is running in standalone mode.""" return (not self.args.client and @@ -451,3 +436,22 @@ Examples of use: def get_args(self): """Return the arguments.""" return self.args + + def get_mode(self): + """Return the mode.""" + return self.mode + + def __get_username(self, description=''): + """Read an username from the command line. + """ + return input(description) + + def __get_password(self, description='', confirm=False, clear=False, username='glances'): + """Read a password from the command line. + + - if confirm = True, with confirmation + - if clear = True, plain (clear password) + """ + from glances.password import GlancesPassword + password = GlancesPassword(username=username) + return password.get_password(description, confirm, clear) diff --git a/glances/server.py b/glances/server.py index f395bd22..3970c161 100644 --- a/glances/server.py +++ b/glances/server.py @@ -25,7 +25,7 @@ import sys from base64 import b64decode from glances import __version__ -from glances.compat import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer +from glances.compat import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer, Server from glances.autodiscover import GlancesAutoDiscoverClient from glances.logger import logger from glances.stats_server import GlancesStatsServer @@ -100,9 +100,13 @@ class GlancesXMLRPCServer(SimpleXMLRPCServer, object): """Init a SimpleXMLRPCServer instance (IPv6-ready).""" + finished = False + def __init__(self, bind_address, bind_port=61209, requestHandler=GlancesXMLRPCHandler): + self.bind_address = bind_address + self.bind_port = bind_port try: self.address_family = socket.getaddrinfo(bind_address, bind_port)[0][0] except socket.error as e: @@ -111,13 +115,23 @@ class GlancesXMLRPCServer(SimpleXMLRPCServer, object): super(GlancesXMLRPCServer, self).__init__((bind_address, bind_port), requestHandler) + def end(self): + """Stop the server""" + self.server_close() + self.finished = True + + def serve_forever(self): + """Main loop""" + while not self.finished: + self.handle_request() + logger.info(self.finished) + class GlancesInstance(object): """All the methods of this class are published as XML-RPC methods.""" def __init__(self, - cached_time=1, config=None, args=None): # Init stats @@ -130,7 +144,7 @@ class GlancesInstance(object): # i.e. XML/RPC calls will not retrieve updated info until the time # since last update is passed (will retrieve old cached info instead) self.timer = Timer(0) - self.cached_time = cached_time + self.cached_time = args.cached_time def __update__(self): # Never update more than 1 time per cached_time @@ -186,7 +200,6 @@ class GlancesServer(object): def __init__(self, requestHandler=GlancesXMLRPCHandler, - cached_time=1, config=None, args=None): # Args @@ -198,6 +211,8 @@ class GlancesServer(object): except Exception as e: logger.critical("Cannot start Glances server: {}".format(e)) sys.exit(2) + else: + print('Glances XML-RPC server is running on {}:{}'.format(args.bind_address, args.port)) # The users dict # username / password couple @@ -207,7 +222,7 @@ class GlancesServer(object): # Register functions self.server.register_introspection_functions() - self.server.register_instance(GlancesInstance(cached_time, config, args)) + self.server.register_instance(GlancesInstance(config, args)) if not self.args.disable_autodiscover: # Note: The Zeroconf service name will be based on the hostname @@ -223,14 +238,14 @@ class GlancesServer(object): def serve_forever(self): """Call the main loop.""" + # Set the server login/password (if -P/--password tag) + if self.args.password != "": + self.add_user(self.args.username, self.args.password) + # Serve forever self.server.serve_forever() - def server_close(self): - """Close the Glances server session.""" - self.server.server_close() - def end(self): """End of the Glances server session.""" if not self.args.disable_autodiscover: self.autodiscover_client.close() - self.server_close() + self.server.end() |