From a33d1eee5f1c4b6b2a63fd41eb1386d7700395e4 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 17 Apr 2021 12:14:08 +0200 Subject: First version but should be optimize to display plugin grab time --- glances/main.py | 2 ++ glances/standalone.py | 5 +++++ 2 files changed, 7 insertions(+) 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/standalone.py b/glances/standalone.py index d94af6fc..351bfd95 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 -- cgit v1.2.3 From 6f8bfd3193e7a39c7d0e62e6162fafa0d860f753 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 17 Apr 2021 12:14:16 +0200 Subject: First version but should be optimize to display plugin grab time --- glances/outputs/glances_stdout_issue.py | 89 +++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 glances/outputs/glances_stdout_issue.py diff --git a/glances/outputs/glances_stdout_issue.py b/glances/outputs/glances_stdout_issue.py new file mode 100644 index 00000000..c041207a --- /dev/null +++ b/glances/outputs/glances_stdout_issue.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Glances. +# +# Copyright (C) 2021 Nicolargo +# +# 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 . + +"""Issue interface class.""" + +import time +import sys +import shutil + +from glances.logger import logger +from glances.compat import printandflush + +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_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 + """ + # printandflush(sorted(stats.getPluginsList())) + for plugin in sorted(stats.getPluginsList()): + stat = None + stat_error = None + try: + stat = stats.get_plugin(plugin).get_export() + except Exception as e: + stat_error = e + if stat_error is None: + result = colors.GREEN + '[OK] '.rjust(25 - len(plugin)) + message = colors.NO + str(stat)[0:TERMINAL_WIDTH-25] + else: + result = colors.RED + '[ERROR] '.rjust(25 - len(plugin)) + message = colors.NO + str(stat_error)[0:TERMINAL_WIDTH-25] + self.print_issue(plugin, result, message) + + # Return True to exit directly (no refresh) + return True -- cgit v1.2.3 From 877f31cbad9f6928e81a4737e2df5dc6f72f6d96 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 18 Apr 2021 18:24:15 +0200 Subject: Add update stats time --- glances/__init__.py | 7 ++++++- glances/outputs/glances_stdout_issue.py | 36 ++++++++++++++++++++++++++------- glances/standalone.py | 12 +++++++++-- 3 files changed, 45 insertions(+), 10 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/outputs/glances_stdout_issue.py b/glances/outputs/glances_stdout_issue.py index c041207a..ca0ddc8d 100644 --- a/glances/outputs/glances_stdout_issue.py +++ b/glances/outputs/glances_stdout_issue.py @@ -25,12 +25,14 @@ import shutil from glances.logger import logger from glances.compat import printandflush +from glances.timer import Counter try: TERMINAL_WIDTH = shutil.get_terminal_size(fallback=(79, 24)).columns except: TERMINAL_WIDTH = 79 + class colors: RED = '\033[91m' GREEN = '\033[92m' @@ -45,6 +47,7 @@ class colors: self.ORANGE = '' self.NO = '' + class GlancesStdoutIssue(object): """ @@ -60,7 +63,8 @@ class GlancesStdoutIssue(object): pass def print_issue(self, plugin, result, message): - sys.stdout.write('{}{}{}'.format(colors.BLUE + plugin, result, message)) + sys.stdout.write('{}{}{}'.format( + colors.BLUE + plugin, result, message)) sys.stdout.write(colors.NO + '\n') sys.stdout.flush() @@ -69,20 +73,38 @@ class GlancesStdoutIssue(object): duration=3): """Display issue """ - # printandflush(sorted(stats.getPluginsList())) - for plugin in sorted(stats.getPluginsList()): + for plugin in 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] '.rjust(25 - len(plugin)) - message = colors.NO + str(stat)[0:TERMINAL_WIDTH-25] + 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] '.rjust(25 - len(plugin)) - message = colors.NO + str(stat_error)[0:TERMINAL_WIDTH-25] + 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) diff --git a/glances/standalone.py b/glances/standalone.py index 351bfd95..1ab1facb 100644 --- a/glances/standalone.py +++ b/glances/standalone.py @@ -116,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) @@ -156,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): -- cgit v1.2.3 From 49029112c22bf3c11406e1730eab258e0c7ebb59 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Mon, 19 Apr 2021 09:23:58 +0200 Subject: Add Glances and PsUtil version --- glances/outputs/glances_stdout_issue.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/glances/outputs/glances_stdout_issue.py b/glances/outputs/glances_stdout_issue.py index ca0ddc8d..ffdf7c3c 100644 --- a/glances/outputs/glances_stdout_issue.py +++ b/glances/outputs/glances_stdout_issue.py @@ -26,6 +26,7 @@ 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 @@ -62,6 +63,16 @@ class GlancesStdoutIssue(object): 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)) @@ -73,7 +84,8 @@ class GlancesStdoutIssue(object): duration=3): """Display issue """ - for plugin in stats._plugins: + 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 -- cgit v1.2.3