defaults = { 'apt': { 'packages': { 'smartmontools': { 'needed_by': { 'svc_systemd:smartd', }, }, 'nvme-cli': { 'needed_by': { 'svc_systemd:smartd', }, }, }, }, 'icinga2_api': { 'smartd': { 'services': { 'SMARTD PROCESS': { 'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_systemd_unit smartd', }, }, }, }, } if node.has_bundle('telegraf'): defaults['telegraf'] = { 'input_plugins': { 'exec': { 'smartd': { 'commands': ['sudo /usr/local/sbin/telegraf-smartd'], 'data_format': 'influx', 'timeout': '5s', }, }, }, 'sudo_commands': { '/usr/local/sbin/telegraf-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( '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)), }, }, }