[modules] Add DNF supervision module

Add a module that periodically (by default, once every 30min) calls
"dnf updateinfo" and evaluates the results to report the number of
bugfixes, enhancements, etc.

If there's either too many pending updates, or at least one security
update, the module goes critical.
This commit is contained in:
Tobias Witek 2016-10-31 15:17:51 +01:00
parent b3e17d4899
commit bcf0264f99
2 changed files with 89 additions and 0 deletions

80
bumblebee/modules/dnf.py Normal file
View file

@ -0,0 +1,80 @@
import time
import shlex
import threading
import subprocess
import bumblebee.module
import bumblebee.util
def get_dnf_info(obj):
while True:
try:
res = subprocess.check_output(shlex.split("dnf updateinfo"))
except Exception as e:
break
security = 0
bugfixes = 0
enhancements = 0
other = 0
for line in res.split("\n"):
if "expiration" in line: continue
elif "ecurity" in line:
for s in str.split(line):
if s.isdigit(): security += int(s)
elif "ugfix" in line:
for s in str.split(line):
if s.isdigit(): bugfixes += int(s)
elif "hancement" in line:
for s in str.split(line):
if s.isdigit(): enhancements += int(s)
else:
for s in str.split(line):
if s.isdigit(): other += int(s)
obj.set("security", security)
obj.set("bugfixes", bugfixes)
obj.set("enhancements", enhancements)
obj.set("other", other)
time.sleep(obj.interval())
class Module(bumblebee.module.Module):
def __init__(self, args):
super(Module, self).__init__(args)
self._interval = args[0] if args else 30*60
self._counter = {}
self._thread = threading.Thread(target=get_dnf_info, args=(self,))
self._thread.start()
def interval(self):
return self._interval
def set(self, what, value):
self._counter[what] = value
def get(self, what):
return self._counter.get(what, 0)
def data(self):
result = []
for t in [ "security", "bugfix", "enhancement", "other" ]:
result.append(str(self.get(t)))
return "/".join(result)
def state(self):
total = sum(self._counter.values())
if total == 0: return "good"
return "default"
def warning(self):
total = sum(self._counter.values())
return total > 0
def critical(self):
total = sum(self._counter.values())
return total > 50 or self._counter.get("security", 0) > 0
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -35,6 +35,15 @@
"disk": { "disk": {
"prefix": "  " "prefix": "  "
}, },
"dnf": {
"prefix": "  ",
"states": {
"good": {
"fg": "#002b36",
"bg": "#859900"
}
}
},
"pasink": { "pasink": {
"states": { "states": {
"muted": { "muted": {