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/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': { 'smartd': '\n'.join(sorted(lines)), }, }