diff --git a/modules/core/memory.py b/modules/core/memory.py new file mode 100644 index 0000000..1ff2f25 --- /dev/null +++ b/modules/core/memory.py @@ -0,0 +1,72 @@ +# pylint: disable=C0111,R0903 + +"""Displays available RAM, total amount of RAM and percentage available. + +Parameters: + * memory.warning : Warning threshold in % of memory used (defaults to 80%) + * memory.critical: Critical threshold in % of memory used (defaults to 90%) + * memory.format: Format string (defaults to "{used}/{total} ({percent:05.02f}%)") + * memory.usedonly: Only show the amount of RAM in use (defaults to False). Same as memory.format="{used}" +""" + +import re + +import bumblebee.util +import bumblebee.input +import bumblebee.output +import bumblebee.engine + +class Container(object): + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + +class Module(bumblebee.engine.Module): + def __init__(self, engine, config): + super(Module, self).__init__(engine, config, + bumblebee.output.Widget(full_text=self.memory_usage) + ) + self.update(None) + + engine.input.register_callback(self, button=bumblebee.input.LEFT_MOUSE, + cmd="gnome-system-monitor") + + @property + def _format(self): + if bumblebee.util.asbool(self.parameter("usedonly", False)): + return "{used}" + else: + return self.parameter("format", "{used}/{total} ({percent:05.02f}%)") + + def memory_usage(self, widget): + return self._format.format(**self._mem) + + def update(self, widgets): + data = {} + with open("/proc/meminfo", "r") as f: + for line in f: + tmp = re.split(r"[:\s]+", line) + value = int(tmp[1]) + if tmp[2] == "kB": value = value*1024 + if tmp[2] == "mB": value = value*1024*1024 + if tmp[2] == "gB": value = value*1024*1024*1024 + data[tmp[0]] = value + if "MemAvailable" in data: + used = data["MemTotal"] - data["MemAvailable"] + else: + used = data["MemTotal"] - data["MemFree"] - data["Buffers"] - data["Cached"] - data["Slab"] + self._mem = { + "total": bumblebee.util.bytefmt(data["MemTotal"]), + "available": bumblebee.util.bytefmt(data["MemAvailable"]), + "free": bumblebee.util.bytefmt(data["MemFree"]), + "used": bumblebee.util.bytefmt(used), + "percent": float(used)/float(data["MemTotal"])*100.0 + } + + def state(self, widget): + if self._mem["percent"] > float(self.parameter("critical", 90)): + return "critical" + if self._mem["percent"] > float(self.parameter("warning", 80)): + return "warning" + return None + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4