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,
        },
    }
