summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicolargo <nicolas@nicolargo.com>2021-04-19 09:24:27 +0200
committernicolargo <nicolas@nicolargo.com>2021-04-19 09:24:27 +0200
commita0f24a3b45fe7afcb56a3c31becfadebfaba16ea (patch)
tree7872e5e307debdd8f6bf9d419a11f3e716ca2ebf
parentb8dade991cd30b954f1e3b71720a45a538c53762 (diff)
parent49029112c22bf3c11406e1730eab258e0c7ebb59 (diff)
Merge branch 'issue1847' into develop
-rw-r--r--glances/__init__.py7
-rw-r--r--glances/main.py2
-rw-r--r--glances/outputs/glances_stdout_issue.py123
-rw-r--r--glances/standalone.py17
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):