196 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#import re
 | 
						|
 | 
						|
defaults = {
 | 
						|
    'apt': {
 | 
						|
        'packages': {
 | 
						|
            'parted':{
 | 
						|
                'needed_by': {
 | 
						|
                    'pkg_apt:zfs-zed',
 | 
						|
                    'pkg_apt:zfsutils-linux',
 | 
						|
                },
 | 
						|
            },
 | 
						|
            'zfs-dkms': {
 | 
						|
                'backports': node.os_version < (11,),
 | 
						|
                'needed_by': {
 | 
						|
                    'pkg_apt:zfs-zed',
 | 
						|
                    'pkg_apt:zfsutils-linux',
 | 
						|
                },
 | 
						|
            },
 | 
						|
            'zfs-zed': {
 | 
						|
                'backports': node.os_version < (11,),
 | 
						|
                'needed_by': {
 | 
						|
                    'zfs_dataset:',
 | 
						|
                    'zfs_pool:',
 | 
						|
                },
 | 
						|
            },
 | 
						|
            'zfsutils-linux': {
 | 
						|
                'backports': node.os_version < (11,),
 | 
						|
                'needed_by': {
 | 
						|
                    'pkg_apt:zfs-zed',
 | 
						|
                    'zfs_dataset:',
 | 
						|
                    'zfs_pool:',
 | 
						|
                },
 | 
						|
            },
 | 
						|
            'zfs-auto-snapshot': {},
 | 
						|
        },
 | 
						|
    },
 | 
						|
    'monitoring': {
 | 
						|
        'services': {
 | 
						|
            'zpool online': {
 | 
						|
                'vars.command': f'/usr/lib/nagios/plugins/check_zpool_online',
 | 
						|
                'check_interval': '1h',
 | 
						|
                'vars.sudo': True,
 | 
						|
            },
 | 
						|
            'zpool space': {
 | 
						|
                'vars.command': f'/usr/lib/nagios/plugins/check_zpool_space',
 | 
						|
            },
 | 
						|
        },
 | 
						|
    },
 | 
						|
    'systemd-timers': {
 | 
						|
        'zfs-trim': {
 | 
						|
            'command': '/usr/lib/zfs-linux/trim',
 | 
						|
            'when': '*-*-1 02:00', # first day of a month at 02:00
 | 
						|
            'persistent': True,
 | 
						|
        },
 | 
						|
        'zfs-scrub': {
 | 
						|
            'command': '/usr/lib/zfs-linux/scrub',
 | 
						|
            'when': '*-2,4,6,8,10,12-2 02:00', # second day of every second month at 02:00
 | 
						|
            'persistent': True,
 | 
						|
        },
 | 
						|
    },
 | 
						|
    'telegraf': {
 | 
						|
        'config': {
 | 
						|
            'inputs': {
 | 
						|
                'zfs': [{}],
 | 
						|
            },
 | 
						|
        },
 | 
						|
    },
 | 
						|
    'grafana_rows': {
 | 
						|
        'zfs_arc',
 | 
						|
    },
 | 
						|
    'zfs': {
 | 
						|
        'datasets': {},
 | 
						|
        'pools': {},
 | 
						|
        'kernel_params': {},
 | 
						|
        'storage_classes': {
 | 
						|
            'hdd': 'tank',
 | 
						|
        },
 | 
						|
        'auto_snapshots': {
 | 
						|
            'hourly': 24,
 | 
						|
            'daily': 7,
 | 
						|
            'weekly': 4,
 | 
						|
            'monthly': 24,
 | 
						|
        },
 | 
						|
        'import-cache': True,
 | 
						|
    },
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'zfs/datasets'
 | 
						|
)
 | 
						|
def dataset_defaults(metadata):
 | 
						|
    return {
 | 
						|
        'zfs': {
 | 
						|
            'datasets': {
 | 
						|
                name: {
 | 
						|
                    'compression': 'lz4',
 | 
						|
                    'relatime': 'on',
 | 
						|
                } for name, config in metadata.get('zfs/datasets').items()
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'backup/paths'
 | 
						|
)
 | 
						|
def backup(metadata):
 | 
						|
    return {
 | 
						|
        'backup': {
 | 
						|
            'paths': {
 | 
						|
                options['mountpoint']
 | 
						|
                    for options in metadata.get('zfs/datasets').values()
 | 
						|
                    if options.get('backup', True)
 | 
						|
                    and not options.get('mountpoint', None) in [None, 'none']
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'apt/packages'
 | 
						|
)
 | 
						|
def headers(metadata):
 | 
						|
    arch = metadata.get('system/architecture')
 | 
						|
 | 
						|
    return {
 | 
						|
        'apt': {
 | 
						|
            'packages': {
 | 
						|
                f'linux-headers-{arch}': {
 | 
						|
                    'needed_by': {
 | 
						|
                        'pkg_apt:zfs-dkms',
 | 
						|
                    },
 | 
						|
                },
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'zfs/kernel_params/zfs_arc_max',
 | 
						|
)
 | 
						|
def arc_size(metadata):
 | 
						|
    arc_percent = metadata.get('zfs/zfs_arc_max_percent', None)
 | 
						|
 | 
						|
    if arc_percent:
 | 
						|
        return {
 | 
						|
            'zfs': {
 | 
						|
                'kernel_params': {
 | 
						|
                    'zfs_arc_max': str(int(
 | 
						|
                        metadata.get('vm/ram') * 1024 * 1024 * (arc_percent/100)
 | 
						|
                    )),
 | 
						|
                },
 | 
						|
            },
 | 
						|
        }
 | 
						|
    else:
 | 
						|
        return {}
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'systemd-timers/zfs-auto-snapshot-hourly',
 | 
						|
    'systemd-timers/zfs-auto-snapshot-daily',
 | 
						|
    'systemd-timers/zfs-auto-snapshot-weekly',
 | 
						|
    'systemd-timers/zfs-auto-snapshot-monthly',
 | 
						|
)
 | 
						|
def auto_snapshots(metadata):
 | 
						|
    hourly = metadata.get('zfs/auto_snapshots/hourly')
 | 
						|
    daily = metadata.get('zfs/auto_snapshots/daily')
 | 
						|
    weekly = metadata.get('zfs/auto_snapshots/weekly')
 | 
						|
    monthly = metadata.get('zfs/auto_snapshots/monthly')
 | 
						|
 | 
						|
    # cant be 0
 | 
						|
    assert hourly > 0 and daily > 0 and weekly > 0 and monthly > 0
 | 
						|
 | 
						|
    return {
 | 
						|
        'systemd-timers': {
 | 
						|
            'zfs-auto-snapshot-hourly': {
 | 
						|
                'command': f'/usr/sbin/zfs-auto-snapshot --quiet --syslog --label=hourly --keep={hourly} //',
 | 
						|
                'when': 'hourly',
 | 
						|
            },
 | 
						|
            'zfs-auto-snapshot-daily': {
 | 
						|
                'command': f'/usr/sbin/zfs-auto-snapshot --quiet --syslog --label=daily --keep={daily} //',
 | 
						|
                'when': 'daily',
 | 
						|
            },
 | 
						|
            'zfs-auto-snapshot-weekly': {
 | 
						|
                'command': f'/usr/sbin/zfs-auto-snapshot --quiet --syslog --label=weekly --keep={weekly} //',
 | 
						|
                'when': 'weekly',
 | 
						|
                'persistent': True,
 | 
						|
            },
 | 
						|
            'zfs-auto-snapshot-monthly': {
 | 
						|
                'command': f'/usr/sbin/zfs-auto-snapshot --quiet --syslog --label=monthly --keep={monthly} //',
 | 
						|
                'when': 'monthly',
 | 
						|
                'persistent': True,
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 |