From cb68d216d2b79e6566b1cfa550abc810ffd1dcc5 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 28 Aug 2021 10:56:04 +0200 Subject: [PATCH] Merge compat into globals --- glances/README.txt | 1 - glances/amps/glances_amp.py | 2 +- glances/amps/glances_default.py | 2 +- glances/amps/glances_systemd.py | 2 +- glances/amps/glances_systemv.py | 2 +- glances/amps_list.py | 5 +- glances/client.py | 2 +- glances/client_browser.py | 2 +- glances/compat.py | 212 --------------------- glances/config.py | 3 +- glances/events.py | 3 +- glances/exports/glances_cassandra.py | 2 +- glances/exports/glances_csv.py | 2 +- glances/exports/glances_export.py | 2 +- glances/exports/glances_graph.py | 2 +- glances/exports/glances_graphite.py | 1 - glances/exports/glances_json.py | 2 +- glances/exports/glances_kafka.py | 2 +- glances/exports/glances_opentsdb.py | 1 - glances/exports/glances_prometheus.py | 2 +- glances/exports/glances_rabbitmq.py | 1 - glances/exports/glances_restful.py | 2 +- glances/exports/glances_riemann.py | 1 - glances/exports/glances_statsd.py | 1 - glances/exports/glances_zeromq.py | 2 +- glances/folder_list.py | 2 +- glances/globals.py | 206 ++++++++++++++++++++ glances/logger.py | 3 +- glances/main.py | 3 +- glances/outdated.py | 3 +- glances/outputs/glances_bottle.py | 2 +- glances/outputs/glances_curses.py | 3 +- glances/outputs/glances_sparklines.py | 2 +- glances/outputs/glances_stdout.py | 2 +- glances/outputs/glances_stdout_apidoc.py | 2 +- glances/outputs/glances_stdout_csv.py | 2 +- glances/outputs/glances_stdout_issue.py | 2 +- glances/password.py | 3 +- glances/plugins/amps/__init__.py | 2 +- glances/plugins/cloud/__init__.py | 2 +- glances/plugins/connections/__init__.py | 2 +- glances/plugins/cpu/__init__.py | 3 +- glances/plugins/diskio/__init__.py | 2 +- glances/plugins/docker/__init__.py | 2 +- glances/plugins/folders/__init__.py | 2 +- glances/plugins/fs/__init__.py | 2 +- glances/plugins/glances_plugin.py | 2 +- glances/plugins/glances_sensors.py | 2 +- glances/plugins/gpu/__init__.py | 2 +- glances/plugins/ip/__init__.py | 2 +- glances/plugins/load/__init__.py | 2 +- glances/plugins/mem/__init__.py | 2 +- glances/plugins/memswap/__init__.py | 2 +- glances/plugins/network/__init__.py | 2 +- glances/plugins/ports/__init__.py | 3 +- glances/plugins/processlist/__init__.py | 3 +- glances/plugins/raid/__init__.py | 2 +- glances/plugins/sensors/glances_hddtemp.py | 2 +- glances/plugins/smart/__init__.py | 2 +- glances/plugins/system/__init__.py | 2 +- glances/plugins/wifi/__init__.py | 2 +- glances/ports_list.py | 1 - glances/processes.py | 3 +- glances/secure.py | 2 +- glances/server.py | 2 +- glances/static_list.py | 1 - glances/stats_client_snmp.py | 2 +- glances/web_list.py | 12 +- unitest-restful.py | 2 +- unitest-xmlrpc.py | 2 +- unitest.py | 5 +- 71 files changed, 274 insertions(+), 301 deletions(-) delete mode 100644 glances/compat.py diff --git a/glances/README.txt b/glances/README.txt index 74782fc7..c5fd13eb 100644 --- a/glances/README.txt +++ b/glances/README.txt @@ -8,7 +8,6 @@ https://glances.readthedocs.io/en/stable/ __init__.py Global module init __main__.py Entry point for Glances module config.py Manage the configuration file -compat.py Python2/3 compatibility shims module globals.py Share variables upon modules main.py Main script to rule them up... client.py Glances client diff --git a/glances/amps/glances_amp.py b/glances/amps/glances_amp.py index ccbee541..5e6f31ac 100644 --- a/glances/amps/glances_amp.py +++ b/glances/amps/glances_amp.py @@ -32,7 +32,7 @@ The return string is a string with one or more line (\n between lines). If the *one_line* var is true then the AMP will be displayed in one line. """ -from glances.compat import u, b, n, nativestr +from glances.globals import u, b, n, nativestr from glances.timer import Timer from glances.logger import logger diff --git a/glances/amps/glances_default.py b/glances/amps/glances_default.py index d942939a..faa49718 100644 --- a/glances/amps/glances_default.py +++ b/glances/amps/glances_default.py @@ -37,7 +37,7 @@ command=foo status from subprocess import check_output, STDOUT, CalledProcessError -from glances.compat import u, to_ascii +from glances.globals import u, to_ascii from glances.logger import logger from glances.amps.glances_amp import GlancesAmp diff --git a/glances/amps/glances_systemd.py b/glances/amps/glances_systemd.py index 993bfefc..5e34d90d 100644 --- a/glances/amps/glances_systemd.py +++ b/glances/amps/glances_systemd.py @@ -48,7 +48,7 @@ systemctl_cmd=/usr/bin/systemctl --plain from subprocess import check_output, CalledProcessError from glances.logger import logger -from glances.compat import iteritems, to_ascii +from glances.globals import iteritems, to_ascii from glances.amps.glances_amp import GlancesAmp diff --git a/glances/amps/glances_systemv.py b/glances/amps/glances_systemv.py index c28a4fde..836427e8 100644 --- a/glances/amps/glances_systemv.py +++ b/glances/amps/glances_systemv.py @@ -47,7 +47,7 @@ service_cmd=/usr/bin/service --status-all from subprocess import check_output, STDOUT from glances.logger import logger -from glances.compat import iteritems +from glances.globals import iteritems from glances.amps.glances_amp import GlancesAmp diff --git a/glances/amps_list.py b/glances/amps_list.py index 1837aec4..90b34184 100644 --- a/glances/amps_list.py +++ b/glances/amps_list.py @@ -23,9 +23,8 @@ import os import re import threading -from glances.compat import listkeys, iteritems +from glances.globals import listkeys, iteritems, amps_path from glances.logger import logger -from glances.globals import amps_path from glances.processes import glances_processes @@ -112,7 +111,7 @@ class AmpsList(object): if not v.enable(): # Do not update if the enable tag is set continue - + if v.regex() is None: # If there is no regex, execute anyway (see issue #1690) v.set_count(0) diff --git a/glances/client.py b/glances/client.py index 139106ad..264f7e56 100644 --- a/glances/client.py +++ b/glances/client.py @@ -24,7 +24,7 @@ import socket import sys from glances import __version__ -from glances.compat import Fault, ProtocolError, ServerProxy, Transport +from glances.globals import Fault, ProtocolError, ServerProxy, Transport from glances.logger import logger from glances.stats_client import GlancesStatsClient from glances.outputs.glances_curses import GlancesCursesClient diff --git a/glances/client_browser.py b/glances/client_browser.py index 7eb0c2bb..94ab80b4 100644 --- a/glances/client_browser.py +++ b/glances/client_browser.py @@ -23,7 +23,7 @@ import json import socket import threading -from glances.compat import Fault, ProtocolError, ServerProxy +from glances.globals import Fault, ProtocolError, ServerProxy from glances.client import GlancesClient, GlancesClientTransport from glances.logger import logger, LOG_FILENAME from glances.password_list import GlancesPasswordList as GlancesPassword diff --git a/glances/compat.py b/glances/compat.py deleted file mode 100644 index 58952fc2..00000000 --- a/glances/compat.py +++ /dev/null @@ -1,212 +0,0 @@ -# -*- 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 . - -# flake8: noqa -# pylint: skip-file - -# TODO: merge this file with the globals.py -# Not needed anymore because only Python 3 is supported. - -from __future__ import print_function, unicode_literals - -import operator -import sys -import unicodedata -import types -import subprocess -import os - -from glances.logger import logger - -import queue -from configparser import ConfigParser, NoOptionError, NoSectionError -from statistics import mean -from xmlrpc.client import Fault, ProtocolError, ServerProxy, Transport, Server -from xmlrpc.server import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer -from urllib.request import urlopen -from urllib.error import HTTPError, URLError -from urllib.parse import urlparse - -# Correct issue #1025 by monkey path the xmlrpc lib -from defusedxml.xmlrpc import monkey_patch -monkey_patch() - -input = input -range = range -map = map - -text_type = str -binary_type = bytes -bool_type = bool -long = int - -PermissionError = OSError - -viewkeys = operator.methodcaller('keys') -viewvalues = operator.methodcaller('values') -viewitems = operator.methodcaller('items') - -def printandflush(string): - """Print and flush (used by stdout* outputs modules)""" - print(string, flush=True) - -def to_ascii(s): - """Convert the bytes string to a ASCII string - Usefull to remove accent (diacritics)""" - if isinstance(s, binary_type): - return s.decode() - return s.encode('ascii', 'ignore').decode() - -def listitems(d): - return list(d.items()) - -def listkeys(d): - return list(d.keys()) - -def listvalues(d): - return list(d.values()) - -def iteritems(d): - return iter(d.items()) - -def iterkeys(d): - return iter(d.keys()) - -def itervalues(d): - return iter(d.values()) - -def u(s, errors='replace'): - if isinstance(s, text_type): - return s - return s.decode('utf-8', errors=errors) - -def b(s, errors='replace'): - if isinstance(s, binary_type): - return s - return s.encode('utf-8', errors=errors) - -def n(s): - '''Only in Python 2... - from future.utils import bytes_to_native_str as n - ''' - return s - -def nativestr(s, errors='replace'): - if isinstance(s, text_type): - return s - elif isinstance(s, (int, float)): - return s.__str__() - else: - return s.decode('utf-8', errors=errors) - -def system_exec(command): - """Execute a system command and return the result as a str""" - try: - res = subprocess.run(command.split(' '), - stdout=subprocess.PIPE).stdout.decode('utf-8') - except Exception as e: - logger.debug('Can not evaluate command {} ({})'.format(command, e)) - res = '' - return res.rstrip() - - -def subsample(data, sampling): - """Compute a simple mean subsampling. - - Data should be a list of numerical itervalues - - Return a subsampled list of sampling lenght - """ - if len(data) <= sampling: - return data - sampling_length = int(round(len(data) / float(sampling))) - return [mean(data[s * sampling_length:(s + 1) * sampling_length]) for s in range(0, sampling)] - - -def time_serie_subsample(data, sampling): - """Compute a simple mean subsampling. - - Data should be a list of set (time, value) - - Return a subsampled list of sampling length - """ - if len(data) <= sampling: - return data - t = [t[0] for t in data] - v = [t[1] for t in data] - sampling_length = int(round(len(data) / float(sampling))) - t_subsampled = [t[s * sampling_length:(s + 1) * sampling_length][0] for s in range(0, sampling)] - v_subsampled = [mean(v[s * sampling_length:(s + 1) * sampling_length]) for s in range(0, sampling)] - return list(zip(t_subsampled, v_subsampled)) - - -def to_fahrenheit(celsius): - """Convert Celsius to Fahrenheit.""" - return celsius * 1.8 + 32 - - -def is_admin(): - """ - https://stackoverflow.com/a/19719292 - @return: True if the current user is an 'Admin' whatever that - means (root on Unix), otherwise False. - Warning: The inner function fails unless you have Windows XP SP2 or - higher. The failure causes a traceback to be printed and this - function to return False. - """ - - if os.name == 'nt': - import ctypes - import traceback - # WARNING: requires Windows XP SP2 or higher! - try: - return ctypes.windll.shell32.IsUserAnAdmin() - except Exception as e: - traceback.print_exc() - return False - else: - # Check for root on Posix - return os.getuid() == 0 - - -def key_exist_value_not_none(k, d): - # Return True if: - # - key k exists - # - d[k] is not None - return k in d and d[k] is not None - - -def key_exist_value_not_none_not_v(k, d, v=''): - # Return True if: - # - key k exists - # - d[k] is not None - # - d[k] != v - return k in d and d[k] is not None and d[k] != v - - -def disable(class_name, var): - """Set disable_ to True in the class class_name.""" - setattr(class_name, 'enable_' + var, False) - setattr(class_name, 'disable_' + var, True) - - -def enable(class_name, var): - """Set disable_ to False in the class class_name.""" - setattr(class_name, 'enable_' + var, True) - setattr(class_name, 'disable_' + var, False) diff --git a/glances/config.py b/glances/config.py index 8b9a9aa0..3428dadf 100644 --- a/glances/config.py +++ b/glances/config.py @@ -25,8 +25,7 @@ import multiprocessing from io import open import re -from glances.compat import ConfigParser, NoOptionError, NoSectionError, system_exec -from glances.globals import BSD, LINUX, MACOS, SUNOS, WINDOWS +from glances.globals import ConfigParser, NoOptionError, NoSectionError, system_exec, BSD, LINUX, MACOS, SUNOS, WINDOWS from glances.logger import logger diff --git a/glances/events.py b/glances/events.py index 6cdec9df..8069cec3 100644 --- a/glances/events.py +++ b/glances/events.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2019 Nicolargo +# 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 @@ -22,7 +22,6 @@ import time from datetime import datetime -from glances.compat import range from glances.processes import glances_processes, sort_stats diff --git a/glances/exports/glances_cassandra.py b/glances/exports/glances_cassandra.py index 1e660e1b..1249dba0 100644 --- a/glances/exports/glances_cassandra.py +++ b/glances/exports/glances_cassandra.py @@ -25,7 +25,7 @@ from numbers import Number from glances.logger import logger from glances.exports.glances_export import GlancesExport -from glances.compat import iteritems +from glances.globals import iteritems from cassandra.auth import PlainTextAuthProvider from cassandra.cluster import Cluster diff --git a/glances/exports/glances_csv.py b/glances/exports/glances_csv.py index 4e198809..6814adaa 100644 --- a/glances/exports/glances_csv.py +++ b/glances/exports/glances_csv.py @@ -24,7 +24,7 @@ import csv import sys import time -from glances.compat import PY3, iterkeys, itervalues +from glances.globals import PY3, iterkeys, itervalues from glances.logger import logger from glances.exports.glances_export import GlancesExport diff --git a/glances/exports/glances_export.py b/glances/exports/glances_export.py index 13d1343d..98a9e4ae 100644 --- a/glances/exports/glances_export.py +++ b/glances/exports/glances_export.py @@ -25,7 +25,7 @@ I am your father... import json -from glances.compat import NoOptionError, NoSectionError, iteritems, iterkeys +from glances.globals import NoOptionError, NoSectionError, iteritems, iterkeys from glances.logger import logger diff --git a/glances/exports/glances_graph.py b/glances/exports/glances_graph.py index 7ec2e688..0ac79db8 100644 --- a/glances/exports/glances_graph.py +++ b/glances/exports/glances_graph.py @@ -28,7 +28,7 @@ import errno from glances.logger import logger from glances.timer import Timer -from glances.compat import iteritems, time_serie_subsample +from glances.globals import iteritems, time_serie_subsample from glances.exports.glances_export import GlancesExport diff --git a/glances/exports/glances_graphite.py b/glances/exports/glances_graphite.py index a5c96b0b..2b577e3a 100644 --- a/glances/exports/glances_graphite.py +++ b/glances/exports/glances_graphite.py @@ -22,7 +22,6 @@ import sys from numbers import Number -from glances.compat import range from glances.logger import logger from glances.exports.glances_export import GlancesExport diff --git a/glances/exports/glances_json.py b/glances/exports/glances_json.py index 4f922806..acc5ea5f 100644 --- a/glances/exports/glances_json.py +++ b/glances/exports/glances_json.py @@ -3,7 +3,7 @@ import sys import json -from glances.compat import PY3, listkeys +from glances.globals import PY3, listkeys from glances.logger import logger from glances.exports.glances_export import GlancesExport diff --git a/glances/exports/glances_kafka.py b/glances/exports/glances_kafka.py index f5a6127e..2e2e3a20 100644 --- a/glances/exports/glances_kafka.py +++ b/glances/exports/glances_kafka.py @@ -22,7 +22,7 @@ import sys from glances.logger import logger -from glances.compat import iteritems +from glances.globals import iteritems from glances.exports.glances_export import GlancesExport from kafka import KafkaProducer diff --git a/glances/exports/glances_opentsdb.py b/glances/exports/glances_opentsdb.py index 4cd2d4fd..f73c6312 100644 --- a/glances/exports/glances_opentsdb.py +++ b/glances/exports/glances_opentsdb.py @@ -22,7 +22,6 @@ import sys from numbers import Number -from glances.compat import range from glances.logger import logger from glances.exports.glances_export import GlancesExport diff --git a/glances/exports/glances_prometheus.py b/glances/exports/glances_prometheus.py index 31667f9e..cef67bf4 100644 --- a/glances/exports/glances_prometheus.py +++ b/glances/exports/glances_prometheus.py @@ -24,7 +24,7 @@ from numbers import Number from glances.logger import logger from glances.exports.glances_export import GlancesExport -from glances.compat import iteritems, listkeys +from glances.globals import iteritems, listkeys from prometheus_client import start_http_server, Gauge diff --git a/glances/exports/glances_rabbitmq.py b/glances/exports/glances_rabbitmq.py index 58701983..538fc42c 100644 --- a/glances/exports/glances_rabbitmq.py +++ b/glances/exports/glances_rabbitmq.py @@ -24,7 +24,6 @@ import socket import sys from numbers import Number -from glances.compat import range from glances.logger import logger from glances.exports.glances_export import GlancesExport diff --git a/glances/exports/glances_restful.py b/glances/exports/glances_restful.py index dbc4d54d..c18ee6b1 100644 --- a/glances/exports/glances_restful.py +++ b/glances/exports/glances_restful.py @@ -21,7 +21,7 @@ import sys -from glances.compat import listkeys +from glances.globals import listkeys from glances.logger import logger from glances.exports.glances_export import GlancesExport diff --git a/glances/exports/glances_riemann.py b/glances/exports/glances_riemann.py index 2a1b77fc..8062ab12 100644 --- a/glances/exports/glances_riemann.py +++ b/glances/exports/glances_riemann.py @@ -23,7 +23,6 @@ import socket import sys from numbers import Number -from glances.compat import range from glances.logger import logger from glances.exports.glances_export import GlancesExport diff --git a/glances/exports/glances_statsd.py b/glances/exports/glances_statsd.py index 8ccfe7d9..8ebe168f 100644 --- a/glances/exports/glances_statsd.py +++ b/glances/exports/glances_statsd.py @@ -22,7 +22,6 @@ import sys from numbers import Number -from glances.compat import range from glances.logger import logger from glances.exports.glances_export import GlancesExport diff --git a/glances/exports/glances_zeromq.py b/glances/exports/glances_zeromq.py index fa8685e5..57e30af0 100644 --- a/glances/exports/glances_zeromq.py +++ b/glances/exports/glances_zeromq.py @@ -22,7 +22,7 @@ import sys import json -from glances.compat import b +from glances.globals import b from glances.logger import logger from glances.exports.glances_export import GlancesExport diff --git a/glances/folder_list.py b/glances/folder_list.py index 262e7610..1b7e54b2 100644 --- a/glances/folder_list.py +++ b/glances/folder_list.py @@ -23,7 +23,7 @@ from __future__ import unicode_literals import os from glances.timer import Timer -from glances.compat import range, nativestr +from glances.globals import nativestr from glances.logger import logger # Use the built-in version of scandir/walk if possible, otherwise diff --git a/glances/globals.py b/glances/globals.py index 06fb1c0a..516936b0 100644 --- a/glances/globals.py +++ b/glances/globals.py @@ -19,10 +19,36 @@ """Common objects shared by all Glances modules.""" +################ +# GLOBAL IMPORTS +################ + import errno import os import sys import platform +import operator +import unicodedata +import types +import subprocess + +import queue +from configparser import ConfigParser, NoOptionError, NoSectionError +from statistics import mean +from xmlrpc.client import Fault, ProtocolError, ServerProxy, Transport, Server +from xmlrpc.server import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer +from urllib.request import urlopen +from urllib.error import HTTPError, URLError +from urllib.parse import urlparse + +# Correct issue #1025 by monkey path the xmlrpc lib +from defusedxml.xmlrpc import monkey_patch +monkey_patch() + + +############## +# GLOBALS VARS +############## # OS constants (some libraries/features are OS-dependent) BSD = sys.platform.find('bsd') != -1 @@ -42,6 +68,186 @@ sys.path.insert(1, exports_path) sys.path.insert(1, plugins_path) sys.path.insert(1, amps_path) +# Types +text_type = str +binary_type = bytes +bool_type = bool +long = int + +# Alias errors +PermissionError = OSError + +# Alias methods +viewkeys = operator.methodcaller('keys') +viewvalues = operator.methodcaller('values') +viewitems = operator.methodcaller('items') + + +################### +# GLOBALS FUNCTIONS +################### + + +def printandflush(string): + """Print and flush (used by stdout* outputs modules)""" + print(string, flush=True) + + +def to_ascii(s): + """Convert the bytes string to a ASCII string + Usefull to remove accent (diacritics)""" + if isinstance(s, binary_type): + return s.decode() + return s.encode('ascii', 'ignore').decode() + + +def listitems(d): + return list(d.items()) + + +def listkeys(d): + return list(d.keys()) + + +def listvalues(d): + return list(d.values()) + + +def iteritems(d): + return iter(d.items()) + + +def iterkeys(d): + return iter(d.keys()) + + +def itervalues(d): + return iter(d.values()) + + +def u(s, errors='replace'): + if isinstance(s, text_type): + return s + return s.decode('utf-8', errors=errors) + + +def b(s, errors='replace'): + if isinstance(s, binary_type): + return s + return s.encode('utf-8', errors=errors) + + +def n(s): + '''Only in Python 2... + from future.utils import bytes_to_native_str as n + ''' + return s + + +def nativestr(s, errors='replace'): + if isinstance(s, text_type): + return s + elif isinstance(s, (int, float)): + return s.__str__() + else: + return s.decode('utf-8', errors=errors) + + +def system_exec(command): + """Execute a system command and return the result as a str""" + try: + res = subprocess.run(command.split(' '), + stdout=subprocess.PIPE).stdout.decode('utf-8') + except Exception as e: + res = 'ERROR: {}'.format(e) + return res.rstrip() + + +def subsample(data, sampling): + """Compute a simple mean subsampling. + + Data should be a list of numerical itervalues + + Return a subsampled list of sampling lenght + """ + if len(data) <= sampling: + return data + sampling_length = int(round(len(data) / float(sampling))) + return [mean(data[s * sampling_length:(s + 1) * sampling_length]) for s in range(0, sampling)] + + +def time_serie_subsample(data, sampling): + """Compute a simple mean subsampling. + + Data should be a list of set (time, value) + + Return a subsampled list of sampling length + """ + if len(data) <= sampling: + return data + t = [t[0] for t in data] + v = [t[1] for t in data] + sampling_length = int(round(len(data) / float(sampling))) + t_subsampled = [t[s * sampling_length:(s + 1) * sampling_length][0] for s in range(0, sampling)] + v_subsampled = [mean(v[s * sampling_length:(s + 1) * sampling_length]) for s in range(0, sampling)] + return list(zip(t_subsampled, v_subsampled)) + + +def to_fahrenheit(celsius): + """Convert Celsius to Fahrenheit.""" + return celsius * 1.8 + 32 + + +def is_admin(): + """ + https://stackoverflow.com/a/19719292 + @return: True if the current user is an 'Admin' whatever that + means (root on Unix), otherwise False. + Warning: The inner function fails unless you have Windows XP SP2 or + higher. The failure causes a traceback to be printed and this + function to return False. + """ + + if os.name == 'nt': + import ctypes + import traceback + # WARNING: requires Windows XP SP2 or higher! + try: + return ctypes.windll.shell32.IsUserAnAdmin() + except Exception as e: + traceback.print_exc() + return False + else: + # Check for root on Posix + return os.getuid() == 0 + + +def key_exist_value_not_none(k, d): + # Return True if: + # - key k exists + # - d[k] is not None + return k in d and d[k] is not None + + +def key_exist_value_not_none_not_v(k, d, v=''): + # Return True if: + # - key k exists + # - d[k] is not None + # - d[k] != v + return k in d and d[k] is not None and d[k] != v + + +def disable(class_name, var): + """Set disable_ to True in the class class_name.""" + setattr(class_name, 'enable_' + var, False) + setattr(class_name, 'disable_' + var, True) + + +def enable(class_name, var): + """Set disable_ to False in the class class_name.""" + setattr(class_name, 'enable_' + var, True) + setattr(class_name, 'disable_' + var, False) + def safe_makedirs(path): """A safe function for creating a directory tree.""" diff --git a/glances/logger.py b/glances/logger.py index 10b2ee7e..f8edaa29 100644 --- a/glances/logger.py +++ b/glances/logger.py @@ -27,8 +27,7 @@ import tempfile import logging import logging.config -from glances.globals import BSD, LINUX, MACOS, SUNOS, WINDOWS, WSL -from glances.globals import safe_makedirs +from glances.globals import BSD, LINUX, MACOS, SUNOS, WINDOWS, WSL, safe_makedirs # Choose the good place for the log file (see issue #1575) # Default root path diff --git a/glances/main.py b/glances/main.py index 8865d264..b418ffb5 100644 --- a/glances/main.py +++ b/glances/main.py @@ -24,9 +24,8 @@ import sys import tempfile from glances import __version__, psutil_version -from glances.compat import input, disable, enable +from glances.globals import WINDOWS, disable, enable from glances.config import Config -from glances.globals import WINDOWS from glances.processes import sort_processes_key_list from glances.logger import logger, LOG_FILENAME diff --git a/glances/outdated.py b/glances/outdated.py index 0b06e1e7..4e1dc29d 100644 --- a/glances/outdated.py +++ b/glances/outdated.py @@ -28,9 +28,8 @@ import os from ssl import CertificateError from glances import __version__ -from glances.compat import nativestr, urlopen, HTTPError, URLError +from glances.globals import nativestr, urlopen, HTTPError, URLError, safe_makedirs from glances.config import user_cache_dir -from glances.globals import safe_makedirs from glances.logger import logger PYPI_API_URL = 'https://pypi.python.org/pypi/Glances/json' diff --git a/glances/outputs/glances_bottle.py b/glances/outputs/glances_bottle.py index 2847b118..bb77cedf 100644 --- a/glances/outputs/glances_bottle.py +++ b/glances/outputs/glances_bottle.py @@ -28,7 +28,7 @@ import webbrowser import zlib import socket -from glances.compat import b +from glances.globals import b from glances.timer import Timer from glances.logger import logger diff --git a/glances/outputs/glances_curses.py b/glances/outputs/glances_curses.py index c956e668..cbc1d710 100644 --- a/glances/outputs/glances_curses.py +++ b/glances/outputs/glances_curses.py @@ -22,8 +22,7 @@ from __future__ import unicode_literals import sys -from glances.compat import nativestr, u, itervalues, enable, disable -from glances.globals import MACOS, WINDOWS +from glances.globals import MACOS, WINDOWS, nativestr, u, itervalues, enable, disable from glances.logger import logger from glances.events import glances_events from glances.processes import glances_processes, sort_processes_key_list diff --git a/glances/outputs/glances_sparklines.py b/glances/outputs/glances_sparklines.py index 5423c953..7224a639 100644 --- a/glances/outputs/glances_sparklines.py +++ b/glances/outputs/glances_sparklines.py @@ -24,7 +24,7 @@ from __future__ import division import sys from math import modf from glances.logger import logger -from glances.compat import nativestr +from glances.globals import nativestr sparklines_module = True diff --git a/glances/outputs/glances_stdout.py b/glances/outputs/glances_stdout.py index c3c1f390..00b89995 100644 --- a/glances/outputs/glances_stdout.py +++ b/glances/outputs/glances_stdout.py @@ -22,7 +22,7 @@ import time from glances.logger import logger -from glances.compat import printandflush +from glances.globals import printandflush class GlancesStdout(object): diff --git a/glances/outputs/glances_stdout_apidoc.py b/glances/outputs/glances_stdout_apidoc.py index eb1e4acc..fba166bb 100644 --- a/glances/outputs/glances_stdout_apidoc.py +++ b/glances/outputs/glances_stdout_apidoc.py @@ -24,7 +24,7 @@ import json import time from glances.logger import logger -from glances.compat import iteritems +from glances.globals import iteritems API_URL = "http://localhost:61208/api/3" diff --git a/glances/outputs/glances_stdout_csv.py b/glances/outputs/glances_stdout_csv.py index 681b71ca..384f9353 100644 --- a/glances/outputs/glances_stdout_csv.py +++ b/glances/outputs/glances_stdout_csv.py @@ -22,7 +22,7 @@ import time from glances.logger import logger -from glances.compat import printandflush +from glances.globals import printandflush class GlancesStdoutCsv(object): diff --git a/glances/outputs/glances_stdout_issue.py b/glances/outputs/glances_stdout_issue.py index 9e363c5a..66fd782e 100644 --- a/glances/outputs/glances_stdout_issue.py +++ b/glances/outputs/glances_stdout_issue.py @@ -24,7 +24,7 @@ import sys import shutil from glances.logger import logger -from glances.compat import printandflush +from glances.globals import printandflush from glances.timer import Counter from glances import __version__, psutil_version diff --git a/glances/password.py b/glances/password.py index e3081f57..949ae820 100644 --- a/glances/password.py +++ b/glances/password.py @@ -26,9 +26,8 @@ import sys import uuid from io import open -from glances.compat import b, input +from glances.globals import b, safe_makedirs from glances.config import user_config_dir -from glances.globals import safe_makedirs from glances.logger import logger diff --git a/glances/plugins/amps/__init__.py b/glances/plugins/amps/__init__.py index ff719297..0f0fcacb 100644 --- a/glances/plugins/amps/__init__.py +++ b/glances/plugins/amps/__init__.py @@ -19,7 +19,7 @@ """Monitor plugin.""" -from glances.compat import iteritems +from glances.globals import iteritems from glances.amps_list import AmpsList as glancesAmpsList from glances.plugins.glances_plugin import GlancesPlugin diff --git a/glances/plugins/cloud/__init__.py b/glances/plugins/cloud/__init__.py index 202c62ca..f62f5413 100644 --- a/glances/plugins/cloud/__init__.py +++ b/glances/plugins/cloud/__init__.py @@ -25,7 +25,7 @@ Supported Cloud API: import threading -from glances.compat import iteritems, to_ascii +from glances.globals import iteritems, to_ascii from glances.plugins.glances_plugin import GlancesPlugin from glances.logger import logger diff --git a/glances/plugins/connections/__init__.py b/glances/plugins/connections/__init__.py index 16b2239c..ec517e7f 100644 --- a/glances/plugins/connections/__init__.py +++ b/glances/plugins/connections/__init__.py @@ -22,7 +22,7 @@ from __future__ import unicode_literals from glances.logger import logger from glances.plugins.glances_plugin import GlancesPlugin -from glances.compat import nativestr +from glances.globals import nativestr import psutil diff --git a/glances/plugins/cpu/__init__.py b/glances/plugins/cpu/__init__.py index b8fed1f7..bd1cfa83 100644 --- a/glances/plugins/cpu/__init__.py +++ b/glances/plugins/cpu/__init__.py @@ -21,9 +21,8 @@ from glances.logger import logger from glances.timer import getTimeSinceLastUpdate -from glances.compat import iterkeys +from glances.globals import LINUX, iterkeys from glances.cpu_percent import cpu_percent -from glances.globals import LINUX from glances.plugins.core import Plugin as CorePlugin from glances.plugins.glances_plugin import GlancesPlugin diff --git a/glances/plugins/diskio/__init__.py b/glances/plugins/diskio/__init__.py index 29365e63..49b02204 100644 --- a/glances/plugins/diskio/__init__.py +++ b/glances/plugins/diskio/__init__.py @@ -20,7 +20,7 @@ """Disk I/O plugin.""" from __future__ import unicode_literals -from glances.compat import nativestr, n +from glances.globals import nativestr, n from glances.timer import getTimeSinceLastUpdate from glances.plugins.glances_plugin import GlancesPlugin from glances.logger import logger diff --git a/glances/plugins/docker/__init__.py b/glances/plugins/docker/__init__.py index b82c9641..918b1755 100644 --- a/glances/plugins/docker/__init__.py +++ b/glances/plugins/docker/__init__.py @@ -25,7 +25,7 @@ import time from copy import deepcopy from glances.logger import logger -from glances.compat import iterkeys, itervalues, nativestr +from glances.globals import iterkeys, itervalues, nativestr from glances.timer import getTimeSinceLastUpdate from glances.plugins.glances_plugin import GlancesPlugin from glances.processes import sort_stats as sort_stats_processes, weighted, glances_processes diff --git a/glances/plugins/folders/__init__.py b/glances/plugins/folders/__init__.py index 8efddadc..c267c843 100644 --- a/glances/plugins/folders/__init__.py +++ b/glances/plugins/folders/__init__.py @@ -22,7 +22,7 @@ from __future__ import unicode_literals import numbers -from glances.compat import nativestr +from glances.globals import nativestr from glances.folder_list import FolderList as glancesFolderList from glances.plugins.glances_plugin import GlancesPlugin from glances.logger import logger diff --git a/glances/plugins/fs/__init__.py b/glances/plugins/fs/__init__.py index d1cc313f..ec954b41 100644 --- a/glances/plugins/fs/__init__.py +++ b/glances/plugins/fs/__init__.py @@ -22,7 +22,7 @@ from __future__ import unicode_literals import operator -from glances.compat import u, nativestr, PermissionError +from glances.globals import u, nativestr, PermissionError from glances.plugins.glances_plugin import GlancesPlugin import psutil diff --git a/glances/plugins/glances_plugin.py b/glances/plugins/glances_plugin.py index 44067311..8ef718b3 100644 --- a/glances/plugins/glances_plugin.py +++ b/glances/plugins/glances_plugin.py @@ -28,7 +28,7 @@ import json import copy from operator import itemgetter -from glances.compat import iterkeys, itervalues, listkeys, map, mean, nativestr +from glances.globals import iterkeys, itervalues, listkeys, mean, nativestr from glances.actions import GlancesActions from glances.history import GlancesHistory from glances.logger import logger diff --git a/glances/plugins/glances_sensors.py b/glances/plugins/glances_sensors.py index 017cbda1..e9c5e290 100644 --- a/glances/plugins/glances_sensors.py +++ b/glances/plugins/glances_sensors.py @@ -23,7 +23,7 @@ import psutil import warnings from glances.logger import logger -from glances.compat import iteritems, to_fahrenheit +from glances.globals import iteritems, to_fahrenheit from glances.timer import Counter from glances.plugins.sensors.glances_batpercent import Plugin as BatPercentPlugin from glances.plugins.sensors.glances_hddtemp import Plugin as HddTempPlugin diff --git a/glances/plugins/gpu/__init__.py b/glances/plugins/gpu/__init__.py index dbfff387..e3b3ad13 100644 --- a/glances/plugins/gpu/__init__.py +++ b/glances/plugins/gpu/__init__.py @@ -19,7 +19,7 @@ """GPU plugin (limited to NVIDIA chipsets).""" -from glances.compat import nativestr, to_fahrenheit +from glances.globals import nativestr, to_fahrenheit from glances.logger import logger from glances.plugins.glances_plugin import GlancesPlugin diff --git a/glances/plugins/ip/__init__.py b/glances/plugins/ip/__init__.py index a4aae49f..c13a43c7 100644 --- a/glances/plugins/ip/__init__.py +++ b/glances/plugins/ip/__init__.py @@ -22,7 +22,7 @@ import threading from json import loads -from glances.compat import iterkeys, urlopen, queue +from glances.globals import iterkeys, urlopen, queue from glances.logger import logger from glances.timer import Timer from glances.plugins.glances_plugin import GlancesPlugin diff --git a/glances/plugins/load/__init__.py b/glances/plugins/load/__init__.py index 740c1a29..0e570c5b 100644 --- a/glances/plugins/load/__init__.py +++ b/glances/plugins/load/__init__.py @@ -22,7 +22,7 @@ import os import psutil -from glances.compat import iteritems +from glances.globals import iteritems from glances.plugins.core import Plugin as CorePlugin from glances.plugins.glances_plugin import GlancesPlugin from glances.logger import logger diff --git a/glances/plugins/mem/__init__.py b/glances/plugins/mem/__init__.py index b35f5d46..ef2a334e 100644 --- a/glances/plugins/mem/__init__.py +++ b/glances/plugins/mem/__init__.py @@ -20,7 +20,7 @@ """Virtual memory plugin.""" from glances.logger import logger -from glances.compat import iterkeys +from glances.globals import iterkeys from glances.plugins.glances_plugin import GlancesPlugin import psutil diff --git a/glances/plugins/memswap/__init__.py b/glances/plugins/memswap/__init__.py index d305d0c3..6784a431 100644 --- a/glances/plugins/memswap/__init__.py +++ b/glances/plugins/memswap/__init__.py @@ -19,7 +19,7 @@ """Swap memory plugin.""" -from glances.compat import iterkeys +from glances.globals import iterkeys from glances.timer import getTimeSinceLastUpdate from glances.plugins.glances_plugin import GlancesPlugin diff --git a/glances/plugins/network/__init__.py b/glances/plugins/network/__init__.py index 46d19261..ecb29e40 100644 --- a/glances/plugins/network/__init__.py +++ b/glances/plugins/network/__init__.py @@ -24,7 +24,7 @@ import base64 from glances.timer import getTimeSinceLastUpdate from glances.plugins.glances_plugin import GlancesPlugin -from glances.compat import n +from glances.globals import n from glances.logger import logger import psutil diff --git a/glances/plugins/ports/__init__.py b/glances/plugins/ports/__init__.py index cd36dc15..33356983 100644 --- a/glances/plugins/ports/__init__.py +++ b/glances/plugins/ports/__init__.py @@ -26,11 +26,10 @@ import socket import time import numbers -from glances.globals import WINDOWS, MACOS, BSD +from glances.globals import WINDOWS, MACOS, BSD, bool_type from glances.ports_list import GlancesPortsList from glances.web_list import GlancesWebList from glances.timer import Timer, Counter -from glances.compat import bool_type from glances.logger import logger from glances.plugins.glances_plugin import GlancesPlugin diff --git a/glances/plugins/processlist/__init__.py b/glances/plugins/processlist/__init__.py index 5bd6f681..cab5b3c6 100644 --- a/glances/plugins/processlist/__init__.py +++ b/glances/plugins/processlist/__init__.py @@ -23,8 +23,7 @@ import os import copy from glances.logger import logger -from glances.globals import WINDOWS -from glances.compat import key_exist_value_not_none_not_v +from glances.globals import WINDOWS, key_exist_value_not_none_not_v from glances.processes import glances_processes, sort_stats from glances.plugins.core import Plugin as CorePlugin from glances.plugins.glances_plugin import GlancesPlugin diff --git a/glances/plugins/raid/__init__.py b/glances/plugins/raid/__init__.py index 795812e7..ce6aab4b 100644 --- a/glances/plugins/raid/__init__.py +++ b/glances/plugins/raid/__init__.py @@ -19,7 +19,7 @@ """RAID plugin.""" -from glances.compat import iterkeys +from glances.globals import iterkeys from glances.logger import logger from glances.plugins.glances_plugin import GlancesPlugin diff --git a/glances/plugins/sensors/glances_hddtemp.py b/glances/plugins/sensors/glances_hddtemp.py index cf192915..402ab7f1 100644 --- a/glances/plugins/sensors/glances_hddtemp.py +++ b/glances/plugins/sensors/glances_hddtemp.py @@ -22,7 +22,7 @@ import os import socket -from glances.compat import nativestr, range +from glances.globals import nativestr from glances.logger import logger from glances.plugins.glances_plugin import GlancesPlugin diff --git a/glances/plugins/smart/__init__.py b/glances/plugins/smart/__init__.py index 29f8d087..f4c01366 100644 --- a/glances/plugins/smart/__init__.py +++ b/glances/plugins/smart/__init__.py @@ -47,7 +47,7 @@ If smartmontools is not installed, we should catch the error upstream in plugin from glances.plugins.glances_plugin import GlancesPlugin from glances.logger import logger from glances.main import disable -from glances.compat import is_admin +from glances.globals import is_admin # Import plugin specific dependency try: diff --git a/glances/plugins/system/__init__.py b/glances/plugins/system/__init__.py index e93b6e04..56ed5862 100644 --- a/glances/plugins/system/__init__.py +++ b/glances/plugins/system/__init__.py @@ -25,7 +25,7 @@ import re from io import open from glances.logger import logger -from glances.compat import iteritems +from glances.globals import iteritems from glances.plugins.glances_plugin import GlancesPlugin # SNMP OID diff --git a/glances/plugins/wifi/__init__.py b/glances/plugins/wifi/__init__.py index f78fa5c0..9b590df7 100644 --- a/glances/plugins/wifi/__init__.py +++ b/glances/plugins/wifi/__init__.py @@ -21,7 +21,7 @@ import operator -from glances.compat import nativestr +from glances.globals import nativestr from glances.logger import logger from glances.plugins.glances_plugin import GlancesPlugin diff --git a/glances/ports_list.py b/glances/ports_list.py index 2c16bf1f..c1ead62f 100644 --- a/glances/ports_list.py +++ b/glances/ports_list.py @@ -19,7 +19,6 @@ """Manage the Glances ports list (Ports plugin).""" -from glances.compat import range from glances.logger import logger from glances.globals import BSD diff --git a/glances/processes.py b/glances/processes.py index 7b6f2137..e47fc82b 100644 --- a/glances/processes.py +++ b/glances/processes.py @@ -19,8 +19,7 @@ import os -from glances.compat import iterkeys -from glances.globals import BSD, LINUX, MACOS, WINDOWS +from glances.globals import BSD, LINUX, MACOS, WINDOWS, iterkeys from glances.timer import Timer, getTimeSinceLastUpdate from glances.filter import GlancesFilter from glances.logger import logger diff --git a/glances/secure.py b/glances/secure.py index 36af5e16..aa2e4af0 100644 --- a/glances/secure.py +++ b/glances/secure.py @@ -19,7 +19,7 @@ """Secures functions for Glances""" -from glances.compat import nativestr +from glances.globals import nativestr from subprocess import Popen, PIPE diff --git a/glances/server.py b/glances/server.py index 1a7a0f2a..301d7267 100644 --- a/glances/server.py +++ b/glances/server.py @@ -25,7 +25,7 @@ import sys from base64 import b64decode from glances import __version__ -from glances.compat import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer, Server +from glances.globals import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer, Server from glances.autodiscover import GlancesAutoDiscoverClient from glances.logger import logger from glances.stats_server import GlancesStatsServer diff --git a/glances/static_list.py b/glances/static_list.py index 0a14f6ed..6260b1af 100644 --- a/glances/static_list.py +++ b/glances/static_list.py @@ -21,7 +21,6 @@ from socket import gaierror, gethostbyname -from glances.compat import range from glances.logger import logger diff --git a/glances/stats_client_snmp.py b/glances/stats_client_snmp.py index 30acd9a8..142ab14c 100644 --- a/glances/stats_client_snmp.py +++ b/glances/stats_client_snmp.py @@ -22,7 +22,7 @@ import re from glances.stats import GlancesStats -from glances.compat import iteritems +from glances.globals import iteritems from glances.logger import logger # SNMP OID regexp pattern to short system name dict diff --git a/glances/web_list.py b/glances/web_list.py index ae852ade..56fb5cab 100644 --- a/glances/web_list.py +++ b/glances/web_list.py @@ -19,7 +19,7 @@ """Manage the Glances web/url list (Ports plugin).""" -from glances.compat import range, urlparse +from glances.globals import urlparse from glances.logger import logger @@ -97,17 +97,17 @@ class GlancesWebList(object): # Indice new_web['indice'] = 'web_' + str(i) - + # ssl_verify - new_web['ssl_verify'] = config.get_value(self._section, + new_web['ssl_verify'] = config.get_value(self._section, '%sssl_verify' % postfix, default=True) # Proxy - http_proxy = config.get_value(self._section, + http_proxy = config.get_value(self._section, '%shttp_proxy' % postfix, default=None) - - https_proxy = config.get_value(self._section, + + https_proxy = config.get_value(self._section, '%shttps_proxy' % postfix, default=None) diff --git a/unitest-restful.py b/unitest-restful.py index 8e9b8655..b6e5332a 100755 --- a/unitest-restful.py +++ b/unitest-restful.py @@ -28,7 +28,7 @@ import numbers import unittest from glances import __version__ -from glances.compat import text_type +from glances.globals import text_type import requests diff --git a/unitest-xmlrpc.py b/unitest-xmlrpc.py index 69918047..581bc38a 100755 --- a/unitest-xmlrpc.py +++ b/unitest-xmlrpc.py @@ -28,7 +28,7 @@ import time import unittest from glances import __version__ -from glances.compat import ServerProxy +from glances.globals import ServerProxy SERVER_PORT = 61234 URL = "http://localhost:%s" % SERVER_PORT diff --git a/unitest.py b/unitest.py index 2543dc73..f924995a 100755 --- a/unitest.py +++ b/unitest.py @@ -26,7 +26,7 @@ import unittest from glances.main import GlancesMain from glances.stats import GlancesStats from glances import __version__ -from glances.globals import WINDOWS, LINUX +from glances.globals import WINDOWS, LINUX, subsample from glances.outputs.glances_bars import Bar from glances.thresholds import GlancesThresholdOk from glances.thresholds import GlancesThresholdCareful @@ -34,7 +34,6 @@ from glances.thresholds import GlancesThresholdWarning from glances.thresholds import GlancesThresholdCritical from glances.thresholds import GlancesThresholds from glances.plugins.glances_plugin import GlancesPlugin -from glances.compat import subsample, range from glances.secure import secure_popen # Global variables @@ -257,7 +256,7 @@ class TestGlances(unittest.TestCase): def test_016_hddsmart(self): """Check hard disk SMART data plugin.""" try: - from glances.compat import is_admin + from glances.globals import is_admin except ImportError: print("INFO: [TEST_016] pySMART not found, not running SMART plugin test") return