# -*- coding: utf-8 -*-
|
|
#
|
|
# This file is part of Glances.
|
|
#
|
|
# Copyright (C) 2018 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/>.
|
|
|
|
"""Manage the Glances standalone session."""
|
|
|
|
import sys
|
|
import time
|
|
|
|
from glances.globals import WINDOWS
|
|
from glances.logger import logger
|
|
from glances.processes import glances_processes
|
|
from glances.stats import GlancesStats
|
|
from glances.outputs.glances_curses import GlancesCursesStandalone
|
|
from glances.outputs.glances_stdout import GlancesStdout
|
|
from glances.outdated import Outdated
|
|
from glances.timer import Counter
|
|
|
|
|
|
class GlancesStandalone(object):
|
|
|
|
"""This class creates and manages the Glances standalone session."""
|
|
|
|
def __init__(self, config=None, args=None):
|
|
self.config = config
|
|
self.args = args
|
|
|
|
# Quiet mode
|
|
self._quiet = args.quiet
|
|
self.refresh_time = args.time
|
|
|
|
# Init stats
|
|
self.stats = GlancesStats(config=config, args=args)
|
|
|
|
# Modules (plugins and exporters) are loaded at this point
|
|
# Glances can display the list if asked...
|
|
if args.modules_list:
|
|
self.display_modules_list()
|
|
sys.exit(0)
|
|
|
|
# If process extended stats is disabled by user
|
|
if not args.enable_process_extended:
|
|
logger.debug("Extended stats for top process are disabled")
|
|
glances_processes.disable_extended()
|
|
else:
|
|
logger.debug("Extended stats for top process are enabled")
|
|
glances_processes.enable_extended()
|
|
|
|
# Manage optionnal process filter
|
|
if args.process_filter is not None:
|
|
glances_processes.process_filter = args.process_filter
|
|
|
|
if (not WINDOWS) and args.no_kernel_threads:
|
|
# Ignore kernel threads in process list
|
|
glances_processes.disable_kernel_threads()
|
|
|
|
# Initial system informations update
|
|
self.stats.update()
|
|
|
|
if self.quiet:
|
|
logger.info("Quiet mode is ON, nothing will be displayed")
|
|
# In quiet mode, nothing is displayed
|
|
glances_processes.max_processes = 0
|
|
elif args.stdout:
|
|
logger.info("Stdout mode is ON, following stats will be displayed: {}".format(args.stdout))
|
|
# Init screen
|
|
self.screen = GlancesStdout(config=config, args=args)
|
|
else:
|
|
# Default number of processes to displayed is set to 50
|
|
glances_processes.max_processes = 50
|
|
|
|
# Init screen
|
|
self.screen = GlancesCursesStandalone(config=config, args=args)
|
|
|
|
# Check the latest Glances version
|
|
self.outdated = Outdated(config=config, args=args)
|
|
|
|
@property
|
|
def quiet(self):
|
|
return self._quiet
|
|
|
|
def display_modules_list(self):
|
|
"""Display modules list"""
|
|
print("Plugins list: {}".format(
|
|
', '.join(sorted(self.stats.getPluginsList(enable=False)))))
|
|
print("Exporters list: {}".format(
|
|
', '.join(sorted(self.stats.getExportsList(enable=False)))))
|
|
|
|
def __serve_forever(self):
|
|
"""Main loop for the CLI.
|
|
|
|
return True if we should continue (no exit key has been pressed)
|
|
"""
|
|
# Start a counter used to compute the time needed for
|
|
# update and export the stats
|
|
counter = Counter()
|
|
|
|
# Update stats
|
|
self.stats.update()
|
|
logger.debug('Stats updated in {} seconds'.format(counter.get()))
|
|
|
|
# Export stats
|
|
counter_export = Counter()
|
|
self.stats.export(self.stats)
|
|
logger.debug('Stats exported in {} seconds'.format(counter_export.get()))
|
|
|
|
# Patch for issue1326 to avoid < 0 refresh
|
|
adapted_refresh = self.refresh_time - counter.get()
|
|
adapted_refresh = adapted_refresh if adapted_refresh > 0 else 0
|
|
|
|
# Display stats
|
|
# and wait refresh_time - counter
|
|
if not self.quiet:
|
|
# The update function return True if an exit key 'q' or 'ESC'
|
|
# has been pressed.
|
|
ret = not self.screen.update(self.stats, duration=adapted_refresh)
|
|
else:
|
|
# Nothing is displayed
|
|
# Break should be done via a signal (CTRL-C)
|
|
time.sleep(adapted_refresh)
|
|
ret = True
|
|
|
|
return ret
|
|
|
|
def serve_forever(self):
|
|
"""Wrapper to the serve_forever function."""
|
|
loop = True
|
|
while loop:
|
|
loop = self.__serve_forever()
|
|
self.end()
|
|
|
|
def end(self):
|
|
"""End of the standalone CLI."""
|
|
if not self.quiet:
|
|
self.screen.end()
|
|
|
|
# Exit from export modules
|
|
self.stats.end()
|
|
|
|
# Check Glances version versus PyPI one
|
|
if self.outdated.is_outdated():
|
|
print("You are using Glances version {}, however version {} is available.".format(
|
|
self.outdated.installed_version(), self.outdated.latest_version()))
|
|
print("You should consider upgrading using: pip install --upgrade glances")
|