from re import search defaults = { 'apt': { 'packages': { 'smartmontools': { 'needed_by': { 'svc_systemd:smartmontools', }, }, 'nvme-cli': { 'needed_by': { 'svc_systemd:smartmontools', }, }, }, }, 'icinga2_api': { 'smartd': { 'services': { 'SMARTD PROCESS': { 'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_systemd_unit smartmontools', }, }, }, }, } 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']: if search(r'p([0-9]+)$', disk) or disk.startswith('/dev/mapper/'): continue 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( 'systemd-timers/timers', ) def monthly_long_test(metadata): timers = {} for day, disk in enumerate(sorted(metadata.get('smartd/disks', set())), start=1): timers[f'smartd{disk.replace("/", "-")}'] = { 'command': f'/usr/sbin/smartctl --test=long {disk}', 'when': f'*-*-{day} 03:00:00 UTC', } return { 'systemd-timers': { 'timers': timers, }, }