disk/storagebox_df: monitor Hetzner Storagebox disk free

This plugin is similar to df plugin, but monitors Storagebox disk instead.
It requires config and ssh keys to access Storagebox.
This commit is contained in:
Kim B. Heino 2023-03-07 11:08:37 +02:00
parent e70e5320f1
commit b52691ad66
1 changed files with 99 additions and 0 deletions

99
plugins/disk/storagebox_df Executable file
View File

@ -0,0 +1,99 @@
#!/usr/bin/env python3
"""Munin plugin to monitor Hetzner Storagebox disk free.
=head1 NAME
storagebox_df - monitor Hetzner Storagebox disk free
=head1 APPLICABLE SYSTEMS
Systems with access to Hetzner Storagebox.
=head1 CONFIGURATION
Command to ssh+df must be specified. Plugin does not have access to munin's
home directory so ssh-key have to copied and specified.
[storagebox_df]
user root
env.command ssh -i /etc/munin/id_ed25519 \
-o UserKnownHostsFile=/etc/munin/known_hosts -p 23 \
uXXXXXX@uXXXXXX.your-storagebox.de df
=head1 AUTHOR
Kim B. Heino <b@bbbs.net>
=head1 LICENSE
GPLv2
=cut
"""
import os
import subprocess
import sys
def run_binary(arg):
"""Run binary and return output."""
try:
return subprocess.run(arg, check=False, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, encoding='utf-8').stdout
except FileNotFoundError:
return ''
def warning_critical(graph, name, warning=None, critical=None):
"""Print warning/critical config entries."""
warning = os.environ.get(f'{graph}{name}_warning', warning)
critical = os.environ.get(f'{graph}{name}_critical', critical)
if warning and warning != ':':
print(f'{name}.warning {warning}')
if critical and critical != ':':
print(f'{name}.critical {critical}')
def get_df():
"""Get and parse df status."""
command = os.environ.get('command', '').split()
if not command:
return None
for line in run_binary(command).splitlines():
if '%' not in line or '/' not in line:
continue
items = line.split()
return items[0], items[4][:-1]
return None
def config(data):
"""Print plugin config."""
print('graph_title Storagebox usage in percent')
print('graph_info Storagebox device usage in percent.')
print('graph_category disk')
print('graph_vlabel %')
print('graph_args --lower-limit 0 --upper-limit 100')
print('graph_scale no')
print(f'df.label {data[0] if data else "Unknown"}')
warning_critical('', 'df', 92, 98)
if os.environ.get('MUNIN_CAP_DIRTYCONFIG') == '1':
fetch(data)
def fetch(data):
"""Print values."""
if data:
print(f'df.value {data[1]}')
if __name__ == '__main__':
if len(sys.argv) > 1 and sys.argv[1] == 'autoconf':
print('no (not an autoconf plugin)')
elif len(sys.argv) > 1 and sys.argv[1] == 'config':
config(get_df())
else:
fetch(get_df())