From 3fdd2d2be62e6a221547f9bf3679bbaf0890d1b8 Mon Sep 17 00:00:00 2001 From: tobi-wan-kenobi Date: Mon, 11 May 2020 15:10:20 +0200 Subject: [PATCH] [modules/arch-update] Gracefully handle exit code 2 fixes #624 --- bumblebee_status/modules/contrib/arch-update.py | 15 +++++++++------ bumblebee_status/util/cli.py | 14 ++++++++------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/bumblebee_status/modules/contrib/arch-update.py b/bumblebee_status/modules/contrib/arch-update.py index 66287be..a1ea550 100644 --- a/bumblebee_status/modules/contrib/arch-update.py +++ b/bumblebee_status/modules/contrib/arch-update.py @@ -33,13 +33,16 @@ class Module(core.module.Module): return self.__packages == 0 and not self.__error def update(self): - try: - result = util.cli.execute("checkupdates") - self.__packages = len(result.split("\n")) - 1 - self.__error = False - except Exception as e: - logging.exception(e) + self.__error = False + code, result = util.cli.execute("checkupdates", ignore_errors=True, return_exitcode=True) + + if code == 0: + self.__packages = len(result.split("\n")) + elif code == 2: + self.__packages = 0 + else: self.__error = True + log.error("checkupdates exited with {}: {}".format(code, result)) def state(self, widget): if self.__error: diff --git a/bumblebee_status/util/cli.py b/bumblebee_status/util/cli.py index fd54093..31a2955 100644 --- a/bumblebee_status/util/cli.py +++ b/bumblebee_status/util/cli.py @@ -4,7 +4,7 @@ import subprocess import logging -def execute(cmd, wait=True, ignore_errors=False, include_stderr=False, env=None): +def execute(cmd, wait=True, ignore_errors=False, include_stderr=False, env=None, return_exitcode=False): """Executes a commandline utility and returns its output :param cmd: the command (as string) to execute, returns the program's output @@ -12,11 +12,12 @@ def execute(cmd, wait=True, ignore_errors=False, include_stderr=False, env=None) :param ignore_errors: set to True to return a string when an exception is thrown, otherwise might throw, defaults to False :param include_stderr: set to True to include stderr output in the return value, defaults to False :param env: provide a dict here to specify a custom execution environment, defaults to None + :param return_exitcode: set to True to return a pair, where the first member is the exit code and the message the second, defaults to False :raises RuntimeError: the command either didn't exist or didn't exit cleanly, and ignore_errors was set to False - :return: output of cmd, or stderr, if ignore_errors is True and the command failed - :rtype: string + :return: output of cmd, or stderr, if ignore_errors is True and the command failed; or a tuple of exitcode and the previous, if return_exitcode is set to True + :rtype: string or tuple (if return_exitcode is set to True) """ args = shlex.split(cmd) logging.debug(cmd) @@ -35,10 +36,11 @@ def execute(cmd, wait=True, ignore_errors=False, include_stderr=False, env=None) if proc.returncode != 0: err = "{} exited with code {}".format(cmd, proc.returncode) if ignore_errors: - return err + return (proc.returncode, err) if return_exitcode else err raise RuntimeError(err) - return out.decode("utf-8") - return "" + res = out.decode("utf-8") + return (proc.returncode, res) if return_exitcode else res + return (0, "") if return_exitcode else "" # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4