6cbf866b63
If the kernel supports it, MemAvailable contains an estimation of the memory available for usage. Use this to calculate the amount of free memory (as this seems to closely match the output of gnome-system-monitor). fixes #253
72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
# 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
|