aboutsummaryrefslogtreecommitdiff
path: root/lib/index.js
blob: d5d9668985eebd163ad658633b64537a33134996 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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);
};