diff --git a/modules/contrib/apt.py b/modules/contrib/apt.py index 99c7819..0974499 100644 --- a/modules/contrib/apt.py +++ b/modules/contrib/apt.py @@ -1,80 +1,79 @@ # pylint: disable=C0111,R0903 """Displays APT package update information (/) -Requires the following debian packages: - * python-parse +Requires the following packages: * aptitude """ +import re import threading -from parse import * -import bumblebee.util -import bumblebee.input -import bumblebee.output -import bumblebee.engine +import core.module +import core.widget +import core.decorators -APT_CHECK_PATH = ("aptitude full-upgrade --simulate --assume-yes") -PATTERN = "{} packages upgraded, {} newly installed, {} to remove and {} not upgraded." +import util.cli + +PATTERN = '{} packages upgraded, {} newly installed, {} to remove and {} not upgraded.' def parse_result(to_parse): # We want to line with the iforamtion about package upgrade - line_to_parse = to_parse.split("\n")[-4] + line_to_parse = to_parse.split('\n')[-4] + result = re.search('(.+) packages upgraded, (.+) newly installed, (.+) to remove', line_to_parse) - result = parse(PATTERN, line_to_parse) + return int(result.group(1)), int(result.group(3)) - return int(result[0]), int(result[2]) - -def get_apt_check_info(widget): +def get_apt_check_info(module): + widget = module.widget() try: - res = bumblebee.util.execute(APT_CHECK_PATH) - widget.set("error", None) + res = util.cli.execute('aptitude full-upgrade --simulate --assume-yes') + widget.set('error', None) except (RuntimeError, FileNotFoundError) as e: - widget.set("error", "unable to query APT: {}".format(e)) + widget.set('error', 'unable to query APT: {}'.format(e)) return to_upgrade = 0 to_remove = 0 try: to_upgrade, to_remove = parse_result(res) - except e: - widget.set("error", "parse error: {}".format(e)) - return + widget.set('to_upgrade', to_upgrade) + widget.set('to_remove', to_remove) + except Exception as e: + widget.set('error', 'parse error: {}'.format(e)) - widget.set("to_upgrade", to_upgrade) - widget.set("to_remove", to_remove) + core.event.trigger('update', [ module.id ], redraw_only=True) -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.interval_factor(60) - self.interval(30) +class Module(core.module.Module): + @core.decorators.every(minutes=30) + def __init__(self, config): + super().__init__(config, core.widget.Widget(self.updates)) + self.__thread = None def updates(self, widget): - result = [] - if widget.get("error"): - return widget.get("error") - for t in ["to_upgrade", "to_remove"]: - result.append(str(widget.get(t, 0))) - return "/".join(result) + if widget.get('error'): + return widget.get('error') + return '{} to upgrade, {} to remove'.format( + widget.get('to_upgrade', 0), widget.get('to_remove', 0) + ) - def update(self, widgets): - thread = threading.Thread(target=get_apt_check_info, args=(widgets[0],)) - thread.start() + def update(self): + if self.__thread and self.__thread.isAlive(): return + + self.__thread = threading.Thread(target=get_apt_check_info, args=(self,)) + self.__thread.start() def state(self, widget): cnt = 0 - ret = "good" - for t in ["to_upgrade", "to_remove"]: + ret = 'good' + for t in ['to_upgrade', 'to_remove']: cnt += widget.get(t, 0) if cnt > 50: - ret = "critical" + ret = 'critical' elif cnt > 0: - ret = "warning" - if widget.get("error"): - ret = "critical" + ret = 'warning' + if widget.get('error'): + ret = 'critical' return ret