bundlewrap/bundles/grafana/items.py
Franziska Kunsmann eb6ae208cb
All checks were successful
bundlewrap/pipeline/head This commit looks good
bundles/grafana: fix file system permissions
2021-05-15 07:33:21 +02:00

144 lines
4 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 = {
'/etc/grafana/provisioning/dashboards': {
'owner': 'grafana',
'group': 'grafana',
'purge': True,
},
'/etc/grafana/provisioning/datasources': {
'owner': 'grafana',
'group': 'grafana',
'purge': True,
},
'/etc/grafana/provisioning/notifiers': {
'owner': 'grafana',
'group': 'grafana',
'purge': True,
},
'/etc/grafana/provisioning/plugins': {
'owner': 'grafana',
'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'],
'owner': 'grafana',
'group': 'grafana',
'mode': '0640',
'triggers': {
'svc_systemd:grafana-server:restart',
},
},
'/etc/grafana/provisioning/dashboards/bundlewrap.yaml': {
'source': 'dashboards.yaml',
'owner': 'grafana',
'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,
'refresh': '1m',
'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),
dashboard_row_disk_space(panel_id, rnode),
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('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')
files[f'/var/lib/grafana/dashboards/{rnode.name}.json'] = {
# 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',
},
}