mirror of https://github.com/nicolargo/glances.git
Improve Lint
This commit is contained in:
parent
4caa267eec
commit
f4873cef08
|
|
@ -34,6 +34,8 @@ jobs:
|
||||||
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
|
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
|
||||||
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics --exclude=.git,./docs,./glances/outputs/static
|
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics --exclude=.git,./docs,./glances/outputs/static
|
||||||
|
|
||||||
|
# - name: Lint with Ruff
|
||||||
|
# uses: chartboost/ruff-action@v1
|
||||||
|
|
||||||
- name: Static type check
|
- name: Static type check
|
||||||
run: |
|
run: |
|
||||||
|
|
|
||||||
3
Makefile
3
Makefile
|
|
@ -61,6 +61,9 @@ format: venv-dev-upgrade ## Format the code
|
||||||
flake8: venv-dev-upgrade ## Run flake8 linter.
|
flake8: venv-dev-upgrade ## Run flake8 linter.
|
||||||
@git ls-files '*.py' | xargs ./venv/bin/python -m flake8 --config=.flake8
|
@git ls-files '*.py' | xargs ./venv/bin/python -m flake8 --config=.flake8
|
||||||
|
|
||||||
|
ruff: venv-dev-upgrade ## Run Ruff (fastest) linter.
|
||||||
|
./venv/bin/python -m ruff check . --config=./pyproject.toml
|
||||||
|
|
||||||
codespell: venv-dev-upgrade ## Run codespell to fix common misspellings in text files
|
codespell: venv-dev-upgrade ## Run codespell to fix common misspellings in text files
|
||||||
./venv/bin/codespell -S .git,./docs/_build,./Glances.egg-info,./venv,./glances/outputs,*.svg -L hart,bu,te,statics
|
./venv/bin/codespell -S .git,./docs/_build,./Glances.egg-info,./venv,./glances/outputs,*.svg -L hart,bu,te,statics
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ requirements-parser
|
||||||
flake8
|
flake8
|
||||||
autopep8
|
autopep8
|
||||||
autoflake
|
autoflake
|
||||||
|
ruff
|
||||||
codespell
|
codespell
|
||||||
memory-profiler
|
memory-profiler
|
||||||
matplotlib
|
matplotlib
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# This file is part of Glances.
|
# This file is part of Glances.
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
# SPDX-FileCopyrightText: 2023 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LGPL-3.0-only
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
#
|
#
|
||||||
|
|
@ -42,7 +42,7 @@ class GlancesAmp(object):
|
||||||
|
|
||||||
# AMP name (= module name without glances_)
|
# AMP name (= module name without glances_)
|
||||||
if name is None:
|
if name is None:
|
||||||
self.amp_name = self.__class__.__module__[len('glances_') :]
|
self.amp_name = self.__class__.__module__[len('glances_'):]
|
||||||
else:
|
else:
|
||||||
self.amp_name = name
|
self.amp_name = name
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -67,14 +67,14 @@ class Amp(GlancesAmp):
|
||||||
# For each line
|
# For each line
|
||||||
for r in res.split('\n'):
|
for r in res.split('\n'):
|
||||||
# Split per space .*
|
# Split per space .*
|
||||||
l = r.split()
|
line = r.split()
|
||||||
if len(l) < 4:
|
if len(line) < 4:
|
||||||
continue
|
continue
|
||||||
if l[1] == '+':
|
if line[1] == '+':
|
||||||
status['running'] += 1
|
status['running'] += 1
|
||||||
elif l[1] == '-':
|
elif line[1] == '-':
|
||||||
status['stopped'] += 1
|
status['stopped'] += 1
|
||||||
elif l[1] == '?':
|
elif line[1] == '?':
|
||||||
status['upstart'] += 1
|
status['upstart'] += 1
|
||||||
# Build the output (string) message
|
# Build the output (string) message
|
||||||
output = 'Services\n'
|
output = 'Services\n'
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,9 @@ class AmpsList(object):
|
||||||
# Display a warning (deprecated) message if the monitor section exist
|
# Display a warning (deprecated) message if the monitor section exist
|
||||||
if "monitor" in self.config.sections():
|
if "monitor" in self.config.sections():
|
||||||
logger.warning(
|
logger.warning(
|
||||||
"A deprecated [monitor] section exists in the Glances configuration file. You should use the new Applications Monitoring Process module instead (http://glances.readthedocs.io/en/develop/aoa/amps.html)."
|
"A deprecated [monitor] section exists in the Glances configuration file. You should use the new \
|
||||||
|
Applications Monitoring Process module instead \
|
||||||
|
(http://glances.readthedocs.io/en/develop/aoa/amps.html)."
|
||||||
)
|
)
|
||||||
|
|
||||||
header = "glances_"
|
header = "glances_"
|
||||||
|
|
@ -140,9 +142,9 @@ class AmpsList(object):
|
||||||
# Search in both cmdline and name (for kernel thread, see #1261)
|
# Search in both cmdline and name (for kernel thread, see #1261)
|
||||||
for p in processlist:
|
for p in processlist:
|
||||||
if (re.search(amp_value.regex(), p['name']) is not None) or (
|
if (re.search(amp_value.regex(), p['name']) is not None) or (
|
||||||
p['cmdline'] is not None
|
p['cmdline'] is not None and
|
||||||
and p['cmdline'] != []
|
p['cmdline'] != [] and
|
||||||
and re.search(amp_value.regex(), ' '.join(p['cmdline'])) is not None
|
re.search(amp_value.regex(), ' '.join(p['cmdline'])) is not None
|
||||||
):
|
):
|
||||||
ret.append(
|
ret.append(
|
||||||
{'pid': p['pid'], 'cpu_percent': p['cpu_percent'], 'memory_percent': p['memory_percent']}
|
{'pid': p['pid'], 'cpu_percent': p['cpu_percent'], 'memory_percent': p['memory_percent']}
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ class CpuPercent(object):
|
||||||
# @TODO: Multisystem...
|
# @TODO: Multisystem...
|
||||||
try:
|
try:
|
||||||
self.cpu_info['cpu_name'] = open('/proc/cpuinfo', 'r').readlines()[4].split(':')[1].strip()
|
self.cpu_info['cpu_name'] = open('/proc/cpuinfo', 'r').readlines()[4].split(':')[1].strip()
|
||||||
except:
|
except (FileNotFoundError, PermissionError, IOError, IndexError, KeyError, AttributeError):
|
||||||
self.cpu_info['cpu_name'] = 'CPU'
|
self.cpu_info['cpu_name'] = 'CPU'
|
||||||
return self.cpu_info['cpu_name']
|
return self.cpu_info['cpu_name']
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,8 @@ class Export(GlancesExport):
|
||||||
# Table
|
# Table
|
||||||
try:
|
try:
|
||||||
session.execute(
|
session.execute(
|
||||||
"CREATE TABLE %s (plugin text, time timeuuid, stat map<text,float>, PRIMARY KEY (plugin, time)) WITH CLUSTERING ORDER BY (time DESC)"
|
"CREATE TABLE %s (plugin text, time timeuuid, stat map<text,float>, PRIMARY KEY (plugin, time)) \
|
||||||
|
WITH CLUSTERING ORDER BY (time DESC)"
|
||||||
% self.table
|
% self.table
|
||||||
)
|
)
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@
|
||||||
"""MongoDB interface class."""
|
"""MongoDB interface class."""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
from glances.logger import logger
|
from glances.logger import logger
|
||||||
from glances.exports.glances_export import GlancesExport
|
from glances.exports.glances_export import GlancesExport
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# This file is part of Glances.
|
# This file is part of Glances.
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
# SPDX-FileCopyrightText: 2023 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LGPL-3.0-only
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
#
|
#
|
||||||
|
|
@ -76,12 +76,12 @@ class FolderList(object):
|
||||||
|
|
||||||
The list is defined in the Glances configuration file.
|
The list is defined in the Glances configuration file.
|
||||||
"""
|
"""
|
||||||
for l in range(1, self.__folder_list_max_size + 1):
|
for line in range(1, self.__folder_list_max_size + 1):
|
||||||
value = {}
|
value = {}
|
||||||
key = 'folder_' + str(l) + '_'
|
key = 'folder_' + str(line) + '_'
|
||||||
|
|
||||||
# Path is mandatory
|
# Path is mandatory
|
||||||
value['indice'] = str(l)
|
value['indice'] = str(line)
|
||||||
value['path'] = self.config.get_value(section, key + 'path')
|
value['path'] = self.config.get_value(section, key + 'path')
|
||||||
if value['path'] is None:
|
if value['path'] is None:
|
||||||
continue
|
continue
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# This file is part of Glances.
|
# This file is part of Glances.
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
# SPDX-FileCopyrightText: 2023 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LGPL-3.0-only
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
#
|
#
|
||||||
|
|
@ -62,7 +62,7 @@ def json_dumps_dictlist(data, item):
|
||||||
if isinstance(data, dict):
|
if isinstance(data, dict):
|
||||||
try:
|
try:
|
||||||
return json_dumps({item: data[item]})
|
return json_dumps({item: data[item]})
|
||||||
except:
|
except (TypeError, IndexError, KeyError):
|
||||||
return None
|
return None
|
||||||
elif isinstance(data, list):
|
elif isinstance(data, list):
|
||||||
try:
|
try:
|
||||||
|
|
@ -70,7 +70,7 @@ def json_dumps_dictlist(data, item):
|
||||||
# http://stackoverflow.com/questions/4573875/python-get-index-of-dictionary-item-in-list
|
# http://stackoverflow.com/questions/4573875/python-get-index-of-dictionary-item-in-list
|
||||||
# But https://github.com/nicolargo/glances/issues/1401
|
# But https://github.com/nicolargo/glances/issues/1401
|
||||||
return json_dumps({item: list(map(itemgetter(item), data))})
|
return json_dumps({item: list(map(itemgetter(item), data))})
|
||||||
except:
|
except (TypeError, IndexError, KeyError):
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# This file is part of Glances.
|
# This file is part of Glances.
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
# SPDX-FileCopyrightText: 2023 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LGPL-3.0-only
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
#
|
#
|
||||||
|
|
@ -123,7 +123,8 @@ Examples of use:
|
||||||
'--disable-plugin',
|
'--disable-plugin',
|
||||||
'--disable-plugins',
|
'--disable-plugins',
|
||||||
dest='disable_plugin',
|
dest='disable_plugin',
|
||||||
help='disable plugin (comma separated list or all). If all is used, then you need to configure --enable-plugin.',
|
help='disable plugin (comma separated list or all). If all is used, \
|
||||||
|
then you need to configure --enable-plugin.',
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--enable-plugin', '--enable-plugins', dest='enable_plugin', help='enable plugin (comma separated list)'
|
'--enable-plugin', '--enable-plugins', dest='enable_plugin', help='enable plugin (comma separated list)'
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# This file is part of Glances.
|
# This file is part of Glances.
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
# SPDX-FileCopyrightText: 2023 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LGPL-3.0-only
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
#
|
#
|
||||||
|
|
@ -1066,7 +1066,7 @@ class _GlancesCurses(object):
|
||||||
# Return to the first column
|
# Return to the first column
|
||||||
x = display_x
|
x = display_x
|
||||||
continue
|
continue
|
||||||
except:
|
except Exception:
|
||||||
# Avoid exception (see issue #1692)
|
# Avoid exception (see issue #1692)
|
||||||
pass
|
pass
|
||||||
# Do not display outside the screen
|
# Do not display outside the screen
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# This file is part of Glances.
|
# This file is part of Glances.
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
# SPDX-FileCopyrightText: 2023 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LGPL-3.0-only
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
#
|
#
|
||||||
|
|
@ -23,7 +23,7 @@ import glances
|
||||||
|
|
||||||
try:
|
try:
|
||||||
TERMINAL_WIDTH = shutil.get_terminal_size(fallback=(79, 24)).columns
|
TERMINAL_WIDTH = shutil.get_terminal_size(fallback=(79, 24)).columns
|
||||||
except:
|
except Exception:
|
||||||
TERMINAL_WIDTH = 79
|
TERMINAL_WIDTH = 79
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# This file is part of Glances.
|
# This file is part of Glances.
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
# SPDX-FileCopyrightText: 2023 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LGPL-3.0-only
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
#
|
#
|
||||||
|
|
@ -57,11 +57,13 @@ tree_new = {
|
||||||
'_yes': {
|
'_yes': {
|
||||||
'mem': {
|
'mem': {
|
||||||
'_yes': {
|
'_yes': {
|
||||||
# Once you've identified the offenders, the resolution will again depend on whether their memory usage seems
|
# Once you've identified the offenders, the resolution will again
|
||||||
# business-as-usual or not. For example, a memory leak can be satisfactorily addressed by a one-time or periodic
|
# depend on whether their memory usage seems business-as-usual or not.
|
||||||
# restart of the process.
|
# For example, a memory leak can be satisfactorily addressed by a one-time
|
||||||
|
# or periodic restart of the process.
|
||||||
# - if memory usage seems anomalous: kill the offending processes.
|
# - if memory usage seems anomalous: kill the offending processes.
|
||||||
# - if memory usage seems business-as-usual: add RAM to the server, or split high-memory using services to other servers.
|
# - if memory usage seems business-as-usual: add RAM to the server,
|
||||||
|
# or split high-memory using services to other servers.
|
||||||
'_msg': "Memory issue"
|
'_msg': "Memory issue"
|
||||||
},
|
},
|
||||||
'_no': {
|
'_no': {
|
||||||
|
|
@ -86,15 +88,22 @@ tree_new = {
|
||||||
'cpu_user': {
|
'cpu_user': {
|
||||||
'_yes': {
|
'_yes': {
|
||||||
# We expect the user-time percentage to be high.
|
# We expect the user-time percentage to be high.
|
||||||
# There's most likely a program or service you've configured on you server that's hogging CPU.
|
# There's most likely a program or service you've configured on you server that's
|
||||||
|
# hogging CPU.
|
||||||
# Checking the % user time just confirms this. When you see that the % user-time is high,
|
# Checking the % user time just confirms this. When you see that the % user-time is high,
|
||||||
# it's time to see what executable is monopolizing the CPU
|
# it's time to see what executable is monopolizing the CPU
|
||||||
# Once you've confirmed that the % usertime is high, check the process list(also provided by top).
|
# Once you've confirmed that the % usertime is high, check the process list(also provided
|
||||||
# Be default, top sorts the process list by % CPU, so you can just look at the top process or processes.
|
# by top).
|
||||||
# If there's a single process hogging the CPU in a way that seems abnormal, it's an anomalous situation
|
# Be default, top sorts the process list by % CPU, so you can just look at the top process
|
||||||
# that a service restart can fix. If there are are multiple processes taking up CPU resources, or it
|
# or processes.
|
||||||
# there's one process that takes lots of resources while otherwise functioning normally, than your setup
|
# If there's a single process hogging the CPU in a way that seems abnormal, it's an
|
||||||
# may just be underpowered. You'll need to upgrade your server(add more cores), or split services out onto
|
# anomalous situation
|
||||||
|
# that a service restart can fix. If there are are multiple processes taking up CPU
|
||||||
|
# resources, or it
|
||||||
|
# there's one process that takes lots of resources while otherwise functioning normally,
|
||||||
|
# than your setup
|
||||||
|
# may just be underpowered. You'll need to upgrade your server(add more cores),
|
||||||
|
# or split services out onto
|
||||||
# other boxes. In either case, you have a resolution:
|
# other boxes. In either case, you have a resolution:
|
||||||
# - if situation seems anomalous: kill the offending processes.
|
# - if situation seems anomalous: kill the offending processes.
|
||||||
# - if situation seems typical given history: upgrade server or add more servers.
|
# - if situation seems typical given history: upgrade server or add more servers.
|
||||||
|
|
@ -119,13 +128,14 @@ tree_new = {
|
||||||
# Your slowness isn't due to CPU or IO problems, so it's likely an application-specific issue.
|
# Your slowness isn't due to CPU or IO problems, so it's likely an application-specific issue.
|
||||||
# It's also possible that the slowness is being caused by another server in your cluster, or
|
# It's also possible that the slowness is being caused by another server in your cluster, or
|
||||||
# by an external service you rely on.
|
# by an external service you rely on.
|
||||||
# start by checking important applications for uncharacteristic slowness(the DB is a good place to start),
|
# start by checking important applications for uncharacteristic slowness(the DB is a good place
|
||||||
# think through which parts of your infrastructure could be slowed down externally. For example, do you
|
# to start), think through which parts of your infrastructure could be slowed down externally.
|
||||||
# use an externally hosted email service that could slow down critical parts of your application?
|
# For example, do you use an externally hosted email service that could slow down critical
|
||||||
# If you suspect another server in your cluster, strace and lsof can provide information on what the
|
# parts of your application ?
|
||||||
# process is doing or waiting on. Strace will show you which file descriptors are being read or written
|
# If you suspect another server in your cluster, strace and lsof can provide information on
|
||||||
# to(or being attempted to be read from) and lsof can give you a mapping of those file descriptors to
|
# what the process is doing or waiting on. Strace will show you which file descriptors are
|
||||||
# network connections.
|
# being read or written to (or being attempted to be read from) and lsof can give you a
|
||||||
|
# mapping of those file descriptors to network connections.
|
||||||
'_msg': "External issue"
|
'_msg': "External issue"
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# This file is part of Glances.
|
# This file is part of Glances.
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
# SPDX-FileCopyrightText: 2023 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LGPL-3.0-only
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
#
|
#
|
||||||
|
|
@ -101,7 +101,7 @@ class Plugin(GlancesPlugin):
|
||||||
first_column = '{}'.format(m['name'])
|
first_column = '{}'.format(m['name'])
|
||||||
first_column_style = self.get_alert(m['count'], m['countmin'], m['countmax'])
|
first_column_style = self.get_alert(m['count'], m['countmin'], m['countmax'])
|
||||||
second_column = '{}'.format(m['count'] if m['regex'] else '')
|
second_column = '{}'.format(m['count'] if m['regex'] else '')
|
||||||
for l in m['result'].split('\n'):
|
for line in m['result'].split('\n'):
|
||||||
# Display first column with the process name...
|
# Display first column with the process name...
|
||||||
msg = '{:<16} '.format(first_column)
|
msg = '{:<16} '.format(first_column)
|
||||||
ret.append(self.curse_add_line(msg, first_column_style))
|
ret.append(self.curse_add_line(msg, first_column_style))
|
||||||
|
|
@ -111,7 +111,7 @@ class Plugin(GlancesPlugin):
|
||||||
# ... only on the first line
|
# ... only on the first line
|
||||||
first_column = second_column = ''
|
first_column = second_column = ''
|
||||||
# Display AMP result in the third column
|
# Display AMP result in the third column
|
||||||
ret.append(self.curse_add_line(l, splittable=True))
|
ret.append(self.curse_add_line(line, splittable=True))
|
||||||
ret.append(self.curse_new_line())
|
ret.append(self.curse_new_line())
|
||||||
|
|
||||||
# Delete the last empty line
|
# Delete the last empty line
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# This file is part of Glances.
|
# This file is part of Glances.
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
# SPDX-FileCopyrightText: 2023 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LGPL-3.0-only
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
#
|
#
|
||||||
|
|
@ -19,7 +19,6 @@ from glances.processes import glances_processes, sort_stats
|
||||||
from glances.outputs.glances_unicode import unicode_message
|
from glances.outputs.glances_unicode import unicode_message
|
||||||
from glances.plugins.glances_core import Plugin as CorePlugin
|
from glances.plugins.glances_core import Plugin as CorePlugin
|
||||||
from glances.plugins.glances_plugin import GlancesPlugin
|
from glances.plugins.glances_plugin import GlancesPlugin
|
||||||
from glances.outputs.glances_bars import Bar
|
|
||||||
|
|
||||||
|
|
||||||
def seconds_to_hms(input_seconds):
|
def seconds_to_hms(input_seconds):
|
||||||
|
|
@ -326,8 +325,8 @@ class Plugin(GlancesPlugin):
|
||||||
# Display rate if stats is available and io_tag ([4]) == 1
|
# Display rate if stats is available and io_tag ([4]) == 1
|
||||||
# IO
|
# IO
|
||||||
io = int(
|
io = int(
|
||||||
(p['io_counters'][0 if rorw == 'ior' else 1] - p['io_counters'][2 if rorw == 'ior' else 3])
|
(p['io_counters'][0 if rorw == 'ior' else 1] - p['io_counters'][2 if rorw == 'ior' else 3]) /
|
||||||
/ p['time_since_update']
|
p['time_since_update']
|
||||||
)
|
)
|
||||||
if io == 0:
|
if io == 0:
|
||||||
msg = self.layout_stat[rorw].format("0")
|
msg = self.layout_stat[rorw].format("0")
|
||||||
|
|
@ -358,7 +357,8 @@ class Plugin(GlancesPlugin):
|
||||||
# When a process is selected:
|
# When a process is selected:
|
||||||
# * display a special character at the beginning of the line
|
# * display a special character at the beginning of the line
|
||||||
# * underline the command name
|
# * underline the command name
|
||||||
ret.append(self.curse_add_line(unicode_message('PROCESS_SELECTOR') if (selected and not args.disable_cursor) else ' ', 'SELECTED'))
|
ret.append(self.curse_add_line(unicode_message('PROCESS_SELECTOR') if (selected and not args.disable_cursor)
|
||||||
|
else ' ', 'SELECTED'))
|
||||||
|
|
||||||
# CPU
|
# CPU
|
||||||
ret.append(self._get_process_curses_cpu(p, selected, args))
|
ret.append(self._get_process_curses_cpu(p, selected, args))
|
||||||
|
|
@ -491,7 +491,8 @@ class Plugin(GlancesPlugin):
|
||||||
|
|
||||||
Input p is a dict with the following keys:
|
Input p is a dict with the following keys:
|
||||||
{'status': 'S',
|
{'status': 'S',
|
||||||
'memory_info': pmem(rss=466890752, vms=3365347328, shared=68153344, text=659456, lib=0, data=774647808, dirty=0),
|
'memory_info': pmem(rss=466890752, vms=3365347328, shared=68153344,
|
||||||
|
text=659456, lib=0, data=774647808, dirty=0),
|
||||||
'pid': 4980,
|
'pid': 4980,
|
||||||
'io_counters': [165385216, 0, 165385216, 0, 1],
|
'io_counters': [165385216, 0, 165385216, 0, 1],
|
||||||
'num_threads': 20,
|
'num_threads': 20,
|
||||||
|
|
@ -577,10 +578,12 @@ class Plugin(GlancesPlugin):
|
||||||
if 'memory_info' in p and p['memory_info'] is not None:
|
if 'memory_info' in p and p['memory_info'] is not None:
|
||||||
ret.append(self.curse_add_line(' Memory info: '))
|
ret.append(self.curse_add_line(' Memory info: '))
|
||||||
for k in p['memory_info']._asdict():
|
for k in p['memory_info']._asdict():
|
||||||
ret.append(self.curse_add_line(self.auto_unit(p['memory_info']._asdict()[k], low_precision=False), decoration='INFO', splittable=True))
|
ret.append(self.curse_add_line(self.auto_unit(p['memory_info']._asdict()[k], low_precision=False),
|
||||||
|
decoration='INFO', splittable=True))
|
||||||
ret.append(self.curse_add_line(' ' + k + ' ', splittable=True))
|
ret.append(self.curse_add_line(' ' + k + ' ', splittable=True))
|
||||||
if 'memory_swap' in p and p['memory_swap'] is not None:
|
if 'memory_swap' in p and p['memory_swap'] is not None:
|
||||||
ret.append(self.curse_add_line(self.auto_unit(p['memory_swap'], low_precision=False), decoration='INFO', splittable=True))
|
ret.append(self.curse_add_line(self.auto_unit(p['memory_swap'], low_precision=False),
|
||||||
|
decoration='INFO', splittable=True))
|
||||||
ret.append(self.curse_add_line(' swap ', splittable=True))
|
ret.append(self.curse_add_line(' swap ', splittable=True))
|
||||||
|
|
||||||
# Third line is for open files/network sessions
|
# Third line is for open files/network sessions
|
||||||
|
|
@ -672,9 +675,9 @@ class Plugin(GlancesPlugin):
|
||||||
ret.append(self.curse_add_line(msg, decoration=self.__mmm_deco(mmm)))
|
ret.append(self.curse_add_line(msg, decoration=self.__mmm_deco(mmm)))
|
||||||
# VIRT and RES memory sum
|
# VIRT and RES memory sum
|
||||||
if (
|
if (
|
||||||
'memory_info' in self.stats[0]
|
'memory_info' in self.stats[0] and
|
||||||
and self.stats[0]['memory_info'] is not None
|
self.stats[0]['memory_info'] is not None and
|
||||||
and self.stats[0]['memory_info'] != ''
|
self.stats[0]['memory_info'] != ''
|
||||||
):
|
):
|
||||||
# VMS
|
# VMS
|
||||||
msg = self.layout_stat['virt'].format(
|
msg = self.layout_stat['virt'].format(
|
||||||
|
|
|
||||||
|
|
@ -188,7 +188,7 @@ class Plugin(GlancesPlugin):
|
||||||
# Add the new hotspot to the message
|
# Add the new hotspot to the message
|
||||||
msg = '{:{width}}'.format(nativestr(hotspot_name), width=if_name_max_width)
|
msg = '{:{width}}'.format(nativestr(hotspot_name), width=if_name_max_width)
|
||||||
ret.append(self.curse_add_line(msg))
|
ret.append(self.curse_add_line(msg))
|
||||||
msg = '{:>7}'.format(i['signal'], width=if_name_max_width)
|
msg = '{:>7}'.format(i['signal'], )
|
||||||
ret.append(
|
ret.append(
|
||||||
self.curse_add_line(msg, self.get_views(item=i[self.get_key()], key='signal', option='decoration'))
|
self.curse_add_line(msg, self.get_views(item=i[self.get_key()], key='signal', option='decoration'))
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# This file is part of Glances.
|
# This file is part of Glances.
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
# SPDX-FileCopyrightText: 2023 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LGPL-3.0-only
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
#
|
#
|
||||||
|
|
@ -313,11 +313,15 @@ class GlancesProcesses(object):
|
||||||
if stat_prefix + '_min' not in self.extended_process:
|
if stat_prefix + '_min' not in self.extended_process:
|
||||||
ret[stat_prefix + '_min'] = proc[stat_prefix + '_percent']
|
ret[stat_prefix + '_min'] = proc[stat_prefix + '_percent']
|
||||||
else:
|
else:
|
||||||
ret[stat_prefix + '_min'] = proc[stat_prefix + '_percent'] if proc[stat_prefix + '_min'] > proc[stat_prefix + '_percent'] else proc[stat_prefix + '_min']
|
ret[stat_prefix + '_min'] = \
|
||||||
|
proc[stat_prefix + '_percent'] if proc[stat_prefix + '_min'] > proc[stat_prefix + '_percent'] \
|
||||||
|
else proc[stat_prefix + '_min']
|
||||||
if stat_prefix + '_max' not in self.extended_process:
|
if stat_prefix + '_max' not in self.extended_process:
|
||||||
ret[stat_prefix + '_max'] = proc[stat_prefix + '_percent']
|
ret[stat_prefix + '_max'] = proc[stat_prefix + '_percent']
|
||||||
else:
|
else:
|
||||||
ret[stat_prefix + '_max'] = proc[stat_prefix + '_percent'] if proc[stat_prefix + '_max'] < proc[stat_prefix + '_percent'] else proc[stat_prefix + '_max']
|
ret[stat_prefix + '_max'] = \
|
||||||
|
proc[stat_prefix + '_percent'] if proc[stat_prefix + '_max'] < proc[stat_prefix + '_percent'] \
|
||||||
|
else proc[stat_prefix + '_max']
|
||||||
if stat_prefix + '_mean_sum' not in self.extended_process:
|
if stat_prefix + '_mean_sum' not in self.extended_process:
|
||||||
ret[stat_prefix + '_mean_sum'] = proc[stat_prefix + '_percent']
|
ret[stat_prefix + '_mean_sum'] = proc[stat_prefix + '_percent']
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,51 @@
|
||||||
[tool.black]
|
[tool.black]
|
||||||
line-length = 120
|
line-length = 120
|
||||||
skip-string-normalization = true
|
skip-string-normalization = true
|
||||||
exclude = '\./glances/outputs/static/*'
|
exclude = '\./glances/outputs/static/*'
|
||||||
|
|
||||||
|
[tool.ruff]
|
||||||
|
# Enable pycodestyle (`E`) and Pyflakes (`F`) codes by default.
|
||||||
|
select = ["E", "F"]
|
||||||
|
ignore = []
|
||||||
|
|
||||||
|
# Allow autofix for all enabled rules (when `--fix`) is provided.
|
||||||
|
fixable = ["A", "B", "C", "D", "E", "F", "G", "I", "N", "Q", "S", "T", "W", "ANN", "ARG", "BLE", "COM", "DJ", "DTZ", "EM", "ERA", "EXE", "FBT", "ICN", "INP", "ISC", "NPY", "PD", "PGH", "PIE", "PL", "PT", "PTH", "PYI", "RET", "RSE", "RUF", "SIM", "SLF", "TCH", "TID", "TRY", "UP", "YTT"]
|
||||||
|
unfixable = []
|
||||||
|
|
||||||
|
# Exclude a variety of commonly ignored directories.
|
||||||
|
exclude = [
|
||||||
|
".bzr",
|
||||||
|
".direnv",
|
||||||
|
".eggs",
|
||||||
|
".git",
|
||||||
|
".hg",
|
||||||
|
".mypy_cache",
|
||||||
|
".nox",
|
||||||
|
".pants.d",
|
||||||
|
".pytype",
|
||||||
|
".ruff_cache",
|
||||||
|
".svn",
|
||||||
|
".tox",
|
||||||
|
".venv",
|
||||||
|
"__pypackages__",
|
||||||
|
"_build",
|
||||||
|
"buck-out",
|
||||||
|
"build",
|
||||||
|
"dist",
|
||||||
|
"node_modules",
|
||||||
|
"venv",
|
||||||
|
"docs"
|
||||||
|
]
|
||||||
|
|
||||||
|
# Same as Black.
|
||||||
|
line-length = 120
|
||||||
|
|
||||||
|
# Allow unused variables when underscore-prefixed.
|
||||||
|
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
||||||
|
|
||||||
|
# Assume Python 3.11
|
||||||
|
target-version = "py311"
|
||||||
|
|
||||||
|
[tool.ruff.mccabe]
|
||||||
|
# Unlike Flake8, default to a complexity level of 10.
|
||||||
|
max-complexity = 10
|
||||||
Loading…
Reference in New Issue