From d10fc814eda11b4fcb8b1c5c717bace82e8f7af4 Mon Sep 17 00:00:00 2001 From: Tobi-wan Kenobi Date: Sun, 11 Dec 2016 12:53:31 +0100 Subject: [PATCH] [modules/dnf] Re-enable DNF update checking module see #23 --- bumblebee/modules/dnf.py | 79 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 bumblebee/modules/dnf.py diff --git a/bumblebee/modules/dnf.py b/bumblebee/modules/dnf.py new file mode 100644 index 0000000..f6acf2a --- /dev/null +++ b/bumblebee/modules/dnf.py @@ -0,0 +1,79 @@ +# pylint: disable=C0111,R0903 + +"""Displays DNF package update information (///) + +Parameters: + * dnf.interval: Time in seconds between two consecutive update checks (defaulst to 1800) + +""" + +import time +import threading + +import bumblebee.util +import bumblebee.input +import bumblebee.output +import bumblebee.engine + +def get_dnf_info(widget): + try: + res = bumblebee.util.execute("dnf updateinfo") + except RuntimeError: + pass + + security = 0 + bugfixes = 0 + enhancements = 0 + other = 0 + for line in res.decode().split("\n"): + + if not line.startswith(" "): continue + elif "ecurity" in line: + for s in line.split(): + if s.isdigit(): security += int(s) + elif "ugfix" in line: + for s in line.split(): + if s.isdigit(): bugfixes += int(s) + elif "hancement" in line: + for s in line.split(): + if s.isdigit(): enhancements += int(s) + else: + for s in line.split(): + if s.isdigit(): other += int(s) + + widget.set("security", security) + widget.set("bugfixes", bugfixes) + widget.set("enhancements", enhancements) + widget.set("other", other) + +class Module(bumblebee.engine.Module): + def __init__(self, engine, config): + widget = bumblebee.output.Widget(full_text=self.updates) + super(Module, self).__init__(engine, config, widget) + + self._next_check = 0 + widget + + def updates(self, widget): + result = [] + for t in ["security", "bugfixes", "enhancements", "other"]: + result.append(str(widget.get(t, 0))) + return "/".join(result) + + def update(self, widgets): + if int(time.time()) < self._next_check: + return + thread = threading.Thread(target=get_dnf_info, args=(widgets[0],)) + thread.start() + self._next_check = int(time.time()) + self.parameter("interval", 30*60) + + def state(self, widget): + cnt = 0 + for t in ["security", "bugfixes", "enhancements", "other"]: + cnt += widget.get(t, 0) + if cnt == 0: + return "good" + if cnt > 50 or widget.get("security", 0) > 0: + return "critical" + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4