defaults = { 'apt': { 'packages': { 'smartmontools': {}, }, }, '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', {}).items(): if 'device' in config: disks.add(config['device']) else: for t in {'mirror', 'raidz', 'raidz2', 'raidz3'}: for device in config.get(t, set()): disks.add(device) 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', {}): return { 'telegraf': { 'input_plugins': { 'builtin': { 'smart': [{ 'devices': list(sorted(metadata.get('smartd/disks'))), }], }, }, }, } return {}