import re

defaults = {
    'cron': {
        'zfs-auto-snapshot-daily': '0 0 * * * root /usr/local/sbin/zfs-auto-snapshot daily',
        'zfs-auto-snapshot-hourly': '0 * * * * root /usr/local/sbin/zfs-auto-snapshot hourly',
        'zfs-auto-snapshot-monthly': '0 0 1 * * root /usr/local/sbin/zfs-auto-snapshot monthly',
        'zfs-auto-snapshot-weekly': '0 0 * * 7 root /usr/local/sbin/zfs-auto-snapshot weekly',
    },
    'zfs': {
        'datasets': {},
        'pools': {},
        'snapshots': {
#            'backup': {
#                'enabled': True,
#                'filesystems_with_snapshot': {},
#            },
            'retain_defaults': {
                'hourly': 24,
                'daily': 7,
                'weekly': 2,
                'monthly': 1,
            },
        },
    },
}

#if node.has_bundle('telegraf'):
#    defaults.update({
#        'telegraf': {
#            'input_plugins': {
#                'exec': {
#                    'zfs_dataset': {
#                        'command': 'telegraf-zfs-dataset',
#                        'interval': '120s',
#                    },
#                },
#                'zfs': {},
#            },
#        },
#    })
#    defaults['sudo']['verbatim'].add('telegraf ALL=(ALL) NOPASSWD:/sbin/zfs list *')

if node.has_bundle('sshmon'):
    defaults.update({
        'icinga2_api': {
            'zfs': {
                'services': {
                    'ZFS AUTO SNAPSHOT': {
                        'command_on_monitored_host': '/usr/lib/nagios/plugins/check_zfs_auto_snapshot',
                    },
                    'ZFS MOUNTED VOLUMES': {
                        'command_on_monitored_host': '/usr/lib/nagios/plugins/check_zfs_volumes',
                    },
                },
            },
        },
    })


@metadata_reactor
def zfs_scrub_cronjob(metadata):
    when = metadata.get('zfs/scrub/cron', '{} 0 * * sun'.format((node.magic_number % 60)))
    return {
        'cron': {
            'zfs-scrub': '{} root /usr/lib/zfs-linux/scrub'.format(when),
        },
    }


# TODO
#@metadata_reactor
#def zfs_snapshot_backup(metadata):
#    if metadata.get('zfs/snapshots/backup/enabled'):
#        # Collect all filesystems/datasets (e.g., "tank/mysql") which
#        # are configured for (local) snapshots. For each of them, store
#        # the mountpoint. This information will be used primarily by
#        # "/usr/local/sbin/zfs-backup-snapshot", but may also be used by
#        # other bundles (think backup tools).
#        #
#        # In other words, this API allows other bundles to check whether
#        # a path belongs to a ZFS dataset with snapshots enabled.
#
#        filesystems = {}
#
#        if metadata.get('zfs/snapshots/snapshot_only', None) is not None:
#            for name in metadata.get('zfs/snapshots/snapshot_only'):
#                attrs = metadata.get('zfs/datasets')[name]
#                if attrs.get('mountpoint') not in (None, "none"):
#                    filesystems[name] = attrs['mountpoint']
#        else:
#            for name, attrs in metadata.get('zfs/datasets').items():
#                if attrs.get('mountpoint') not in (None, "none"):
#                    filesystems[name] = attrs['mountpoint']
#
#        for pattern in metadata.get('zfs/snapshots/snapshot_never', set()):
#            filesystems = {k: v for k, v in filesystems.items() if not re.search(pattern, k)}
#
#        return {
#            'zfs': {
#                'snapshots': {
#                    'backup': {
#                        'filesystems_with_snapshot': filesystems,
#                    },
#                },
#            },
#        }
#    else:
#        return {}


@metadata_reactor
def monitoring(metadata):
    if not node.has_bundle('sshmon'):
        raise DoNotRunAgain

    services = {}

    for poolname, pool_options in metadata.get('zfs/pools').items():
        services['ZFS ZPOOL ONLINE {}'.format(poolname)] = {
            'command_on_monitored_host': 'sudo /usr/lib/nagios/plugins/check_zpool_online {}'.format(poolname),
        }

        services['ZFS ZPOOL SPACE ' + poolname] = {
            'command_on_monitored_host': 'sudo /usr/lib/nagios/plugins/check_zpool_space {} 90'.format(poolname)
        }


    services['ZFS OLD SNAPSHOTS'] = {
        'command_on_monitored_host': 'sudo /usr/lib/nagios/plugins/check_zfs_old_snapshots',
    }

    return {
        'icinga2_api': {
            'zfs': {
                'services': services,
            },
        },
    }