diff --git a/NEWS b/NEWS index 24298846..7ecc1530 100644 --- a/NEWS +++ b/NEWS @@ -2,12 +2,13 @@ Glances Version 2.x ============================================================================== -Version 2.X +Version 2.3 =========== + * Add actions on alerts (issue #132). It is now possible to run action (command line) by triggers. Action could containq {Mustache} {{tag}} (Mustache) with stat value. * Add InfluxDB export module (--export-influxdb) (issue #455) * Add Statsd export module (--export-statsd) (issue #465) - * Refactor export module (CSV export option is now --export-csv). It is now possible to export stats from the Glances client (issue #463) + * Refactor export module (CSV export option is now --export-csv). It is now possible to export stats from the Glances client mode (issue #463) * The Web inteface is now based on BootStarp / RWD grid (issue #417, #366 and #461) Thanks to Nicolas Hart @nclsHart * Add the RAID plugins (issue #447) diff --git a/conf/glances-test.conf b/conf/glances-test.conf index 0e141fe2..4a804eea 100644 --- a/conf/glances-test.conf +++ b/conf/glances-test.conf @@ -3,6 +3,7 @@ user_careful=50 user_warning=70 user_critical=90 +user_critical_action=echo {{user}} {{value}} {{max}} > /tmp/cpu.alert iowait_careful=50 iowait_warning=70 iowait_critical=90 @@ -71,13 +72,14 @@ hide=sda2,sda5 # Default limits for free filesytem space in % # Default values if not defined: 50/70/90 careful=50 +careful_action=echo {{mnt_point}} {{used}}/{{size}} > /tmp/fs.alert warning=70 critical=90 [sensors] # Sensors core limits # Default values if not defined: 60/70/80 -temperature_core_careful=60 +temperature_core_careful=50 temperature_core_warning=70 temperature_core_critical=80 # Temperatures in °C for hddtemp diff --git a/conf/glances.conf b/conf/glances.conf index c8378e98..f3df2a25 100644 --- a/conf/glances.conf +++ b/conf/glances.conf @@ -70,6 +70,8 @@ critical=90 [fs] # Default limits for free filesytem space in % # Default values if not defined: 50/70/90 +# It is also possible to define per mount point value +# Example: /_careful=40 careful=50 warning=70 critical=90 diff --git a/docs/glances-doc.rst b/docs/glances-doc.rst index a3a267ce..9ae0929f 100644 --- a/docs/glances-doc.rst +++ b/docs/glances-doc.rst @@ -4,9 +4,9 @@ Glances This manual describes *Glances* version 2.2. -Copyright © 2012-2014 Nicolas Hennion +Copyright © 2011-2015 Nicolas Hennion -December 2014 +Junuary 2015 .. contents:: Table of Contents @@ -671,6 +671,26 @@ Each alert message displays the following information: 4. {min,avg,max} values or number of running processes for monitored processes list alerts +Actions +------- + +Glances can trigger actions on events. + +By action, we mean all shell command line. For example, if you want to execute the foo.py script if the last 5 minutes load are critical then add the action line to the Glances configuration file: + + [load] + critical=5.0 + critical_action=python /path/to/foo.py + +All the stats are usable in the command line by the use of the {{mustache}} syntax. Another example to create a log file containing used vs total disk space if a warning space trigger is reached: + +[fs] +warning=70 +warning_action=echo {{mnt_point}} {{used}}/{{size}} > /tmp/fs.alert + +Note: You can use all the stats for the current plugin (see https://github.com/nicolargo/glances/wiki/The-Glances-2.x-API-How-to for the stats list) + + Gateway to others services ========================== diff --git a/glances/__init__.py b/glances/__init__.py index c5c0200f..7b14b3f3 100644 --- a/glances/__init__.py +++ b/glances/__init__.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/__main__.py b/glances/__main__.py index 9aeb86f2..871dea89 100644 --- a/glances/__main__.py +++ b/glances/__main__.py @@ -3,7 +3,7 @@ # # Glances - An eye on your system # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_actions.py b/glances/core/glances_actions.py new file mode 100644 index 00000000..6069e0e8 --- /dev/null +++ b/glances/core/glances_actions.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Glances. +# +# Copyright (C) 2015 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 . + +"""Manage on alert actions.""" + +# Import system lib +from subprocess import Popen +import pystache + +# Import Glances lib +from glances.core.glances_logging import logger + + +class GlancesActions(object): + + """This class manage action if an alert is reached""" + + def __init__(self): + """Init GlancesActions class""" + + # Dict with the criticity status + # - key: stat_name + # - value: criticity + # Goal: avoid to execute the same command twice + self.status = {} + + def get(self, stat_name): + """Get the stat_name criticity""" + try: + return self.status[stat_name] + except KeyError: + return None + + def set(self, stat_name, criticity): + """Set the stat_name to criticity""" + self.status[stat_name] = criticity + + def run(self, stat_name, criticity, commands, mustache_dict=None): + """Run the commands (in background) + - stats_name: plugin_name (+ header) + - criticity: criticity of the trigger + - commands: a list of command line with optional {{mustache}} + - mustache_dict: Plugin stats (can be use within {{mustache}}) + + Return True if the commands have been ran""" + + if self.get(stat_name) == criticity: + # Action already executed => Exit + return False + + # Ran all actions in background + for cmd in commands: + # Replace {{arg}} by the dict one (Thk to {Mustache}) + cmd_full = pystache.render(cmd, mustache_dict) + # Execute the action + logger.info("Action triggered for {0} ({1}): {2}".format(stat_name, criticity, cmd_full)) + logger.debug("Stats value for the trigger: {0}".format(mustache_dict)) + try: + Popen(cmd_full, shell=True) + except OSError as e: + logger.error("Can't execute the action ({0})".format(e)) + + self.set(stat_name, criticity) + + return True diff --git a/glances/core/glances_autodiscover.py b/glances/core/glances_autodiscover.py index 62d627b1..f9659f08 100644 --- a/glances/core/glances_autodiscover.py +++ b/glances/core/glances_autodiscover.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_client.py b/glances/core/glances_client.py index a903cf4d..755b88c0 100644 --- a/glances/core/glances_client.py +++ b/glances/core/glances_client.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_client_browser.py b/glances/core/glances_client_browser.py index e54c0849..a198399b 100644 --- a/glances/core/glances_client_browser.py +++ b/glances/core/glances_client_browser.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_config.py b/glances/core/glances_config.py index 2b690836..935f08e3 100644 --- a/glances/core/glances_config.py +++ b/glances/core/glances_config.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_globals.py b/glances/core/glances_globals.py index e2f8878e..3cf9fa51 100644 --- a/glances/core/glances_globals.py +++ b/glances/core/glances_globals.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_logging.py b/glances/core/glances_logging.py index f1e0e5d4..74518f3e 100644 --- a/glances/core/glances_logging.py +++ b/glances/core/glances_logging.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_logs.py b/glances/core/glances_logs.py index 577e4601..7d6a10b6 100644 --- a/glances/core/glances_logs.py +++ b/glances/core/glances_logs.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_main.py b/glances/core/glances_main.py index 86dac256..7a5b016f 100644 --- a/glances/core/glances_main.py +++ b/glances/core/glances_main.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_monitor_list.py b/glances/core/glances_monitor_list.py index 5bc20e12..98b0604f 100644 --- a/glances/core/glances_monitor_list.py +++ b/glances/core/glances_monitor_list.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_password.py b/glances/core/glances_password.py index 87e6d137..3ec9179c 100644 --- a/glances/core/glances_password.py +++ b/glances/core/glances_password.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_processes.py b/glances/core/glances_processes.py index 62637914..6584a3d0 100644 --- a/glances/core/glances_processes.py +++ b/glances/core/glances_processes.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_server.py b/glances/core/glances_server.py index f4ecd07c..91d627bb 100644 --- a/glances/core/glances_server.py +++ b/glances/core/glances_server.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_snmp.py b/glances/core/glances_snmp.py index 67cfd3ef..95e1e602 100644 --- a/glances/core/glances_snmp.py +++ b/glances/core/glances_snmp.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_standalone.py b/glances/core/glances_standalone.py index 12a3daf2..50170a97 100644 --- a/glances/core/glances_standalone.py +++ b/glances/core/glances_standalone.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_staticlist.py b/glances/core/glances_staticlist.py index 56db4d22..1ff942a7 100644 --- a/glances/core/glances_staticlist.py +++ b/glances/core/glances_staticlist.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_stats.py b/glances/core/glances_stats.py index 64da8919..b9e98288 100644 --- a/glances/core/glances_stats.py +++ b/glances/core/glances_stats.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_timer.py b/glances/core/glances_timer.py index 8b21d8d4..71fd4667 100644 --- a/glances/core/glances_timer.py +++ b/glances/core/glances_timer.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/core/glances_webserver.py b/glances/core/glances_webserver.py index f83793a6..39c477cc 100644 --- a/glances/core/glances_webserver.py +++ b/glances/core/glances_webserver.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/exports/glances_csv.py b/glances/exports/glances_csv.py index d3cb452d..a71e492b 100644 --- a/glances/exports/glances_csv.py +++ b/glances/exports/glances_csv.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/exports/glances_export.py b/glances/exports/glances_export.py index 5e52f237..a4d219f1 100644 --- a/glances/exports/glances_export.py +++ b/glances/exports/glances_export.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/exports/glances_history.py b/glances/exports/glances_history.py index 36217897..674bdb5c 100644 --- a/glances/exports/glances_history.py +++ b/glances/exports/glances_history.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/exports/glances_influxdb.py b/glances/exports/glances_influxdb.py index 057fa456..801fb962 100644 --- a/glances/exports/glances_influxdb.py +++ b/glances/exports/glances_influxdb.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/outputs/glances_bottle.py b/glances/outputs/glances_bottle.py index 27b56343..25237225 100644 --- a/glances/outputs/glances_bottle.py +++ b/glances/outputs/glances_bottle.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/outputs/glances_colorconsole.py b/glances/outputs/glances_colorconsole.py index 8407114c..49c55037 100644 --- a/glances/outputs/glances_colorconsole.py +++ b/glances/outputs/glances_colorconsole.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/outputs/glances_curses.py b/glances/outputs/glances_curses.py index abf26a53..378dc64b 100644 --- a/glances/outputs/glances_curses.py +++ b/glances/outputs/glances_curses.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 @@ -697,6 +697,7 @@ class _GlancesCurses(object): # Display x = display_x + x_max = x y = display_y for m in plugin_stats['msgdict']: # New line @@ -740,9 +741,11 @@ class _GlancesCurses(object): # good offset = len(m['msg']) x = x + offset + if x > x_max: + x_max = x # Compute the next Glances column/line position - self.next_column = max(self.next_column, x + self.space_between_column) + self.next_column = max(self.next_column, x_max + self.space_between_column) self.next_line = max(self.next_line, y + self.space_between_line) def erase(self): diff --git a/glances/plugins/glances_alert.py b/glances/plugins/glances_alert.py index 49714cde..78c6c45a 100644 --- a/glances/plugins/glances_alert.py +++ b/glances/plugins/glances_alert.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_batpercent.py b/glances/plugins/glances_batpercent.py index f5d67fda..ff1deecc 100644 --- a/glances/plugins/glances_batpercent.py +++ b/glances/plugins/glances_batpercent.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_core.py b/glances/plugins/glances_core.py index ffd4ef2f..20127c8b 100644 --- a/glances/plugins/glances_core.py +++ b/glances/plugins/glances_core.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_cpu.py b/glances/plugins/glances_cpu.py index 436c18e7..685f5454 100644 --- a/glances/plugins/glances_cpu.py +++ b/glances/plugins/glances_cpu.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_diskio.py b/glances/plugins/glances_diskio.py index 373c878c..0cf68bec 100644 --- a/glances/plugins/glances_diskio.py +++ b/glances/plugins/glances_diskio.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_fs.py b/glances/plugins/glances_fs.py index 4f74e45b..621ea5bc 100644 --- a/glances/plugins/glances_fs.py +++ b/glances/plugins/glances_fs.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 @@ -209,7 +209,9 @@ class Plugin(GlancesPlugin): msg = '{0:>7}'.format(self.auto_unit(i['free'])) else: msg = '{0:>7}'.format(self.auto_unit(i['used'])) - ret.append(self.curse_add_line(msg, self.get_alert(i['used'], max=i['size']))) + ret.append(self.curse_add_line(msg, self.get_alert(i['used'], + max=i['size'], + header=i['mnt_point']))) msg = '{0:>7}'.format(self.auto_unit(i['size'])) ret.append(self.curse_add_line(msg)) diff --git a/glances/plugins/glances_hddtemp.py b/glances/plugins/glances_hddtemp.py index 1492a251..82f29f1b 100644 --- a/glances/plugins/glances_hddtemp.py +++ b/glances/plugins/glances_hddtemp.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_help.py b/glances/plugins/glances_help.py index 2644e171..02504b1d 100644 --- a/glances/plugins/glances_help.py +++ b/glances/plugins/glances_help.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_load.py b/glances/plugins/glances_load.py index c689173d..aa2f0dde 100644 --- a/glances/plugins/glances_load.py +++ b/glances/plugins/glances_load.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_mem.py b/glances/plugins/glances_mem.py index 2c2eca43..52bee12a 100644 --- a/glances/plugins/glances_mem.py +++ b/glances/plugins/glances_mem.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_memswap.py b/glances/plugins/glances_memswap.py index 2fcaa8c9..20751add 100644 --- a/glances/plugins/glances_memswap.py +++ b/glances/plugins/glances_memswap.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_monitor.py b/glances/plugins/glances_monitor.py index 16d548ae..66765ea1 100644 --- a/glances/plugins/glances_monitor.py +++ b/glances/plugins/glances_monitor.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_network.py b/glances/plugins/glances_network.py index 0b6ef070..9ef8bc89 100644 --- a/glances/plugins/glances_network.py +++ b/glances/plugins/glances_network.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_now.py b/glances/plugins/glances_now.py index 199085ec..b40fa44f 100644 --- a/glances/plugins/glances_now.py +++ b/glances/plugins/glances_now.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_percpu.py b/glances/plugins/glances_percpu.py index a0a06243..93abeab6 100644 --- a/glances/plugins/glances_percpu.py +++ b/glances/plugins/glances_percpu.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_plugin.py b/glances/plugins/glances_plugin.py index da6d6889..15ba53e1 100644 --- a/glances/plugins/glances_plugin.py +++ b/glances/plugins/glances_plugin.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 @@ -32,6 +32,7 @@ from operator import itemgetter from glances.core.glances_globals import is_py3 from glances.core.glances_logging import logger from glances.core.glances_logs import glances_logs +from glances.core.glances_actions import GlancesActions class GlancesPlugin(object): @@ -64,6 +65,9 @@ class GlancesPlugin(object): # Init the limits dictionnary self.limits = dict() + # Init the actions + self.actions = GlancesActions() + def __repr__(self): """Return the raw stats.""" return self.stats @@ -263,6 +267,8 @@ class GlancesPlugin(object): except ValueError: self.limits[ self.plugin_name + '_' + s] = config.get_raw_option(self.plugin_name, s).split(",") + logger.debug("Load limit: {0} = {1}".format(self.plugin_name + '_' + s, + self.limits[self.plugin_name + '_' + s])) def set_limits(self, input_limits): """Set the limits to input_limits.""" @@ -299,31 +305,54 @@ class GlancesPlugin(object): # Manage limits ret = 'OK' try: - if value > self.__get_limit_critical(header=header): + if value > self.__get_limit('critical', header=header): ret = 'CRITICAL' - elif value > self.__get_limit_warning(header=header): + elif value > self.__get_limit('warning', header=header): ret = 'WARNING' - elif value > self.__get_limit_careful(header=header): + elif value > self.__get_limit('careful', header=header): ret = 'CAREFUL' elif current < min: ret = 'CAREFUL' except KeyError: return 'DEFAULT' - # Manage log (if needed) + # Get the stat_name = plugin_name (+ header) + if header == "": + stat_name = self.plugin_name + else: + stat_name = self.plugin_name + '_' + header + + # Manage log log_str = "" if log: # Add _LOG to the return string # So stats will be highlited with a specific color log_str = "_LOG" - # Get the stat_name = plugin_name (+ header) - if header == "": - stat_name = self.plugin_name - else: - stat_name = self.plugin_name + '_' + header # Add the log to the list glances_logs.add(ret, stat_name.upper(), value, []) + # Manage action + # Here is a command line for the current trigger ? + try: + command = self.__get_limit_action(ret.lower(), header=header) + except KeyError: + # Reset the trigger + self.actions.set(stat_name, ret.lower()) + else: + # A command line is available for the current alert, run it + # Build the {{mustache}} dictionnary + if type(self.stats) is list: + # If the stats are stored in a list of dict (fs plugin for exemple) + # Return the dict for the current header + try: + mustache_dict = (item for item in self.stats if item[self.get_key()] == header).next() + except StopIteration: + mustache_dict = {} + else: + # Use the stats dict + mustache_dict = self.stats + self.actions.run(stat_name, ret.lower(), command, mustache_dict=mustache_dict) + # Default is ok return ret + log_str @@ -331,23 +360,41 @@ class GlancesPlugin(object): """Get the alert log.""" return self.get_alert(current, min, max, header, log=True) - def __get_limit_critical(self, header=""): - if header == "": - return self.limits[self.plugin_name + '_' + 'critical'] - else: - return self.limits[self.plugin_name + '_' + header + '_' + 'critical'] + def __get_limit(self, criticity, header=""): + """Return the limit value for the alert""" + prefix = self.plugin_name + '_' + if header != "": + prefix += header + '_' - def __get_limit_warning(self, header=""): - if header == "": - return self.limits[self.plugin_name + '_' + 'warning'] - else: - return self.limits[self.plugin_name + '_' + header + '_' + 'warning'] + # Get the limit for stat + header + # Exemple: network_wlan0_rx_careful + try: + limit = self.limits[prefix + criticity] + except KeyError: + # Try fallback to plugin default limit + # Exemple: network_careful + limit = self.limits[self.plugin_name + '_' + criticity] - def __get_limit_careful(self, header=""): - if header == "": - return self.limits[self.plugin_name + '_' + 'careful'] - else: - return self.limits[self.plugin_name + '_' + header + '_' + 'careful'] + # Return the limit + return limit + + def __get_limit_action(self, criticity, header=""): + """Return the action for the alert""" + prefix = self.plugin_name + '_' + if header != "": + prefix += header + '_' + + # Get the limit for stat + header + # Exemple: network_wlan0_rx_careful_action + try: + action = self.limits[prefix + criticity + '_action'] + except KeyError: + # Try fallback to plugin default limit + # Exemple: network_careful_action + action = self.limits[self.plugin_name + '_' + criticity + '_action'] + + # Return the action list + return action def get_conf_value(self, value, header="", plugin_name=None): """Return the configuration (header_)value for the current plugin (or the one given by the plugin_name var)""" diff --git a/glances/plugins/glances_processcount.py b/glances/plugins/glances_processcount.py index cfdc1ebc..3248ef1d 100644 --- a/glances/plugins/glances_processcount.py +++ b/glances/plugins/glances_processcount.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_processlist.py b/glances/plugins/glances_processlist.py index e72cb0ff..2e1cc6c0 100644 --- a/glances/plugins/glances_processlist.py +++ b/glances/plugins/glances_processlist.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_psutilversion.py b/glances/plugins/glances_psutilversion.py index 9c54b8df..0c2ffa14 100644 --- a/glances/plugins/glances_psutilversion.py +++ b/glances/plugins/glances_psutilversion.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_raid.py b/glances/plugins/glances_raid.py index 82645cf8..20743c36 100644 --- a/glances/plugins/glances_raid.py +++ b/glances/plugins/glances_raid.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_sensors.py b/glances/plugins/glances_sensors.py index 5fe7fddc..00fc3552 100644 --- a/glances/plugins/glances_sensors.py +++ b/glances/plugins/glances_sensors.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 @@ -64,6 +64,10 @@ class Plugin(GlancesPlugin): # Init the stats self.reset() + def get_key(self): + """Return the key of the list""" + return 'label' + def reset(self): """Reset/init the stats.""" self.stats = [] diff --git a/glances/plugins/glances_system.py b/glances/plugins/glances_system.py index 245e8008..e5e1acfa 100644 --- a/glances/plugins/glances_system.py +++ b/glances/plugins/glances_system.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/glances/plugins/glances_uptime.py b/glances/plugins/glances_uptime.py index 63f6341e..12e1c22b 100644 --- a/glances/plugins/glances_uptime.py +++ b/glances/plugins/glances_uptime.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2014 Nicolargo +# Copyright (C) 2015 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 diff --git a/setup.py b/setup.py index 5d78b0f0..cf1d40a8 100755 --- a/setup.py +++ b/setup.py @@ -67,7 +67,8 @@ setup( 'CHART': ['matplotlib'], 'BROWSER': ['zeroconf>=0.16', 'netifaces'], 'RAID': ['pymdstat'], - 'EXPORT': ['influxdb', 'statsd'] + 'EXPORT': ['influxdb', 'statsd'], + 'ACTION': ['pystache'] }, packages=['glances'], include_package_data=True,