sd-notify.js 2.82 KB
/* eslint-disable global-require */
/* eslint-disable import/no-extraneous-dependencies */

const MODULE_NAME = 'KOMODO-SDK.SD-NOTIFY';

const USE_SYSTEMD_NOTIFY_PACKAGE = false;
const USE_SYSTEMD_NOTIFY_BIN = false;

const util = require('util');
const logger = require('tektrans-logger');
const matrix = require('./matrix');

const exec = util.promisify(require('child_process').exec);

const notifyUseSystemdNotify = async (statusMsg) => {
    try {
        const notify = require('systemd-notify');

        const status = statusMsg || 'Ready to go';

        logger.verbose(`${MODULE_NAME} 3B8DF3BC: Trying to notify systemd using systemd-notify package`, { status });

        await notify({
            ready: true,
            status,
            // pid: process.pid,
        });

        logger.info(`${MODULE_NAME} B905A857: Systemd ready notification has been sent using systemd-notify package`);

        return true;
    } catch (e) {
        logger.verbose(`${MODULE_NAME} 488B3245: Failed to notify using systemd-notify package`, {
            why: e.message || e.toString(),
        });

        return false;
    }
};

const notifyUseSdNotify = () => {
    try {
        const sdNotify = require('sd-notify');

        logger.verbose(`${MODULE_NAME} A200BF49: Trying to notify systemd using sd-notify package`);

        sdNotify.ready();
        matrix.systemd_notified = new Date();

        logger.info(`${MODULE_NAME} 701F8400: Systemd ready notification has been sent using sd-notify package`);

        return true;
    } catch (e) {
        logger.warn(`${MODULE_NAME} A6C99938: Optional dependency not found: sd-notify`);
        return false;
    }
};

const notifyUseBin = async () => {
    try {
        logger.verbose(`${MODULE_NAME} FFBCF4E3: Trying to notify systemd using systemd-notify bin`);
        await exec('systemd-notify --ready');
        logger.info(`${MODULE_NAME} B58921FF: Systemd ready notification has been sent using systemd-notify bin`);

        return true;
    } catch (e) {
        logger.verbose(`${MODULE_NAME} 75237B65: Failed to notify using systemd-notify bin`, {
            eCode: e.code,
            eMessage: e.message || e.toString(),
        });

        return false;
    }
};

/**
 *
 * @param {string} statusMsg
 * @returns
 */
module.exports = async (statusMsg) => {
    const { ppid } = process;

    if (ppid !== 1) {
        logger.verbose(`${MODULE_NAME} 74A5B2AF: No need to notify systemd`, { ppid });
        return;
    }

    if (USE_SYSTEMD_NOTIFY_PACKAGE) {
        const successOnUsingSystemdNotify = await notifyUseSystemdNotify(statusMsg);
        if (successOnUsingSystemdNotify) {
            return;
        }
    }

    if (USE_SYSTEMD_NOTIFY_BIN) {
        const successOnUsingBin = await notifyUseBin();
        if (successOnUsingBin) {
            return;
        }
    }

    notifyUseSdNotify();
};