diff options
author | nicolargo <nicolas@nicolargo.com> | 2021-04-19 09:24:27 +0200 |
---|---|---|
committer | nicolargo <nicolas@nicolargo.com> | 2021-04-19 09:24:27 +0200 |
commit | a0f24a3b45fe7afcb56a3c31becfadebfaba16ea (patch) | |
tree | 7872e5e307debdd8f6bf9d419a11f3e716ca2ebf | |
parent | b8dade991cd30b954f1e3b71720a45a538c53762 (diff) | |
parent | 49029112c22bf3c11406e1730eab258e0c7ebb59 (diff) |
Merge branch 'issue1847' into develop
-rw-r--r-- | glances/__init__.py | 7 | ||||
-rw-r--r-- | glances/main.py | 2 | ||||
-rw-r--r-- | glances/outputs/glances_stdout_issue.py | 123 | ||||
-rw-r--r-- | glances/standalone.py | 17 |
4 files changed, 146 insertions, 3 deletions
diff --git a/glances/__init__.py b/glances/__init__.py index c48b434e..8b640606 100644 --- a/glances/__init__.py +++ b/glances/__init__.py @@ -111,7 +111,12 @@ def start(config, args): # Start the main loop logger.debug("Glances started in {} seconds".format(start_duration.get())) - mode.serve_forever() + if args.stdout_issue: + # Serve once for issue/test mode + mode.serve_issue() + else: + # Serve forever + mode.serve_forever() # Shutdown mode.end() diff --git a/glances/main.py b/glances/main.py index 9df41276..6a86e64f 100644 --- a/glances/main.py +++ b/glances/main.py @@ -234,6 +234,8 @@ Examples of use: dest='stdout', help='display stats to stdout, one stat per line (comma separated list of plugins/plugins.attribute)') parser.add_argument('--stdout-csv', default=None, dest='stdout_csv', help='display stats to stdout, csv format (comma separated list of plugins/plugins.attribute)') + parser.add_argument('--issue', default=None, action='store_true', + dest='stdout_issue', help='test all plugins and exit (please copy/paste the output if you open an issue)') if not WINDOWS: parser.add_argument('--hide-kernel-threads', action='store_true', default=False, dest='no_kernel_threads', help='hide kernel threads in process list (not available on Windows)') diff --git a/glances/outputs/glances_stdout_issue.py b/glances/outputs/glances_stdout_issue.py new file mode 100644 index 00000000..ffdf7c3c --- /dev/null +++ b/glances/outputs/glances_stdout_issue.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Glances. +# +# Copyright (C) 2021 Nicolargo <nicolas@nicolargo.com> +# +# Glances is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Glances is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +"""Issue interface class.""" + +import time +import sys +import shutil + +from glances.logger import logger +from glances.compat import printandflush +from glances.timer import Counter +from glances import __version__, psutil_version + +try: + TERMINAL_WIDTH = shutil.get_terminal_size(fallback=(79, 24)).columns +except: + TERMINAL_WIDTH = 79 + + +class colors: + RED = '\033[91m' + GREEN = '\033[92m' + ORANGE = '\033[93m' + BLUE = '\033[94m' + NO = '\033[0m' + + def disable(self): + self.RED = '' + self.GREEN = '' + self.BLUE = '' + self.ORANGE = '' + self.NO = '' + + +class GlancesStdoutIssue(object): + + """ + This class manages the Issue display. + """ + + def __init__(self, config=None, args=None): + # Init + self.config = config + self.args = args + + def end(self): + pass + + def print_version(self): + msg = 'Glances version {} with PsUtil {}'.format( + colors.BLUE + __version__ + colors.NO, + colors.BLUE + psutil_version + colors.NO) + sys.stdout.write('='*len(msg) + '\n') + sys.stdout.write(msg) + sys.stdout.write(colors.NO + '\n') + sys.stdout.write('='*len(msg) + '\n') + sys.stdout.flush() + + def print_issue(self, plugin, result, message): + sys.stdout.write('{}{}{}'.format( + colors.BLUE + plugin, result, message)) + sys.stdout.write(colors.NO + '\n') + sys.stdout.flush() + + def update(self, + stats, + duration=3): + """Display issue + """ + self.print_version() + for plugin in sorted(stats._plugins): + if stats._plugins[plugin].is_disable(): + # If current plugin is disable + # then continue to next plugin + result = colors.ORANGE + '[N/A]'.rjust(19 - len(plugin)) + message = colors.NO + self.print_issue(plugin, result, message) + continue + # Start the counter + counter = Counter() + counter.reset() + stat = None + stat_error = None + try: + # Update the stats + stats._plugins[plugin].update() + # Get the stats + stat = stats.get_plugin(plugin).get_export() + except Exception as e: + stat_error = e + if stat_error is None: + result = (colors.GREEN + + '[OK] ' + + colors.BLUE + + ' {:.4f}s '.format(counter.get())).rjust(40 - len(plugin)) + message = colors.NO + str(stat)[0:TERMINAL_WIDTH-40] + else: + result = (colors.RED + + '[ERROR]' + + colors.BLUE + + ' {:.4f}s '.format(counter.get())).rjust(40 - len(plugin)) + message = colors.NO + str(stat_error)[0:TERMINAL_WIDTH-40] + self.print_issue(plugin, result, message) + + # Return True to exit directly (no refresh) + return True diff --git a/glances/standalone.py b/glances/standalone.py index d94af6fc..1ab1facb 100644 --- a/glances/standalone.py +++ b/glances/standalone.py @@ -29,6 +29,7 @@ from glances.stats import GlancesStats from glances.outputs.glances_curses import GlancesCursesStandalone from glances.outputs.glances_stdout import GlancesStdout from glances.outputs.glances_stdout_csv import GlancesStdoutCsv +from glances.outputs.glances_stdout_issue import GlancesStdoutIssue from glances.outdated import Outdated from glances.timer import Counter @@ -82,6 +83,10 @@ class GlancesStandalone(object): logger.info("Quiet mode is ON, nothing will be displayed") # In quiet mode, nothing is displayed glances_processes.max_processes = 0 + elif args.stdout_issue: + logger.info("Issue mode is ON") + # Init screen + self.screen = GlancesStdoutIssue(config=config, args=args) elif args.stdout: logger.info("Stdout mode is ON, following stats will be displayed: {}".format(args.stdout)) # Init screen @@ -111,7 +116,15 @@ class GlancesStandalone(object): print("Exporters list: {}".format( ', '.join(sorted(self.stats.getExportsList(enable=False))))) - def __serve_forever(self): + def serve_issue(self): + """Special mode for the --issue option + Update is done in the sceen.update function + """ + ret = not self.screen.update(self.stats) + self.end() + return ret + + def __serve_once(self): """Main loop for the CLI. return True if we should continue (no exit key has been pressed) @@ -151,7 +164,7 @@ class GlancesStandalone(object): """Wrapper to the serve_forever function.""" loop = True while loop: - loop = self.__serve_forever() + loop = self.__serve_once() self.end() def end(self): |