From 7459d29c68021c7dd87e1b8c8a29ce94dcdea346 Mon Sep 17 00:00:00 2001 From: Von Random Date: Thu, 21 Mar 2019 15:17:38 +0300 Subject: [PATCH 01/10] pacman plugin: not so much pacman anymore, but line counter; still defaults to pacman though --- plugins/pacman.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/pacman.py b/plugins/pacman.py index ccf0550..b5e595b 100644 --- a/plugins/pacman.py +++ b/plugins/pacman.py @@ -5,6 +5,8 @@ import subprocess class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): defaults = { + 'cmd': ('/usr/bin/pacman', '-Qu'), + 'title': 'UPD', 'freq': 15, 'problem': 10 } @@ -14,11 +16,11 @@ class PluginThread(plugins.PluginThreadCommon): def format_status(self, count): self.hide = count == 0 self.status['urgent'] = count >= self.conf['problem'] - self.status['full_text'] = 'UPD: ' + str(count) + self.status['full_text'] = self.conf['title'] + ': ' + str(count) def main(self): pacman_qu = subprocess.Popen( - ('/usr/bin/pacman', '-Qu'), stdout=subprocess.PIPE, + self.conf['cmd'], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL, encoding='UTF-8' ) From 151c94c5f3d0a786ce1058481f1c4c5c908bc305 Mon Sep 17 00:00:00 2001 From: Von Random Date: Thu, 28 Mar 2019 13:21:15 +0300 Subject: [PATCH 02/10] vdstatus, plugins: some refactoring and better usage of dict() methods; rename fga to fortune and make uri configurable --- plugins/__init__.py | 18 +++++++----------- plugins/batt.py | 12 ++++++------ plugins/date.py | 8 +++++--- plugins/disk.py | 6 ++++-- plugins/{fga.py => fortune.py} | 14 ++++++++------ plugins/load.py | 6 ++++-- plugins/mem.py | 6 ++++-- plugins/pacman.py | 14 +++++++------- plugins/ping.py | 12 ++++++++---- vdstatus | 7 +++---- 10 files changed, 56 insertions(+), 47 deletions(-) rename plugins/{fga.py => fortune.py} (77%) diff --git a/plugins/__init__.py b/plugins/__init__.py index 68df0c9..1a46771 100644 --- a/plugins/__init__.py +++ b/plugins/__init__.py @@ -2,21 +2,17 @@ import threading import time -def parse_config(config, defaults): - result = dict() - for key in defaults: - result[key] = config[key] if key in config else defaults[key] - return result +PLUGIN_DEFAULTS = {'freq': 1, 'hide_ok': True} class PluginThreadCommon: - def __init__(self, config, defaults=dict()): - if 'freq' not in defaults: - defaults['freq'] = 1 - if 'hide_ok' not in defaults: - defaults['hide_ok'] = True - self.conf = parse_config(config, defaults) + def __init__(self, config, defaults=None): self.status = dict() + self.conf = dict() + self.conf.update(PLUGIN_DEFAULTS) + if defaults: + self.conf.update(defaults) + self.conf.update(config) self.hide = False self.thread = threading.Thread(target=self.run) self.thread.daemon = True diff --git a/plugins/batt.py b/plugins/batt.py index 90c52ea..b89d00d 100644 --- a/plugins/batt.py +++ b/plugins/batt.py @@ -2,16 +2,16 @@ import plugins BATTERY_DIR = '/sys/class/power_supply/BAT0/' +BATT_DEFAULTS = { + 'problem': 15, + 'symbol_charging': '\u2191', + 'symbol_discharging': '\u2193' +} class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): - defaults = { - 'problem': 15, - 'symbol_charging': '\u2191', - 'symbol_discharging': '\u2193' - } - super(PluginThread, self).__init__(config, defaults) + super(PluginThread, self).__init__(config, BATT_DEFAULTS) def main(self): with \ diff --git a/plugins/date.py b/plugins/date.py index ee6009a..8afe76e 100644 --- a/plugins/date.py +++ b/plugins/date.py @@ -2,12 +2,14 @@ import datetime import plugins +DATE_DEFAULTS = {'format': '%c'} + + class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): - defaults = {'format': '%c', 'tz': None} - super(PluginThread, self).__init__(config, defaults) + super(PluginThread, self).__init__(config, DATE_DEFAULTS) self.timezone = None - if self.conf['tz']: + if 'tz' in self.conf: import pytz self.timezone = pytz.timezone(self.conf['tz']) diff --git a/plugins/disk.py b/plugins/disk.py index 6ab9c2b..e705f4e 100644 --- a/plugins/disk.py +++ b/plugins/disk.py @@ -2,10 +2,12 @@ import plugins import psutil +DISK_DEFAULTS = {'partition': '/', 'problem': 80, 'freq': 15} + + class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): - defaults = {'partition': '/', 'problem': 80, 'freq': 15} - super(PluginThread, self).__init__(config, defaults) + super(PluginThread, self).__init__(config, DISK_DEFAULTS) def main(self): du_stat = psutil.disk_usage(self.conf['partition']) diff --git a/plugins/fga.py b/plugins/fortune.py similarity index 77% rename from plugins/fga.py rename to plugins/fortune.py index ecc5857..562d653 100644 --- a/plugins/fga.py +++ b/plugins/fortune.py @@ -3,17 +3,20 @@ import requests import time -URI = 'http://fucking-great-advice.ru/api/random' +FGA_DEFAULTS = { + 'uri': 'http://fucking-great-advice.ru/api/random', + 'freq': 120, 'retry': 3 +} + + class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): - defaults = {'freq': 120, 'retry': 3} - super(PluginThread, self).__init__(config, defaults) + super(PluginThread, self).__init__(config, FGA_DEFAULTS) self.retry = False - def main(self): try: - req = requests.get(URI, timeout=2) + req = requests.get(self.conf['uri'], timeout=2) advice = req.json()['text'] if req.status_code == 200 else 'N/A' self.retry = False except requests.exceptions.Timeout: @@ -24,7 +27,6 @@ class PluginThread(plugins.PluginThreadCommon): self.retry = True self.status['full_text'] = advice - def run(self): while True: self.main() diff --git a/plugins/load.py b/plugins/load.py index 8567fdd..75dd4a0 100644 --- a/plugins/load.py +++ b/plugins/load.py @@ -2,10 +2,12 @@ import os import plugins +LOAD_DEFAULTS = {'freq': 20, 'problem': 1} + + class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): - defaults = {'freq': 20, 'problem': 1} - super(PluginThread, self).__init__(config, defaults) + super(PluginThread, self).__init__(config, LOAD_DEFAULTS) def main(self): loads = os.getloadavg() diff --git a/plugins/mem.py b/plugins/mem.py index 14c1b16..1abc7eb 100644 --- a/plugins/mem.py +++ b/plugins/mem.py @@ -2,10 +2,12 @@ import psutil import plugins +MEM_DEFAULTS = {'problem': 85} + + class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): - defaults = {'problem': 85} - super(PluginThread, self).__init__(config, defaults) + super(PluginThread, self).__init__(config, MEM_DEFAULTS) def main(self): mem_stat = psutil.virtual_memory() diff --git a/plugins/pacman.py b/plugins/pacman.py index b5e595b..edf36e9 100644 --- a/plugins/pacman.py +++ b/plugins/pacman.py @@ -2,15 +2,15 @@ import plugins import subprocess +PACMAN_DEFAULTS = { + 'cmd': ('/usr/bin/pacman', '-Qu'), + 'title': 'UPD', 'freq': 15, 'problem': 10 +} + + class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): - defaults = { - 'cmd': ('/usr/bin/pacman', '-Qu'), - 'title': 'UPD', - 'freq': 15, - 'problem': 10 - } - super(PluginThread, self).__init__(config, defaults) + super(PluginThread, self).__init__(config, PACMAN_DEFAULTS) self.format_status(0) def format_status(self, count): diff --git a/plugins/ping.py b/plugins/ping.py index 2f0bb42..8e6a391 100644 --- a/plugins/ping.py +++ b/plugins/ping.py @@ -3,15 +3,19 @@ import random import plugins +PING_DEFAULTS = { + 'hosts': list(), 'title': 'PING', 'timeout': 150 +} + + class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): - defaults = {'hosts': list(), 'title': 'PING', 'timeout': 150} - super(PluginThread, self).__init__(config, defaults) + super(PluginThread, self).__init__(config, PING_DEFAULTS) self.format_status('n/a') def format_status(self, state): self.status['full_text'] = self.conf['title'] + ': ' + state - if state == 'on': + if state == 'up': self.status['urgent'] = False self.hide = True else: @@ -26,4 +30,4 @@ class PluginThread(plugins.PluginThreadCommon): if response == 0: self.format_status('on') break - self.format_status('off') + self.format_status('down') diff --git a/vdstatus b/vdstatus index d3f5425..8dd1ec9 100755 --- a/vdstatus +++ b/vdstatus @@ -6,7 +6,6 @@ import os import sys import time import yaml -import plugins DEFAULT_CONFIG = os.path.join(os.environ['HOME'], '.config/vdstatus/conf.yaml') @@ -28,10 +27,10 @@ def parse_arguments(): class PluginRunner: def __init__(self, config_file=DEFAULT_CONFIG): - config = dict() + self.conf = dict() + self.conf.update(DEFAULTS) with open(config_file) as config_data: - config = yaml.load(config_data) - self.conf = plugins.parse_config(config, DEFAULTS) + self.conf.update(yaml.load(config_data)) self.plugins_loaded = list() self.format_output = self.format_term for plugin in self.conf['plugins']: From 5e6519a51ed58a75f50a547a98cc08ed886d1fda Mon Sep 17 00:00:00 2001 From: Von Random Date: Fri, 24 May 2019 12:14:08 +0300 Subject: [PATCH 03/10] filecat plugin: a simple plugin to read file contents --- plugins/filecat.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 plugins/filecat.py diff --git a/plugins/filecat.py b/plugins/filecat.py new file mode 100644 index 0000000..9eae04d --- /dev/null +++ b/plugins/filecat.py @@ -0,0 +1,28 @@ +import plugins + + +FILECAT_DEFAULTS = { + 'filename': '/etc/hostname', 'title': 'CAT', + 'freq': 60, 'nofile': 'unavailable' +} + + +class PluginThread(plugins.PluginThreadCommon): + def __init__(self, config): + super(PluginThread, self).__init__(config, FILECAT_DEFAULTS) + self.hide = False + self.format_status(self.conf['title'], False) + + def format_status(self, contents, urgent): + self.status['urgent'] = urgent + self.status['full_text'] = self.conf['title'] + ': ' + contents + + def main(self): + try: + with open(self.conf['filename'], 'r') as datafile: + contents = datafile.read().strip() + urgent = False + except FileNotFoundError: + contents = self.conf['nofile'] + urgent = True + self.format_status(contents, urgent) From c3700821af265430b8a5d950d2c5ce4518b81e25 Mon Sep 17 00:00:00 2001 From: Von Random Date: Mon, 17 Jun 2019 12:45:44 +0300 Subject: [PATCH 04/10] gitignore: ignore plugins/custom*.py, because some stuff has to be hard coded --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6665c70..6920eb1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +plugins/custom*.py *.iml *.swp *.wpr From 9902696f1ff34757682594f8dd39d343109723af Mon Sep 17 00:00:00 2001 From: Von Random Date: Mon, 17 Jun 2019 12:48:43 +0300 Subject: [PATCH 05/10] vdstatus: replace deprecated yaml.load() with yaml.safe_load() call --- vdstatus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vdstatus b/vdstatus index 8dd1ec9..e5d8cf6 100755 --- a/vdstatus +++ b/vdstatus @@ -30,7 +30,7 @@ class PluginRunner: self.conf = dict() self.conf.update(DEFAULTS) with open(config_file) as config_data: - self.conf.update(yaml.load(config_data)) + self.conf.update(yaml.safe_load(config_data)) self.plugins_loaded = list() self.format_output = self.format_term for plugin in self.conf['plugins']: From bd549b0cc96aa51e3cf2bf23089984002bc72a15 Mon Sep 17 00:00:00 2001 From: Von Random Date: Fri, 5 Jul 2019 18:24:46 +0300 Subject: [PATCH 06/10] plugins, vdstatus: massive plugin overhaul, conf: some formatting --- conf.yaml | 15 +++++++++++++++ plugins/__init__.py | 9 ++++++++- plugins/batt.py | 13 +++++++------ plugins/date.py | 2 +- plugins/disk.py | 7 ++++--- plugins/filecat.py | 4 ---- plugins/fortune.py | 12 ++++++------ plugins/load.py | 9 +++++---- plugins/mem.py | 8 ++++---- plugins/pacman.py | 16 ++++++++-------- plugins/ping.py | 31 ++++++++++++------------------- vdstatus | 5 +++-- 12 files changed, 73 insertions(+), 58 deletions(-) diff --git a/conf.yaml b/conf.yaml index 7416c97..4ce9b8f 100644 --- a/conf.yaml +++ b/conf.yaml @@ -1,4 +1,12 @@ +# Typical plugin properties: +# - name: plugin name (always required, all other properties are optional) +# - title: title representation on the panel +# - hide_ok: false to force display value even if it is below problem threshold +# - problem: a threshold value to make a value urgent and / or display +# the value on the panel + output_format: i3 + plugins: - name: ping title: NET @@ -6,15 +14,22 @@ plugins: - de-ber-as20647.anchors.atlas.ripe.net - nl-ams-as1101.anchors.atlas.ripe.net - uk-boh-as196745.anchors.atlas.ripe.net + hide_ok: false + - name: disk partition: / problem: 80 hide_ok: false + - name: disk partition: /home problem: 90 + - name: pacman + - name: mem + - name: load + - name: date format: '%a %d %H:%M' diff --git a/plugins/__init__.py b/plugins/__init__.py index 1a46771..3f61ec8 100644 --- a/plugins/__init__.py +++ b/plugins/__init__.py @@ -17,11 +17,18 @@ class PluginThreadCommon: self.thread = threading.Thread(target=self.run) self.thread.daemon = True + def format_status(self, status, urgent=False): + if 'title' in self.conf: + full_text = self.conf['title'] + ': ' + status + else: + full_text = status + self.status.update({'full_text': full_text, 'urgent': urgent}) + def start(self): self.thread.start() def main(self): - self.status['full_text'] = 'placeholder' + pass def run(self): while True: diff --git a/plugins/batt.py b/plugins/batt.py index b89d00d..b932ce5 100644 --- a/plugins/batt.py +++ b/plugins/batt.py @@ -17,13 +17,14 @@ class PluginThread(plugins.PluginThreadCommon): with \ open(BATTERY_DIR + 'capacity', 'r') as batt_capacity, \ open(BATTERY_DIR + 'status', 'r') as batt_status: - status = batt_status.read().strip() - capacity = batt_capacity.read().strip() - if status != 'Discharging': + capacity = batt_capacity.readline().strip() + status_value = batt_status.readline().strip() + + if status_value != 'Discharging': symbol = self.conf['symbol_charging'] - self.status['urgent'] = False + urgent = False else: symbol = self.conf['symbol_discharging'] - self.status['urgent'] = float(capacity) <= self.conf['problem'] + urgent = float(capacity) <= self.conf['problem'] - self.status['full_text'] = 'BAT: ' + capacity + '% ' + symbol + self.format_status(capacity + '% ' + symbol, urgent=urgent) diff --git a/plugins/date.py b/plugins/date.py index 8afe76e..9e2a292 100644 --- a/plugins/date.py +++ b/plugins/date.py @@ -15,4 +15,4 @@ class PluginThread(plugins.PluginThreadCommon): def main(self): now = datetime.datetime.now(tz=self.timezone) - self.status['full_text'] = now.strftime(self.conf['format']) + self.format_status(now.strftime(self.conf['format'])) diff --git a/plugins/disk.py b/plugins/disk.py index e705f4e..6085795 100644 --- a/plugins/disk.py +++ b/plugins/disk.py @@ -8,6 +8,8 @@ DISK_DEFAULTS = {'partition': '/', 'problem': 80, 'freq': 15} class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): super(PluginThread, self).__init__(config, DISK_DEFAULTS) + if 'title' not in self.conf: + self.conf['title'] = self.conf['partition'] def main(self): du_stat = psutil.disk_usage(self.conf['partition']) @@ -17,6 +19,5 @@ class PluginThread(plugins.PluginThreadCommon): else: self.hide = True self.status['urgent'] = False - du_free = str(round(du_stat.free / 2**30, 2)) - disk_usage = self.conf['partition'] + ': ' + du_free + 'G' - self.status['full_text'] = disk_usage + status = '{:.2f}G'.format(du_stat.free / 2**30) + self.format_status(status) diff --git a/plugins/filecat.py b/plugins/filecat.py index 9eae04d..5f404c9 100644 --- a/plugins/filecat.py +++ b/plugins/filecat.py @@ -13,10 +13,6 @@ class PluginThread(plugins.PluginThreadCommon): self.hide = False self.format_status(self.conf['title'], False) - def format_status(self, contents, urgent): - self.status['urgent'] = urgent - self.status['full_text'] = self.conf['title'] + ': ' + contents - def main(self): try: with open(self.conf['filename'], 'r') as datafile: diff --git a/plugins/fortune.py b/plugins/fortune.py index 562d653..0f35354 100644 --- a/plugins/fortune.py +++ b/plugins/fortune.py @@ -3,7 +3,7 @@ import requests import time -FGA_DEFAULTS = { +FORTUNE_DEFAULTS = { 'uri': 'http://fucking-great-advice.ru/api/random', 'freq': 120, 'retry': 3 } @@ -11,21 +11,21 @@ FGA_DEFAULTS = { class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): - super(PluginThread, self).__init__(config, FGA_DEFAULTS) + super(PluginThread, self).__init__(config, FORTUNE_DEFAULTS) self.retry = False def main(self): try: req = requests.get(self.conf['uri'], timeout=2) - advice = req.json()['text'] if req.status_code == 200 else 'N/A' + fortune = req.json()['text'] if req.status_code == 200 else 'N/A' self.retry = False except requests.exceptions.Timeout: - advice = 'N/A (timeout)' + fortune = 'N/A (timeout)' self.retry = True except requests.exceptions.ConnectionError: - advice = 'N/A (offline)' + fortune = 'N/A (offline)' self.retry = True - self.status['full_text'] = advice + self.format_status(fortune) def run(self): while True: diff --git a/plugins/load.py b/plugins/load.py index 75dd4a0..d68441f 100644 --- a/plugins/load.py +++ b/plugins/load.py @@ -2,7 +2,7 @@ import os import plugins -LOAD_DEFAULTS = {'freq': 20, 'problem': 1} +LOAD_DEFAULTS = {'title': 'LA', 'freq': 20, 'problem': 1} class PluginThread(plugins.PluginThreadCommon): @@ -13,8 +13,9 @@ class PluginThread(plugins.PluginThreadCommon): loads = os.getloadavg() if loads[0] >= self.conf['problem']: self.hide = False - self.status['urgent'] = True + urgent = True else: self.hide = True - self.status['urgent'] = False - self.status['full_text'] = 'LA: {:.2f} {:.2f} {:.2f}'.format(*loads) + urgent = False + status = '{:.2f} {:.2f} {:.2f}'.format(*loads) + self.format_status(status, urgent=urgent) diff --git a/plugins/mem.py b/plugins/mem.py index 1abc7eb..2eeaad5 100644 --- a/plugins/mem.py +++ b/plugins/mem.py @@ -2,7 +2,7 @@ import psutil import plugins -MEM_DEFAULTS = {'problem': 85} +MEM_DEFAULTS = {'title': 'RAM', 'problem': 85} class PluginThread(plugins.PluginThreadCommon): @@ -13,9 +13,9 @@ class PluginThread(plugins.PluginThreadCommon): mem_stat = psutil.virtual_memory() if mem_stat.percent > self.conf['problem']: self.hide = False - self.status['urgent'] = True + urgent = True else: self.hide = True - self.status['urgent'] = False + urgent = False mem_available = round(mem_stat.available / 2**30, 2) - self.status['full_text'] = 'RAM: {:.2f}G'.format(mem_available) + self.format_status('{:.2f}G'.format(mem_available), urgent) diff --git a/plugins/pacman.py b/plugins/pacman.py index edf36e9..625314b 100644 --- a/plugins/pacman.py +++ b/plugins/pacman.py @@ -11,12 +11,6 @@ PACMAN_DEFAULTS = { class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): super(PluginThread, self).__init__(config, PACMAN_DEFAULTS) - self.format_status(0) - - def format_status(self, count): - self.hide = count == 0 - self.status['urgent'] = count >= self.conf['problem'] - self.status['full_text'] = self.conf['title'] + ': ' + str(count) def main(self): pacman_qu = subprocess.Popen( @@ -25,5 +19,11 @@ class PluginThread(plugins.PluginThreadCommon): encoding='UTF-8' ) out = pacman_qu.communicate()[0].strip().splitlines() - packages = [pkg for pkg in out if not '[ignored]' in pkg] - self.format_status(len(packages)) + packages = len([pkg for pkg in out if not '[ignored]' in pkg]) + if packages: + self.hide = False + else: + self.hide = True + self.format_status( + str(packages), urgent=packages >= self.conf['problem'] + ) diff --git a/plugins/ping.py b/plugins/ping.py index 8e6a391..e919dea 100644 --- a/plugins/ping.py +++ b/plugins/ping.py @@ -1,33 +1,26 @@ import os +import subprocess import random import plugins PING_DEFAULTS = { - 'hosts': list(), 'title': 'PING', 'timeout': 150 + 'hosts': tuple(), 'title': 'PING', 'timeout': 150 } class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): super(PluginThread, self).__init__(config, PING_DEFAULTS) - self.format_status('n/a') - - def format_status(self, state): - self.status['full_text'] = self.conf['title'] + ': ' + state - if state == 'up': - self.status['urgent'] = False - self.hide = True - else: - self.status['urgent'] = True + self.ping_cmd = ('fping', '-c1', '-qt' + str(self.conf['timeout'])) def main(self): - random.shuffle(self.conf['hosts']) - for host in self.conf['hosts']: - fping = 'fping -qc1t' + str(self.conf['timeout'])\ - + ' ' + host + ' &>/dev/null' - response = os.system(fping) - if response == 0: - self.format_status('on') - break - self.format_status('down') + host = random.choice(self.conf['hosts']) + fping = subprocess.run( + (*self.ping_cmd, host), + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL + ) + if fping.returncode == 0: + self.format_status('up') + else: + self.format_status('down', urgent=True) diff --git a/vdstatus b/vdstatus index e5d8cf6..88b9a91 100755 --- a/vdstatus +++ b/vdstatus @@ -49,8 +49,9 @@ class PluginRunner: outputs = list() for plugin in self.plugins_loaded: if \ - not plugin.conf['hide_ok'] or \ - not plugin.hide: + 'full_text' in plugin.status and ( + not plugin.conf['hide_ok'] or not plugin.hide + ): outputs.append(plugin.status) print(self.format_output(outputs), flush=True) From d824345ba1e184b3e3e1e71aa2fd91fb292eb93c Mon Sep 17 00:00:00 2001 From: Von Random Date: Mon, 8 Jul 2019 14:19:05 +0300 Subject: [PATCH 07/10] plugins: improve readability, move to str().format() in many places --- plugins/__init__.py | 2 +- plugins/batt.py | 12 ++++++------ plugins/date.py | 6 ++++-- plugins/disk.py | 1 + plugins/filecat.py | 2 +- plugins/fortune.py | 1 + plugins/load.py | 3 ++- plugins/mem.py | 5 +++-- plugins/pacman.py | 6 +++--- plugins/ping.py | 2 +- 10 files changed, 23 insertions(+), 17 deletions(-) diff --git a/plugins/__init__.py b/plugins/__init__.py index 3f61ec8..016b462 100644 --- a/plugins/__init__.py +++ b/plugins/__init__.py @@ -19,7 +19,7 @@ class PluginThreadCommon: def format_status(self, status, urgent=False): if 'title' in self.conf: - full_text = self.conf['title'] + ': ' + status + full_text = '{}: {}'.format(self.conf['title'], status) else: full_text = status self.status.update({'full_text': full_text, 'urgent': urgent}) diff --git a/plugins/batt.py b/plugins/batt.py index b932ce5..4ec4595 100644 --- a/plugins/batt.py +++ b/plugins/batt.py @@ -1,7 +1,6 @@ import plugins -BATTERY_DIR = '/sys/class/power_supply/BAT0/' BATT_DEFAULTS = { 'problem': 15, 'symbol_charging': '\u2191', @@ -15,10 +14,10 @@ class PluginThread(plugins.PluginThreadCommon): def main(self): with \ - open(BATTERY_DIR + 'capacity', 'r') as batt_capacity, \ - open(BATTERY_DIR + 'status', 'r') as batt_status: - capacity = batt_capacity.readline().strip() - status_value = batt_status.readline().strip() + open('/sys/class/power_supply/BAT0/capacity', 'r') as bcap, \ + open('/sys/class/power_supply/BAT0/status', 'r') as bstat: + capacity = bcap.readline().strip() + status_value = bstat.readline().strip() if status_value != 'Discharging': symbol = self.conf['symbol_charging'] @@ -27,4 +26,5 @@ class PluginThread(plugins.PluginThreadCommon): symbol = self.conf['symbol_discharging'] urgent = float(capacity) <= self.conf['problem'] - self.format_status(capacity + '% ' + symbol, urgent=urgent) + status = '{}% {}'.format(capacity, symbol) + self.format_status(status, urgent) diff --git a/plugins/date.py b/plugins/date.py index 9e2a292..08e8601 100644 --- a/plugins/date.py +++ b/plugins/date.py @@ -14,5 +14,7 @@ class PluginThread(plugins.PluginThreadCommon): self.timezone = pytz.timezone(self.conf['tz']) def main(self): - now = datetime.datetime.now(tz=self.timezone) - self.format_status(now.strftime(self.conf['format'])) + now = datetime.datetime\ + .now(tz=self.timezone)\ + .strftime(self.conf['format']) + self.format_status(now) diff --git a/plugins/disk.py b/plugins/disk.py index 6085795..7797447 100644 --- a/plugins/disk.py +++ b/plugins/disk.py @@ -19,5 +19,6 @@ class PluginThread(plugins.PluginThreadCommon): else: self.hide = True self.status['urgent'] = False + status = '{:.2f}G'.format(du_stat.free / 2**30) self.format_status(status) diff --git a/plugins/filecat.py b/plugins/filecat.py index 5f404c9..0b6d82a 100644 --- a/plugins/filecat.py +++ b/plugins/filecat.py @@ -11,7 +11,6 @@ class PluginThread(plugins.PluginThreadCommon): def __init__(self, config): super(PluginThread, self).__init__(config, FILECAT_DEFAULTS) self.hide = False - self.format_status(self.conf['title'], False) def main(self): try: @@ -21,4 +20,5 @@ class PluginThread(plugins.PluginThreadCommon): except FileNotFoundError: contents = self.conf['nofile'] urgent = True + self.format_status(contents, urgent) diff --git a/plugins/fortune.py b/plugins/fortune.py index 0f35354..40b3f1d 100644 --- a/plugins/fortune.py +++ b/plugins/fortune.py @@ -25,6 +25,7 @@ class PluginThread(plugins.PluginThreadCommon): except requests.exceptions.ConnectionError: fortune = 'N/A (offline)' self.retry = True + self.format_status(fortune) def run(self): diff --git a/plugins/load.py b/plugins/load.py index d68441f..13c948f 100644 --- a/plugins/load.py +++ b/plugins/load.py @@ -18,4 +18,5 @@ class PluginThread(plugins.PluginThreadCommon): self.hide = True urgent = False status = '{:.2f} {:.2f} {:.2f}'.format(*loads) - self.format_status(status, urgent=urgent) + + self.format_status(status, urgent) diff --git a/plugins/mem.py b/plugins/mem.py index 2eeaad5..1463377 100644 --- a/plugins/mem.py +++ b/plugins/mem.py @@ -17,5 +17,6 @@ class PluginThread(plugins.PluginThreadCommon): else: self.hide = True urgent = False - mem_available = round(mem_stat.available / 2**30, 2) - self.format_status('{:.2f}G'.format(mem_available), urgent) + + status = '{:.2f}G'.format(mem_stat.available / 2**30) + self.format_status(status, urgent) diff --git a/plugins/pacman.py b/plugins/pacman.py index 625314b..2b4551f 100644 --- a/plugins/pacman.py +++ b/plugins/pacman.py @@ -24,6 +24,6 @@ class PluginThread(plugins.PluginThreadCommon): self.hide = False else: self.hide = True - self.format_status( - str(packages), urgent=packages >= self.conf['problem'] - ) + + urgent = packages >= self.conf['problem'] + self.format_status(packages, urgent) diff --git a/plugins/ping.py b/plugins/ping.py index e919dea..983a234 100644 --- a/plugins/ping.py +++ b/plugins/ping.py @@ -23,4 +23,4 @@ class PluginThread(plugins.PluginThreadCommon): if fping.returncode == 0: self.format_status('up') else: - self.format_status('down', urgent=True) + self.format_status('down', True) From b03a5881825ddf3f9f5831342a9bf61ed3a4970e Mon Sep 17 00:00:00 2001 From: Von Random Date: Mon, 28 Oct 2019 11:57:51 +0300 Subject: [PATCH 08/10] plugins: allow disabling of title field; pacman: rename to cmd; cmd: use first line of output as value, not line count --- plugins/__init__.py | 2 +- plugins/{pacman.py => cmd.py} | 14 ++++---------- 2 files changed, 5 insertions(+), 11 deletions(-) rename plugins/{pacman.py => cmd.py} (51%) diff --git a/plugins/__init__.py b/plugins/__init__.py index 016b462..262d144 100644 --- a/plugins/__init__.py +++ b/plugins/__init__.py @@ -18,7 +18,7 @@ class PluginThreadCommon: self.thread.daemon = True def format_status(self, status, urgent=False): - if 'title' in self.conf: + if 'title' in self.conf and self.conf['title']: full_text = '{}: {}'.format(self.conf['title'], status) else: full_text = status diff --git a/plugins/pacman.py b/plugins/cmd.py similarity index 51% rename from plugins/pacman.py rename to plugins/cmd.py index 2b4551f..839dffe 100644 --- a/plugins/pacman.py +++ b/plugins/cmd.py @@ -3,8 +3,8 @@ import subprocess PACMAN_DEFAULTS = { - 'cmd': ('/usr/bin/pacman', '-Qu'), - 'title': 'UPD', 'freq': 15, 'problem': 10 + 'cmd': ('/usr/bin/echo', 'I am cmd'), + 'title': 'CMD', 'freq': 15 } @@ -18,12 +18,6 @@ class PluginThread(plugins.PluginThreadCommon): stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL, encoding='UTF-8' ) - out = pacman_qu.communicate()[0].strip().splitlines() - packages = len([pkg for pkg in out if not '[ignored]' in pkg]) - if packages: - self.hide = False - else: - self.hide = True + out = pacman_qu.communicate()[0].strip().splitlines()[0] - urgent = packages >= self.conf['problem'] - self.format_status(packages, urgent) + self.format_status(out) From 94502d2d619036d2a1d87e2214d260b81024ce3b Mon Sep 17 00:00:00 2001 From: Von Random Date: Mon, 28 Oct 2019 15:55:35 +0300 Subject: [PATCH 09/10] batt: add default title; load: change default title --- plugins/batt.py | 1 + plugins/load.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/batt.py b/plugins/batt.py index 4ec4595..0876e6a 100644 --- a/plugins/batt.py +++ b/plugins/batt.py @@ -2,6 +2,7 @@ import plugins BATT_DEFAULTS = { + 'title': 'BAT', 'problem': 15, 'symbol_charging': '\u2191', 'symbol_discharging': '\u2193' diff --git a/plugins/load.py b/plugins/load.py index 13c948f..082ff47 100644 --- a/plugins/load.py +++ b/plugins/load.py @@ -2,7 +2,7 @@ import os import plugins -LOAD_DEFAULTS = {'title': 'LA', 'freq': 20, 'problem': 1} +LOAD_DEFAULTS = {'title': 'LOAD', 'freq': 20, 'problem': 1} class PluginThread(plugins.PluginThreadCommon): From 8e1cea8a01417b51a9dea4bea888ced21aadd251 Mon Sep 17 00:00:00 2001 From: Von Random Date: Tue, 24 Mar 2020 17:50:45 +0300 Subject: [PATCH 10/10] conf: some comment clarification, get rid of removed plugin; cmd: fix variable name leftovers from when it was just pacman plugin --- conf.yaml | 11 +++++++++-- plugins/cmd.py | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/conf.yaml b/conf.yaml index 4ce9b8f..b65cc52 100644 --- a/conf.yaml +++ b/conf.yaml @@ -1,5 +1,7 @@ # Typical plugin properties: # - name: plugin name (always required, all other properties are optional) +# note that a plugin can be used more than once (i.e. different +# timezones in the date plugin) # - title: title representation on the panel # - hide_ok: false to force display value even if it is below problem threshold # - problem: a threshold value to make a value urgent and / or display @@ -25,11 +27,16 @@ plugins: partition: /home problem: 90 -- name: pacman - - name: mem - name: load +- name: batt + - name: date format: '%a %d %H:%M' + +- name: date + title: UTC + tz: UTC + format: '%H:%M' diff --git a/plugins/cmd.py b/plugins/cmd.py index 839dffe..dcf29f3 100644 --- a/plugins/cmd.py +++ b/plugins/cmd.py @@ -13,11 +13,11 @@ class PluginThread(plugins.PluginThreadCommon): super(PluginThread, self).__init__(config, PACMAN_DEFAULTS) def main(self): - pacman_qu = subprocess.Popen( + proc = subprocess.Popen( self.conf['cmd'], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL, encoding='UTF-8' ) - out = pacman_qu.communicate()[0].strip().splitlines()[0] + out = proc.communicate()[0].strip().splitlines()[0] self.format_status(out)