From 0785202860630dfc121bcd0fc24b86dd77ac841c Mon Sep 17 00:00:00 2001 From: Andrew Reisner Date: Sun, 12 Jul 2020 10:52:05 -0600 Subject: [PATCH] Add simple portage status module. This adds a simple module to display the status of Gentoo portage operations by reading its logfile. --- .../modules/contrib/portage_status.py | 64 +++++++++++++++++++ themes/icons/awesome-fonts.json | 4 ++ 2 files changed, 68 insertions(+) create mode 100644 bumblebee_status/modules/contrib/portage_status.py diff --git a/bumblebee_status/modules/contrib/portage_status.py b/bumblebee_status/modules/contrib/portage_status.py new file mode 100644 index 0000000..507eda3 --- /dev/null +++ b/bumblebee_status/modules/contrib/portage_status.py @@ -0,0 +1,64 @@ +"""Displays the status of Gentoo portage operations. + +Parameters: + * portage_status.logfile: logfile for portage (default is /var/log/emerge.log) +""" + +import os + +import core.module +import core.widget + + +class Module(core.module.Module): + def __init__(self, config, theme): + super().__init__(config, theme, core.widget.Widget(self.output)) + self.__logfile = self.parameter( + "logfile", "/var/log/emerge.log") + self.clear() + + + def clear(self): + self.__action = "" + self.__package = "" + self.__status = "" + + + def output(self, widget): + return " ".join([atom for atom in + (self.__action, self.__package, self.__status) if atom != ""]) + + + def state(self, widgets): + if self.__action == "": + return "idle" + return "active" + + + def update(self): + try: + with open(self.__logfile, "rb") as f: + f.seek(-2, os.SEEK_END) + while f.read(1) != b"\n": + f.seek(-2, os.SEEK_CUR) + last_line = f.readline().decode() + if "===" in last_line: + if "Unmerging..." in last_line: + self.__action = "Unmerging" + package_beg = last_line.find("(") + 1 + package_end = last_line.find("-", last_line.find("/")) - 1 + self.__package = last_line[package_beg:package_end+1] + else: # merging + status_beg = last_line.find("(") + status_end = last_line.find(")") + self.__status = last_line[status_beg:status_end+1] + package_beg = last_line.find('(', status_end) + 1 + package_end = package_beg + last_line[package_beg:].find("-", last_line[package_beg:].find("/")) - 1 + self.__package = last_line[package_beg:package_end+1] + action_beg = status_end + 2 + action_end = package_beg - 3 + self.__action = last_line[action_beg:action_end+1] + else: + self.clear() + except Exception: + self.clear() diff --git a/themes/icons/awesome-fonts.json b/themes/icons/awesome-fonts.json index d0ac2bc..ca8d38f 100644 --- a/themes/icons/awesome-fonts.json +++ b/themes/icons/awesome-fonts.json @@ -35,6 +35,10 @@ "empty": { "prefix": "\uf0e0" }, "items": { "prefix": "\uf0e0" } }, + "portage_status": { + "idle": { "prefix": "" }, + "active": { "prefix": "" } + }, "todo": { "empty": { "prefix": "" }, "items": { "prefix": "" },