103 lines
2.4 KiB
Python
103 lines
2.4 KiB
Python
defaults = {
|
|
'apt': {
|
|
'packages': {
|
|
'smartmontools': {},
|
|
'nvme-cli': {},
|
|
},
|
|
},
|
|
'icinga2_api': {
|
|
'smartd': {
|
|
'services': {
|
|
'SMARTD PROCESS': {
|
|
'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_systemd_unit smartd',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
|
|
@metadata_reactor.provides(
|
|
'smartd/disks',
|
|
)
|
|
def zfs_disks_to_metadata(metadata):
|
|
disks = set()
|
|
|
|
for config in metadata.get('zfs/pools', {}).values():
|
|
for option in config['when_creating']['config']:
|
|
if option.get('type', '') in {'log', 'cache'}:
|
|
continue
|
|
|
|
for disk in option['devices']:
|
|
disks.add(disk)
|
|
|
|
return {
|
|
'smartd': {
|
|
'disks': disks,
|
|
},
|
|
}
|
|
|
|
|
|
@metadata_reactor.provides(
|
|
'icinga2_api/smartd/services',
|
|
)
|
|
def icinga(metadata):
|
|
services = {}
|
|
|
|
for disk in metadata.get('smartd/disks', set()):
|
|
services[f'SMART STATUS {disk}'] = {
|
|
'command_on_monitored_host': f'sudo /usr/local/share/icinga/plugins/check_smart -d {disk} -i auto',
|
|
'vars.notification.mail': True,
|
|
}
|
|
|
|
return {
|
|
'icinga2_api': {
|
|
'smartd': {
|
|
'services': services,
|
|
},
|
|
},
|
|
}
|
|
|
|
|
|
@metadata_reactor.provides(
|
|
'telegraf/input_plugins/builtin/smart',
|
|
)
|
|
def telegraf(metadata):
|
|
if not node.has_bundle('telegraf'):
|
|
raise DoNotRunAgain
|
|
|
|
if metadata.get('smartd/disks', set()):
|
|
return {
|
|
'telegraf': {
|
|
'input_plugins': {
|
|
'builtin': {
|
|
'smart': [{
|
|
'devices': list(sorted(metadata.get('smartd/disks'))),
|
|
}],
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
return {}
|
|
|
|
|
|
@metadata_reactor.provides(
|
|
'cron/jobs/smartd',
|
|
)
|
|
def monthly_long_test(metadata):
|
|
lines = set()
|
|
|
|
for number, disk in enumerate(sorted(metadata.get('smartd/disks', set()))):
|
|
lines.add('0 3 {} * * root /usr/sbin/smartctl --test=long {} >/dev/null'.format(
|
|
number+1, # enumerate() starts at 0
|
|
disk,
|
|
))
|
|
|
|
return {
|
|
'cron': {
|
|
'jobs': {
|
|
'smartd': '\n'.join(sorted(lines)),
|
|
},
|
|
},
|
|
}
|