summaryrefslogtreecommitdiffstats
path: root/glances/monitor_list.py
diff options
context:
space:
mode:
Diffstat (limited to 'glances/monitor_list.py')
-rw-r--r--glances/monitor_list.py200
1 files changed, 200 insertions, 0 deletions
diff --git a/glances/monitor_list.py b/glances/monitor_list.py
new file mode 100644
index 00000000..4243b630
--- /dev/null
+++ b/glances/monitor_list.py
@@ -0,0 +1,200 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Glances.
+#
+# Copyright (C) 2015 Nicolargo <nicolas@nicolargo.com>
+#
+# Glances is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Glances is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""Manage the monitor list."""
+
+import re
+import subprocess
+
+from glances.compat import range, u
+from glances.logger import logger
+from glances.processes import glances_processes
+
+
+class MonitorList(object):
+
+ """This class describes the optional monitored processes list.
+
+ The monitored list is a list of 'important' processes to monitor.
+
+ The list (Python list) is composed of items (Python dict).
+ An item is defined (dict keys):
+ * description: Description of the processes (max 16 chars)
+ * regex: regular expression of the processes to monitor
+ * command: (optional) shell command for extended stat
+ * countmin: (optional) minimal number of processes
+ * countmax: (optional) maximum number of processes
+ """
+
+ # Maximum number of items in the list
+ __monitor_list_max_size = 10
+ # The list
+ __monitor_list = []
+
+ def __init__(self, config):
+ """Init the monitoring list from the configuration file, if it exists."""
+ self.config = config
+
+ if self.config is not None and self.config.has_section('monitor'):
+ # Process monitoring list
+ logger.debug("Monitor list configuration detected")
+ self.__set_monitor_list('monitor', 'list')
+ else:
+ self.__monitor_list = []
+
+ def __set_monitor_list(self, section, key):
+ """Init the monitored processes list.
+
+ The list is defined in the Glances configuration file.
+ """
+ for l in range(1, self.__monitor_list_max_size + 1):
+ value = {}
+ key = "list_" + str(l) + "_"
+ try:
+ description = self.config.get_value(section, key + 'description')
+ regex = self.config.get_value(section, key + 'regex')
+ command = self.config.get_value(section, key + 'command')
+ countmin = self.config.get_value(section, key + 'countmin')
+ countmax = self.config.get_value(section, key + 'countmax')
+ except Exception as e:
+ logger.error("Cannot read monitored list: {0}".format(e))
+ else:
+ if description is not None and regex is not None:
+ # Build the new item
+ value["description"] = description
+ try:
+ re.compile(regex)
+ except Exception:
+ continue
+ else:
+ value["regex"] = regex
+ value["command"] = command
+ value["countmin"] = countmin
+ value["countmax"] = countmax
+ value["count"] = None
+ value["result"] = None
+ # Add the item to the list
+ self.__monitor_list.append(value)
+
+ def __str__(self):
+ return str(self.__monitor_list)
+
+ def __repr__(self):
+ return self.__monitor_list
+
+ def __getitem__(self, item):
+ return self.__monitor_list[item]
+
+ def __len__(self):
+ return len(self.__monitor_list)
+
+ def __get__(self, item, key):
+ """Meta function to return key value of item.
+
+ Return None if not defined or item > len(list)
+ """
+ if item < len(self.__monitor_list):
+ try:
+ return self.__monitor_list[item][key]
+ except Exception:
+ return None
+ else:
+ return None
+
+ def update(self):
+ """Update the command result attributed."""
+ # Only continue if monitor list is not empty
+ if len(self.__monitor_list) == 0:
+ return self.__monitor_list
+
+ # Search monitored processes by a regular expression
+ processlist = [p for p in glances_processes.getalllist()]
+
+ # Iter upon the monitored list
+ for i in range(len(self.get())):
+ monitoredlist = [p for p in processlist for c in p['cmdline'] if re.search(self.regex(i), c) is not None]
+ self.__monitor_list[i]['count'] = len(monitoredlist)
+
+ # Always get processes CPU and MEM
+ self.__monitor_list[i]['default_result'] = 'CPU: {0:.1f}% | MEM: {1:.1f}%'.format(
+ sum([p['cpu_percent'] for p in monitoredlist]),
+ sum([p['memory_percent'] for p in monitoredlist]))
+
+ if self.command(i) is not None:
+ # Execute the user command line
+ try:
+ self.__monitor_list[i]['result'] = subprocess.check_output(self.command(i),
+ shell=True)
+ except subprocess.CalledProcessError:
+ self.__monitor_list[i]['result'] = 'Error: ' + self.command(i)
+ except Exception:
+ self.__monitor_list[i]['result'] = 'Cannot execute command'
+
+ # Only save the first line
+ try:
+ self.__monitor_list[i]['result'] = u(self.__monitor_list[i]['result']).split('\n')[0]
+ except:
+ self.__monitor_list[i]['result'] = ''
+
+ if self.command(i) is None or self.__monitor_list[i]['result'] == '':
+ # If there is no command specified in the conf file
+ # then display CPU and MEM %
+ self.__monitor_list[i]['result'] = self.__monitor_list[i]['default_result']
+
+ return self.__monitor_list
+
+ def get(self):
+ """Return the monitored list (list of dict)."""
+ return self.__monitor_list
+
+ def set(self, newlist):
+ """Set the monitored list (list of dict)."""
+ self.__monitor_list = newlist
+
+ def getAll(self):
+ # Deprecated: use get()
+ return self.get()
+
+ def setAll(self, newlist):
+ # Deprecated: use set()
+ self.set(newlist)
+
+ def description(self, item):
+ """Return the description of the item number (item)."""
+ return self.__get__(item, "description")
+
+ def regex(self, item):
+ """Return the regular expression of the item number (item)."""
+ return self.__get__(item, "regex")
+
+ def command(self, item):
+ """Return the stat command of the item number (item)."""
+ return self.__get__(item, "command")
+
+ def result(self, item):
+ """Return the reult command of the item number (item)."""
+ return self.__get__(item, "result")
+
+ def countmin(self, item):
+ """Return the minimum number of processes of the item number (item)."""
+ return self.__get__(item, "countmin")
+
+ def countmax(self, item):
+ """Return the maximum number of processes of the item number (item)."""
+ return self.__get__(item, "countmax")