Add mondash status block
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
9355c7e7bc
commit
fd62fb861e
3 changed files with 168 additions and 0 deletions
90
.config/i3blocks/block.py
Normal file
90
.config/i3blocks/block.py
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
BTN_LEFT = 1
|
||||||
|
BTN_MIDDLE = 2
|
||||||
|
BTN_RIGHT = 3
|
||||||
|
|
||||||
|
COLOR_NONE = '#ffffff'
|
||||||
|
COLOR_DANGER = '#dd0000'
|
||||||
|
COLOR_SUCCESS = '#50fa7b'
|
||||||
|
COLOR_WARNING = '#ffd966'
|
||||||
|
COLOR_PRIMARY = '#8faafc'
|
||||||
|
COLOR_SECONDARY = '#7f7f7f'
|
||||||
|
|
||||||
|
VAR_BTN = 'BLOCK_BUTTON'
|
||||||
|
VAR_INSTANCE = 'BLOCK_INSTANCE'
|
||||||
|
VAR_NAME = 'BLOCK_NAME'
|
||||||
|
VAR_X = 'BLOCK_X'
|
||||||
|
VAR_Y = 'BLOCK_Y'
|
||||||
|
|
||||||
|
|
||||||
|
class Block:
|
||||||
|
def __init__(self, icon=None, icon_color=None):
|
||||||
|
self.ICON = icon if icon is not None else '\uf128'
|
||||||
|
self.ICON_COLOR = icon_color if icon_color is not None else COLOR_NONE
|
||||||
|
|
||||||
|
def button_is(self, btn):
|
||||||
|
"""
|
||||||
|
Checks whether a button was pressed on the widget and if so whether it was the expected one
|
||||||
|
"""
|
||||||
|
return VAR_BTN in os.environ and os.environ[VAR_BTN] != '' and int(os.environ[VAR_BTN]) == btn
|
||||||
|
|
||||||
|
def color_text(self, text, color=COLOR_NONE):
|
||||||
|
"""
|
||||||
|
Formats the given text with given color in pango markup
|
||||||
|
"""
|
||||||
|
return '<span color="{color}">{text}</span>'.format(
|
||||||
|
color=color,
|
||||||
|
text=text,
|
||||||
|
)
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
"""
|
||||||
|
Contains the logic of this block and needs to be overwritten in child class
|
||||||
|
"""
|
||||||
|
raise Exception('No exec implementation specified')
|
||||||
|
|
||||||
|
def instance(self):
|
||||||
|
"""
|
||||||
|
Returns the block-defined instance or empty string if none
|
||||||
|
"""
|
||||||
|
return os.environ[VAR_INSTANCE] if VAR_INSTANCE in os.environ else ''
|
||||||
|
|
||||||
|
def name(self):
|
||||||
|
"""
|
||||||
|
Returns the block-defined name or empty string if none
|
||||||
|
"""
|
||||||
|
return os.environ[VAR_NAME] if VAR_NAME in os.environ else ''
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
"""
|
||||||
|
Executes the block and prints out the formatted string for the block
|
||||||
|
"""
|
||||||
|
result = self.execute()
|
||||||
|
|
||||||
|
if result is None or len(result) == 0:
|
||||||
|
print(self.color_text(self.ICON, self.ICON_COLOR))
|
||||||
|
return
|
||||||
|
|
||||||
|
text = ''
|
||||||
|
if type(result) is list:
|
||||||
|
text = ' '.join(result)
|
||||||
|
else:
|
||||||
|
text = result
|
||||||
|
|
||||||
|
print('{icon} {text}'.format(
|
||||||
|
icon=self.color_text(self.ICON, self.ICON_COLOR),
|
||||||
|
text=text,
|
||||||
|
))
|
||||||
|
|
||||||
|
def set_icon(self, icon):
|
||||||
|
"""
|
||||||
|
Overwrites the icon speicfied in constructor
|
||||||
|
"""
|
||||||
|
self.ICON = icon
|
||||||
|
|
||||||
|
def set_icon_color(self, color):
|
||||||
|
"""
|
||||||
|
Overwrites the icon color speicfied in constructor
|
||||||
|
"""
|
||||||
|
self.ICON_COLOR = color
|
|
@ -32,6 +32,14 @@ markup=pango
|
||||||
[mpc]
|
[mpc]
|
||||||
interval=5
|
interval=5
|
||||||
|
|
||||||
|
[mondash]
|
||||||
|
instance=$env_MONDASH_PRIVATE
|
||||||
|
interval=30
|
||||||
|
|
||||||
|
[mondash]
|
||||||
|
instance=$env_MONDASH_ARCHNAS
|
||||||
|
interval=30
|
||||||
|
|
||||||
[github]
|
[github]
|
||||||
interval=300
|
interval=300
|
||||||
|
|
||||||
|
|
70
.config/i3blocks/mondash
Executable file
70
.config/i3blocks/mondash
Executable file
|
@ -0,0 +1,70 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
from block import *
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
ICON = '\ufa6d'
|
||||||
|
MONDASH_URL = 'https://mondash.org/{dashid}'
|
||||||
|
STATUS_COLOR = {
|
||||||
|
'OK': COLOR_SUCCESS,
|
||||||
|
'Warning': COLOR_WARNING,
|
||||||
|
'Critical': COLOR_DANGER,
|
||||||
|
'Unknown': COLOR_SECONDARY,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Mondash(Block):
|
||||||
|
def dashid(self):
|
||||||
|
id = self.instance()
|
||||||
|
|
||||||
|
if id.startswith('$env_'):
|
||||||
|
id = os.environ[id[5:]]
|
||||||
|
|
||||||
|
return id
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
if self.button_is(BTN_LEFT):
|
||||||
|
subprocess.check_call([
|
||||||
|
'xdg-open',
|
||||||
|
MONDASH_URL.format(dashid=self.dashid()),
|
||||||
|
])
|
||||||
|
|
||||||
|
result = []
|
||||||
|
|
||||||
|
for status, count in self.get_counts().items():
|
||||||
|
if count == 0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
color = STATUS_COLOR[status]
|
||||||
|
|
||||||
|
result.append(self.color_text(str(count), color))
|
||||||
|
|
||||||
|
return ' / '.join(result)
|
||||||
|
|
||||||
|
def get_counts(self):
|
||||||
|
counts = {'OK': 0, 'Warning': 0, 'Critical': 0, 'Unknown': 0}
|
||||||
|
|
||||||
|
url = MONDASH_URL.format(dashid=self.dashid()) + '.json'
|
||||||
|
data = requests.get(url).json()
|
||||||
|
|
||||||
|
if not 'metrics' in data:
|
||||||
|
raise Exception('No metrics block found in result data')
|
||||||
|
|
||||||
|
for metric in data['metrics']:
|
||||||
|
counts[metric['status']] += 1
|
||||||
|
|
||||||
|
return counts
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
block = Mondash(ICON)
|
||||||
|
block.render()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
Loading…
Reference in a new issue