const { promisify } = require('util'); const { exec } = require('child_process'); const internals = { kActiveIndicator: 'active', kFieldSeparator: '\n', kKeyValueSeparator: '=', kBlockSeparator: '\n\n', statusCommand: 'systemctl show --no-page -p Description -p ActiveState', formatStatusOutput(systemctlText) { const blocks = systemctlText.trim().split(internals.kBlockSeparator); return blocks .map((block) => { const fields = block.split(internals.kFieldSeparator); return fields.reduce((fieldObject, field) => { const [key, value] = field.split(internals.kKeyValueSeparator); return { ...fieldObject, [key]: value } }, {}) }) .reduce((statusObject, service) => { return { ...statusObject, [service.Description]: service.ActiveState === internals.kActiveIndicator } }, {}); }, exec: promisify(exec) }; module.exports = async (services) => { const { stdout } = await internals.exec(`${internals.statusCommand} ${services.join(' ')}`); return internals.formatStatusOutput(stdout); };