172 lines
5.1 KiB
Python
172 lines
5.1 KiB
Python
from itertools import count
|
|
from os import listdir
|
|
from os.path import isdir, isfile, join
|
|
from pathlib import Path
|
|
from uuid import UUID
|
|
|
|
from bundlewrap.metadata import metadata_to_json
|
|
|
|
for row in Path(join(repo.path, 'bundles', 'grafana', 'dashboard-rows')).rglob("*.py"):
|
|
with open(row, 'r') as f:
|
|
exec(f.read())
|
|
|
|
directories = {
|
|
# Don't ask me why these permissions are that weird. It's what the
|
|
# debian package sets them to after upgrades.
|
|
'/etc/grafana/provisioning/dashboards': {
|
|
'group': 'grafana',
|
|
'purge': True,
|
|
},
|
|
'/etc/grafana/provisioning/datasources': {
|
|
'group': 'grafana',
|
|
'purge': True,
|
|
},
|
|
'/etc/grafana/provisioning/notifiers': {
|
|
'group': 'grafana',
|
|
'purge': True,
|
|
},
|
|
'/etc/grafana/provisioning/plugins': {
|
|
'group': 'grafana',
|
|
'purge': True,
|
|
},
|
|
'/var/lib/grafana/dashboards': {
|
|
'owner': 'grafana',
|
|
'group': 'grafana',
|
|
'purge': True,
|
|
'triggers': {
|
|
'svc_systemd:grafana-server:restart',
|
|
},
|
|
},
|
|
}
|
|
|
|
files = {
|
|
'/etc/grafana/grafana.ini': {
|
|
'content_type': 'mako',
|
|
'context': node.metadata['grafana'],
|
|
'group': 'grafana',
|
|
'mode': '0640',
|
|
'triggers': {
|
|
'svc_systemd:grafana-server:restart',
|
|
},
|
|
},
|
|
'/etc/grafana/provisioning/dashboards/bundlewrap.yaml': {
|
|
'source': 'dashboards.yaml',
|
|
'group': 'grafana',
|
|
'mode': '0640',
|
|
'triggers': {
|
|
'svc_systemd:grafana-server:restart',
|
|
},
|
|
},
|
|
}
|
|
|
|
svc_systemd = {
|
|
'grafana-server': {
|
|
'needs': {
|
|
'file:/etc/grafana/grafana.ini',
|
|
'pkg_apt:grafana',
|
|
},
|
|
},
|
|
}
|
|
|
|
### dashboard management starts here
|
|
for rnode in repo.nodes:
|
|
if not rnode.has_bundle('telegraf'):
|
|
continue
|
|
|
|
panel_id = count(start=1)
|
|
dashboard = {
|
|
'title': rnode.name,
|
|
'uid': UUID(int=rnode.magic_number).hex[:10],
|
|
|
|
'editable': False,
|
|
'graphTooltip': 1,
|
|
'schemaVersion': 12,
|
|
'style': 'dark',
|
|
'tags': {'bw'},
|
|
'time': {
|
|
'from': 'now-1d',
|
|
'to': 'now'
|
|
},
|
|
'version': 1,
|
|
|
|
'rows': [
|
|
dashboard_row_cpu(panel_id, rnode),
|
|
dashboard_row_ip_traffic(panel_id, rnode),
|
|
dashboard_row_memory(panel_id, rnode),
|
|
],
|
|
}
|
|
|
|
if rnode.has_bundle('ipmitool'):
|
|
dashboard['rows'].append(dashboard_row_ipmitool(panel_id, rnode))
|
|
dashboard['tags'].add('ipmitool')
|
|
elif rnode.has_bundle('lm-sensors'):
|
|
dashboard['rows'].append(dashboard_row_sensors(panel_id, rnode))
|
|
dashboard['tags'].add('lm-sensors')
|
|
|
|
if rnode.has_bundle('smartd'):
|
|
dashboard['rows'].append(dashboard_row_smartd(panel_id, rnode))
|
|
dashboard['tags'].add('smartd')
|
|
|
|
if rnode.has_bundle('telegraf-battery-usage'):
|
|
dashboard['rows'].append(dashboard_row_battery(panel_id, rnode))
|
|
|
|
dashboard['rows'].append(dashboard_row_disk_space(panel_id, rnode))
|
|
dashboard['rows'].append(dashboard_row_disk_iops(panel_id, rnode))
|
|
|
|
if rnode.has_bundle('nginx'):
|
|
dashboard['rows'].append(dashboard_row_nginx(panel_id, rnode))
|
|
dashboard['tags'].add('nginx')
|
|
|
|
if rnode.has_bundle('postfix'):
|
|
dashboard['rows'].append(dashboard_row_postfix(panel_id, rnode))
|
|
dashboard['tags'].add('postfix')
|
|
|
|
if rnode.has_bundle('dovecot'):
|
|
dashboard['rows'].append(dashboard_row_dovecot(panel_id, rnode))
|
|
dashboard['tags'].add('dovecot')
|
|
|
|
if rnode.has_bundle('rspamd'):
|
|
dashboard['rows'].append(dashboard_row_rspamd(panel_id, rnode))
|
|
dashboard['tags'].add('rspamd')
|
|
|
|
if rnode.has_bundle('postgresql'):
|
|
dashboard['rows'].append(dashboard_row_postgresql(panel_id, rnode))
|
|
dashboard['tags'].add('postgresql')
|
|
|
|
if rnode.has_bundle('wireguard'):
|
|
dashboard['rows'].append(dashboard_row_wireguard(panel_id, rnode))
|
|
dashboard['tags'].add('wireguard')
|
|
|
|
if rnode.has_bundle('zfs'):
|
|
dashboard['rows'].append(dashboard_row_zfs(panel_id, rnode))
|
|
dashboard['tags'].add('zfs')
|
|
|
|
if rnode.has_bundle('unbound'):
|
|
dashboard['rows'].append(dashboard_row_unbound(panel_id, rnode))
|
|
dashboard['tags'].add('unbound')
|
|
|
|
files[f'/var/lib/grafana/dashboards/{rnode.name}.json'] = {
|
|
'owner': 'grafana',
|
|
'group': 'grafana',
|
|
# use metadata_to_json, because this supports sets
|
|
'content': metadata_to_json(dashboard),
|
|
'triggers': {
|
|
'svc_systemd:grafana-server:restart',
|
|
},
|
|
}
|
|
|
|
|
|
additional_path = join(repo.path, 'data', 'grafana', 'files', node.name, 'dashboards')
|
|
if isdir(additional_path):
|
|
for file in listdir(additional_path):
|
|
if not isfile(join(additional_path, file)) or file.startswith('.') or file.startswith('_'):
|
|
continue
|
|
|
|
files[f'/var/lib/grafana/dashboards/{file}'] = {
|
|
'owner': 'grafana',
|
|
'group': 'grafana',
|
|
'source': join(node.name, 'dashboards', file),
|
|
'triggers': {
|
|
'svc_systemd:grafana-server:restart',
|
|
},
|
|
}
|