78 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
defaults = {
 | 
						|
    'systemd': {
 | 
						|
        'units': {},
 | 
						|
        'services': {},
 | 
						|
        'logind': {},
 | 
						|
    },
 | 
						|
    'monitoring': {
 | 
						|
        'services': {
 | 
						|
            'systemd': {
 | 
						|
                'vars.command': "systemctl --failed --no-legend | wc -l | grep -q '^0$' && exit 0 || systemctl --failed && exit 2",
 | 
						|
            },
 | 
						|
        },
 | 
						|
    },
 | 
						|
}
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'systemd/units',
 | 
						|
)
 | 
						|
def units(metadata):
 | 
						|
    units = {}
 | 
						|
 | 
						|
    for name, config in metadata.get('systemd/units').items():
 | 
						|
        if '/' in name:
 | 
						|
            continue
 | 
						|
 | 
						|
        type = name.split('.')[-1]
 | 
						|
 | 
						|
        if type == 'service':
 | 
						|
            if not config.get('Install', {}).get('WantedBy', set()):
 | 
						|
                units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'multi-user.target'})
 | 
						|
        elif type == 'timer':
 | 
						|
            units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'timers.target'})
 | 
						|
        elif type == 'mount':
 | 
						|
            units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'local-fs.target'})
 | 
						|
            units.setdefault(name, {}).setdefault('Unit', {}).setdefault('Conflicts', {'umount.target'})
 | 
						|
            units.setdefault(name, {}).setdefault('Unit', {}).setdefault('Before', {'umount.target'})
 | 
						|
 | 
						|
    return {
 | 
						|
        'systemd': {
 | 
						|
            'units': units,
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'systemd/services',
 | 
						|
)
 | 
						|
def services(metadata):
 | 
						|
    services = {}
 | 
						|
 | 
						|
    for name, config in metadata.get('systemd/services').items():
 | 
						|
        extension = name.split('.')[-1]
 | 
						|
 | 
						|
        if extension not in ['timer', 'service', 'mount', 'swap']:
 | 
						|
            raise Exception(f'unknown extension: {extension}')
 | 
						|
 | 
						|
    return {
 | 
						|
        'systemd': {
 | 
						|
            'services': services,
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'monitoring/services',
 | 
						|
)
 | 
						|
def monitoring(metadata):
 | 
						|
    return {
 | 
						|
        'monitoring': {
 | 
						|
            'services': {
 | 
						|
                name: {
 | 
						|
                    'vars.command': f"/bin/sh -c '/usr/bin/systemctl is-failed {name} && /usr/bin/systemctl status {name} && exit 2 || exit 0'"
 | 
						|
                }
 | 
						|
                    for name in metadata.get('systemd/units')
 | 
						|
                    if name.endswith('.service')
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 |