提交 a0f24a3b 编写于 作者: N nicolargo

Merge branch 'issue1847' into develop

......@@ -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()
......
......@@ -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)')
......
# -*- 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
......@@ -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):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册