From 2d72aab0a88baa906127489e1c25fd11881bdc35 Mon Sep 17 00:00:00 2001 From: Ruben Beltran del Rio Date: Tue, 8 Jun 2021 21:37:55 +0200 Subject: Add the monitor --- lib/index.js | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 lib/index.js (limited to 'lib') diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..d5d9668 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,44 @@ +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 Id -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.Id]: service.ActiveState === internals.kActiveIndicator + } + }, {}); + }, + + exec: promisify(exec) +}; + +module.exports = async (services) => { + + const { stdout } = await internals.exec(`${internals.statusCommand} ${services.join(' ')}`); + return internals.formatStatusOutput(stdout); +}; -- cgit