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': 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') }, }, }