queues-and-providers.js 2.88 KB
const fs = require('fs');

const config = require('komodo-sdk/config');
const logger = require('komodo-sdk/logger');
const smstoolsConfig = require('./config-file');

const queuesBaseDir = config.smstools_queues_base_dir || '/var/spool/sms/queue';

function composeQueueDir(queueName) {
    return `${queuesBaseDir}/${queueName}`;
}

async function createDirectory(dirname) {
    let isExists = true;
    try {
        await fs.promises.access(dirname);
    } catch (e) {
        isExists = false;
    }

    if (isExists) return;

    try {
        fs.promises.mkdir(dirname, { recursive: true, mode: 0o770 });
    } catch (e) {
        logger.warn('QUEUES-AND-PROVIDERS: Exception on creating directory', {
            dirname,
            e: e.message || e.toString(),
        });
    }
}

function queuesSorted(queuesArray) {
    const result = (queuesArray || smstoolsConfig.queues || []).sort((a, b) => {
        const orderA = (a && Number(a.order)) || 0;
        const orderB = (b && Number(b.order)) || 0;

        if (orderA < orderB) return -1;
        if (orderA > orderB) return 1;
        return 0;
    });

    return result;
}

exports.dump = async (mkdirIfQueueDirNotExists) => {
    if (config.smstools_disable_queue) return '';

    const queues = queuesSorted();
    const queuesCount = queues.length;

    const configLines = ['[queues]'];
    const providerLines = ['[providers]'];
    const queuesDirs = [];
    let hasQueues = false;
    let hasProviders = false;
    for (let i = 0; i < queuesCount; i += 1) {
        const queue = queues[i];

        // eslint-disable-next-line no-continue
        if (!queue.name || !queue.enabled) continue;

        const queueDir = composeQueueDir(queue.name);
        queuesDirs.push(queueDir);
        if (mkdirIfQueueDirNotExists) {
            // eslint-disable-next-line no-await-in-loop
            await createDirectory(queueDir);
        }

        const line = `${queue.name} = ${queueDir}`;
        configLines.push(line);
        hasQueues = true;

        const hasPrefix = queue.prefix && queue.prefix.length;
        if (hasPrefix) {
            const providerLine = `${queue.name} = ${queue.prefix.join(', ')}`;
            providerLines.push(providerLine);
            hasProviders = true;
        } else {
            logger.verbose(`QUEUES-AND-PROVIDERS: DEBUG: ${queue.name} does not have prefix`);
        }
    }

    if (!hasQueues) return '';

    if (!hasProviders) {
        return configLines.join('\n');
    }

    return `${configLines.join('\n')}\n\n${providerLines.join('\n')}`;
};

exports.getModemQueueName = (modemName) => {
    const queues = queuesSorted().filter((queue) => {
        if (!queue.name || !queue.enabled) return false;
        return (queue.modems || []).indexOf(modemName) >= 0;
    });

    return (queues || '').map((queue) => queue.name);
};

exports.hasQueues = () => !!(smstoolsConfig.queues || []).filter((queue) => queue.enabled);