diff options
author | nicolargo <nicolas@nicolargo.com> | 2021-09-04 09:39:17 +0200 |
---|---|---|
committer | nicolargo <nicolas@nicolargo.com> | 2021-09-04 09:39:17 +0200 |
commit | 64eab612a32ec9ad008db47e330b8b2ed5c82688 (patch) | |
tree | c8d8e8d23e229a4aa4a124f4fbf2b89ec3ccc935 | |
parent | d80a9cf229e84b9e15320b2e90689d7091b87e9f (diff) |
Plugin sensors and main plugin OK
38 files changed, 385 insertions, 386 deletions
diff --git a/glances/plugins/alert/__init__.py b/glances/plugins/alert/__init__.py index cdf57706..b92646a0 100644 --- a/glances/plugins/alert/__init__.py +++ b/glances/plugins/alert/__init__.py @@ -25,7 +25,7 @@ from glances.logger import logger from glances.events import glances_events from glances.thresholds import glances_thresholds # from glances.logger import logger -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin # Static decision tree for the global alert message # - msg: Message to be displayed (result of the decision tree) diff --git a/glances/plugins/amps/__init__.py b/glances/plugins/amps/__init__.py index 0f0fcacb..d33339e7 100644 --- a/glances/plugins/amps/__init__.py +++ b/glances/plugins/amps/__init__.py @@ -21,7 +21,7 @@ from glances.globals import iteritems from glances.amps_list import AmpsList as glancesAmpsList -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin class Plugin(GlancesPlugin): diff --git a/glances/plugins/cloud/__init__.py b/glances/plugins/cloud/__init__.py index f62f5413..2743ded8 100644 --- a/glances/plugins/cloud/__init__.py +++ b/glances/plugins/cloud/__init__.py @@ -26,7 +26,7 @@ Supported Cloud API: import threading from glances.globals import iteritems, to_ascii -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin from glances.logger import logger # Import plugin specific dependency diff --git a/glances/plugins/connections/__init__.py b/glances/plugins/connections/__init__.py index ec517e7f..6417fbac 100644 --- a/glances/plugins/connections/__init__.py +++ b/glances/plugins/connections/__init__.py @@ -21,7 +21,7 @@ from __future__ import unicode_literals from glances.logger import logger -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin from glances.globals import nativestr import psutil diff --git a/glances/plugins/core/__init__.py b/glances/plugins/core/__init__.py index 5a56ac75..0e309f4e 100644 --- a/glances/plugins/core/__init__.py +++ b/glances/plugins/core/__init__.py @@ -19,7 +19,7 @@ """CPU core plugin.""" -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin import psutil diff --git a/glances/plugins/cpu/__init__.py b/glances/plugins/cpu/__init__.py index bd1cfa83..8410150c 100644 --- a/glances/plugins/cpu/__init__.py +++ b/glances/plugins/cpu/__init__.py @@ -24,7 +24,7 @@ from glances.timer import getTimeSinceLastUpdate from glances.globals import LINUX, iterkeys from glances.cpu_percent import cpu_percent from glances.plugins.core import Plugin as CorePlugin -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin import psutil diff --git a/glances/plugins/diskio/__init__.py b/glances/plugins/diskio/__init__.py index 0b101b84..ab2aabf5 100644 --- a/glances/plugins/diskio/__init__.py +++ b/glances/plugins/diskio/__init__.py @@ -22,7 +22,7 @@ from __future__ import unicode_literals from glances.globals import nativestr from glances.timer import getTimeSinceLastUpdate -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin from glances.logger import logger import psutil diff --git a/glances/plugins/folders/__init__.py b/glances/plugins/folders/__init__.py index c267c843..0313ae54 100644 --- a/glances/plugins/folders/__init__.py +++ b/glances/plugins/folders/__init__.py @@ -24,7 +24,7 @@ import numbers from glances.globals import nativestr from glances.folder_list import FolderList as glancesFolderList -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin from glances.logger import logger diff --git a/glances/plugins/fs/__init__.py b/glances/plugins/fs/__init__.py index ec954b41..fc5b5c7e 100644 --- a/glances/plugins/fs/__init__.py +++ b/glances/plugins/fs/__init__.py @@ -23,7 +23,7 @@ from __future__ import unicode_literals import operator from glances.globals import u, nativestr, PermissionError -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin import psutil diff --git a/glances/plugins/glances_docker/__init__.py b/glances/plugins/glances_docker/__init__.py index 918b1755..0ecba25f 100644 --- a/glances/plugins/glances_docker/__init__.py +++ b/glances/plugins/glances_docker/__init__.py @@ -27,7 +27,7 @@ from copy import deepcopy from glances.logger import logger from glances.globals import iterkeys, itervalues, nativestr from glances.timer import getTimeSinceLastUpdate -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin from glances.processes import sort_stats as sort_stats_processes, weighted, glances_processes # Docker-py library (optional and Linux-only) diff --git a/glances/plugins/glances_sensors.py b/glances/plugins/glances_sensors.py deleted file mode 100644 index e9c5e290..00000000 --- a/glances/plugins/glances_sensors.py +++ /dev/null @@ -1,351 +0,0 @@ -# -*- coding: utf-8 -*- -# -# This file is part of Glances. -# -# Copyright (C) 2019 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/>. - -"""Sensors plugin.""" - -import psutil -import warnings - -from glances.logger import logger -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 -from glances.plugins.glances_plugin import GlancesPlugin - -SENSOR_TEMP_UNIT = 'C' -SENSOR_FAN_UNIT = 'R' - - -class Plugin(GlancesPlugin): - """Glances sensors plugin. - - The stats list includes both sensors and hard disks stats, if any. - The sensors are already grouped by chip type and then sorted by name. - The hard disks are already sorted by name. - """ - - def __init__(self, args=None, config=None): - """Init the plugin.""" - super(Plugin, self).__init__(args=args, - config=config, - stats_init_value=[]) - - start_duration = Counter() - - # Init the sensor class - start_duration.reset() - self.glancesgrabsensors = GlancesGrabSensors() - logger.debug("Generic sensor plugin init duration: {} seconds".format(start_duration.get())) - - # Instance for the HDDTemp Plugin in order to display the hard disks - # temperatures - start_duration.reset() - self.hddtemp_plugin = HddTempPlugin(args=args, config=config) - logger.debug("HDDTemp sensor plugin init duration: {} seconds".format(start_duration.get())) - - # Instance for the BatPercent in order to display the batteries - # capacities - start_duration.reset() - self.batpercent_plugin = BatPercentPlugin(args=args, config=config) - logger.debug("Battery sensor plugin init duration: {} seconds".format(start_duration.get())) - - # We want to display the stat in the curse interface - self.display_curse = True - - # Not necessary to refresh every refresh time - # By default set to refresh * 2 - if self.get_refresh() == args.time: - self.set_refresh(self.get_refresh() * 2) - - def get_key(self): - """Return the key of the list.""" - return 'label' - - @GlancesPlugin._check_decorator - @GlancesPlugin._log_result_decorator - def update(self): - """Update sensors stats using the input method.""" - # Init new stats - stats = self.get_init_value() - - if self.input_method == 'local': - # Update stats using the dedicated lib - stats = [] - # Get the temperature - try: - temperature = self.__set_type(self.glancesgrabsensors.get('temperature_core'), - 'temperature_core') - except Exception as e: - logger.error("Cannot grab sensors temperatures (%s)" % e) - else: - # Append temperature - stats.extend(temperature) - # Get the FAN speed - try: - fan_speed = self.__set_type(self.glancesgrabsensors.get('fan_speed'), - 'fan_speed') - except Exception as e: - logger.error("Cannot grab FAN speed (%s)" % e) - else: - # Append FAN speed - stats.extend(fan_speed) - # Update HDDtemp stats - try: - hddtemp = self.__set_type(self.hddtemp_plugin.update(), - 'temperature_hdd') - except Exception as e: - logger.error("Cannot grab HDD temperature (%s)" % e) - else: - # Append HDD temperature - stats.extend(hddtemp) - # Update batteries stats - try: - batpercent = self.__set_type(self.batpercent_plugin.update(), - 'battery') - except Exception as e: - logger.error("Cannot grab battery percent (%s)" % e) - else: - # Append Batteries % - stats.extend(batpercent) - - elif self.input_method == 'snmp': - # Update stats using SNMP - # No standard: - # http://www.net-snmp.org/wiki/index.php/Net-SNMP_and_lm-sensors_on_Ubuntu_10.04 - - pass - - # Global change on stats - self.stats = self.get_init_value() - for stat in stats: - # Do not take hide stat into account - if self.is_hide(stat["label"].lower()): - continue - # Set the alias for each stat - alias = self.has_alias(stat["label"].lower()) - if alias: - stat["label"] = alias - # Update the stats - self.stats.append(stat) - - return self.stats - - def __set_type(self, stats, sensor_type): - """Set the plugin type. - - 4 types of stats is possible in the sensors plugin: - - Core temperature: 'temperature_core' - - Fan speed: 'fan_speed' - - HDD temperature: 'temperature_hdd' - - Battery capacity: 'battery' - """ - for i in stats: - # Set the sensors type - i.update({'type': sensor_type}) - # also add the key name - i.update({'key': self.get_key()}) - - return stats - - def update_views(self): - """Update stats views.""" - # Call the father's method - super(Plugin, self).update_views() - - # Add specifics informations - # Alert - for i in self.stats: - if not i['value']: - continue - # Alert processing - if i['type'] == 'temperature_core' and not self.is_limit('critical', stat_name=i['type']): - if i['critical'] is None: - alert = 'DEFAULT' - elif i['value'] >= i['critical']: - alert = 'CRITICAL' - elif i['warning'] is None: - alert = 'DEFAULT' - elif i['value'] >= i['warning']: - alert = 'WARNING' - else: - alert = 'OK' - elif i['type'] == 'battery': - alert = self.get_alert(current=100 - i['value'], - header=i['type']) - else: - alert = self.get_alert(current=i['value'], - header=i['type']) - # Set the alert in the view - self.views[i[self.get_key()]]['value']['decoration'] = alert - - def msg_curse(self, args=None, max_width=None): - """Return the dict to display in the curse interface.""" - # Init the return message - ret = [] - - # Only process if stats exist and display plugin enable... - if not self.stats or self.is_disable(): - return ret - - # Max size for the interface name - name_max_width = max_width - 12 - - # Header - msg = '{:{width}}'.format('SENSORS', width=name_max_width) - ret.append(self.curse_add_line(msg, "TITLE")) - - # Stats - for i in self.stats: - # Do not display anything if no battery are detected - if i['type'] == 'battery' and i['value'] == []: - continue - # New line - ret.append(self.curse_new_line()) - msg = '{:{width}}'.format(i["label"][:name_max_width], - width=name_max_width) - ret.append(self.curse_add_line(msg)) - if i['value'] in (b'ERR', b'SLP', b'UNK', b'NOS'): - msg = '{:>13}'.format(i['value']) - ret.append(self.curse_add_line( - msg, self.get_views(item=i[self.get_key()], - key='value', - option='decoration'))) - else: - if (args.fahrenheit and i['type'] != 'battery' and - i['type'] != 'fan_speed'): - value = to_fahrenheit(i['value']) - unit = 'F' - else: - value = i['value'] - unit = i['unit'] - try: - msg = '{:>13.0f}{}'.format(value, unit) - ret.append(self.curse_add_line( - msg, self.get_views(item=i[self.get_key()], - key='value', - option='decoration'))) - except (TypeError, ValueError): - pass - - return ret - - -class GlancesGrabSensors(object): - """Get sensors stats.""" - - def __init__(self): - """Init sensors stats.""" - # Temperatures - self.init_temp = False - self.stemps = {} - try: - # psutil>=5.1.0, Linux-only - self.stemps = psutil.sensors_temperatures() - except AttributeError: - logger.debug("Cannot grab temperatures. Platform not supported.") - else: - self.init_temp = True - # Solve an issue #1203 concerning a RunTimeError warning message displayed - # in the curses interface. - warnings.filterwarnings("ignore") - - # Fans - self.init_fan = False - self.sfans = {} - try: - # psutil>=5.2.0, Linux-only - self.sfans = psutil.sensors_fans() - except AttributeError: - logger.debug("Cannot grab fans speed. Platform not supported.") - else: - self.init_fan = True - - # Init the stats - self.reset() - - def reset(self): - """Reset/init the stats.""" - self.sensors_list = [] - - def __update__(self): - """Update the stats.""" - # Reset the list - self.reset() - - if not self.init_temp: - return self.sensors_list - - # Temperatures sensors - self.sensors_list.extend(self.build_sensors_list(SENSOR_TEMP_UNIT)) - - # Fans sensors - self.sensors_list.extend(self.build_sensors_list(SENSOR_FAN_UNIT)) - - return self.sensors_list - - def build_sensors_list(self, type): - """Build the sensors list depending of the type. - - type: SENSOR_TEMP_UNIT or SENSOR_FAN_UNIT - - output: a list - """ - ret = [] - if type == SENSOR_TEMP_UNIT and self.init_temp: - input_list = self.stemps - self.stemps = psutil.sensors_temperatures() - elif type == SENSOR_FAN_UNIT and self.init_fan: - input_list = self.sfans - self.sfans = psutil.sensors_fans() - else: - return ret - for chipname, chip in iteritems(input_list): - i = 1 - for feature in chip: - sensors_current = {} - # Sensor name - if feature.label == '': - sensors_current['label'] = chipname + ' ' + str(i) - else: - sensors_current['label'] = feature.label - # Sensors value, limit and unit - sensors_current['value'] = int(getattr(feature, 'current', 0) if getattr(feature, 'current', 0) else 0) - warning = getattr(feature, 'high', None) - sensors_current['warning'] = int(warning) if warning is not None else None - critical = getattr(feature, 'critical', None) - sensors_current['critical'] = int(critical) if critical is not None else None - sensors_current['unit'] = type - # Add sensor to the list - ret.append(sensors_current) - i += 1 - return ret - - def get(self, sensor_type='temperature_core'): - """Get sensors list.""" - self.__update__() - if sensor_type == 'temperature_core': - ret = [s for s in self.sensors_list if s['unit'] == SENSOR_TEMP_UNIT] - elif sensor_type == 'fan_speed': - ret = [s for s in self.sensors_list if s['unit'] == SENSOR_FAN_UNIT] - else: - # Unknown type - logger.debug("Unknown sensor type %s" % sensor_type) - ret = [] - return ret diff --git a/glances/plugins/gpu/__init__.py b/glances/plugins/gpu/__init__.py index e3b3ad13..1aea937e 100644 --- a/glances/plugins/gpu/__init__.py +++ b/glances/plugins/gpu/__init__.py @@ -21,7 +21,7 @@ from glances.globals import nativestr, to_fahrenheit from glances.logger import logger -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin # In Glances 3.1.4 or higher, we use the py3nvml lib (see issue #1523) try: diff --git a/glances/plugins/help/__init__.py b/glances/plugins/help/__init__.py index 3bea6c20..de5ceef6 100644 --- a/glances/plugins/help/__init__.py +++ b/glances/plugins/help/__init__.py @@ -24,7 +24,7 @@ Just a stupid plugin to display the help screen. """ from glances import __version__, psutil_version -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin class Plugin(GlancesPlugin): diff --git a/glances/plugins/ip/__init__.py b/glances/plugins/ip/__init__.py index c13a43c7..cd056685 100644 --- a/glances/plugins/ip/__init__.py +++ b/glances/plugins/ip/__init__.py @@ -25,7 +25,7 @@ from json import loads from glances.globals import iterkeys, urlopen, queue from glances.logger import logger from glances.timer import Timer -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin # Import plugin specific dependency try: diff --git a/glances/plugins/irq/__init__.py b/glances/plugins/irq/__init__.py index 7f666df7..3f66b55e 100644 --- a/glances/plugins/irq/__init__.py +++ b/glances/plugins/irq/__init__.py @@ -24,7 +24,7 @@ import operator from glances.globals import LINUX from glances.timer import getTimeSinceLastUpdate -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin class Plugin(GlancesPlugin): diff --git a/glances/plugins/load/__init__.py b/glances/plugins/load/__init__.py index 0e570c5b..f7c3af70 100644 --- a/glances/plugins/load/__init__.py +++ b/glances/plugins/load/__init__.py @@ -24,7 +24,7 @@ import psutil from glances.globals import iteritems from glances.plugins.core import Plugin as CorePlugin -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin from glances.logger import logger # Fields description diff --git a/glances/plugins/mem/__init__.py b/glances/plugins/mem/__init__.py index ef2a334e..97d4f7e4 100644 --- a/glances/plugins/mem/__init__.py +++ b/glances/plugins/mem/__init__.py @@ -21,7 +21,7 @@ from glances.logger import logger from glances.globals import iterkeys -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin import psutil diff --git a/glances/plugins/memswap/__init__.py b/glances/plugins/memswap/__init__.py index 6784a431..309436c7 100644 --- a/glances/plugins/memswap/__init__.py +++ b/glances/plugins/memswap/__init__.py @@ -21,7 +21,7 @@ from glances.globals import iterkeys from glances.timer import getTimeSinceLastUpdate -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin import psutil diff --git a/glances/plugins/network/__init__.py b/glances/plugins/network/__init__.py index 1fe2c74b..eb61f447 100644 --- a/glances/plugins/network/__init__.py +++ b/glances/plugins/network/__init__.py @@ -23,7 +23,7 @@ from __future__ import unicode_literals import base64 from glances.timer import getTimeSinceLastUpdate -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin from glances.logger import logger import psutil diff --git a/glances/plugins/now/__init__.py b/glances/plugins/now/__init__.py index f3bbe918..47d2549e 100644 --- a/glances/plugins/now/__init__.py +++ b/glances/plugins/now/__init__.py @@ -20,7 +20,7 @@ """Now (current date) plugin.""" from time import tzname, strftime -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin class Plugin(GlancesPlugin): diff --git a/glances/plugins/percpu/__init__.py b/glances/plugins/percpu/__init__.py index f16fb9e3..4f5bddef 100644 --- a/glances/plugins/percpu/__init__.py +++ b/glances/plugins/percpu/__init__.py @@ -20,7 +20,7 @@ """Per-CPU plugin.""" from glances.cpu_percent import cpu_percent -from glances.plugins.glances_plugin import GlancesPlugin +from glances.plugins.plugin import GlancesPlugin # Define the history items list items_history_list = [{'name': 'user', |