smstools-config.js 4.96 KB
const childProcess = require('child_process');

const express = require('express');
const bodyParser = require('body-parser');

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

const smstoolsConfig = require('../../smstools-config');
const smstoolsConfigData = require('../../smstools-config/config-file');
const smstoolsConfigCreator = require('../../smstools-config/creator');
const smstoolsConfigSetter = require('../../smstools-config/setter');
const queuesAndProviders = require('../../smstools-config/queues-and-providers');


const router = express.Router();
module.exports = router;

async function pageIndex(req, res) {
    const configString = await smstoolsConfigCreator();
    res.json({
        dirty: smstoolsConfig.config.dirty,
        config: smstoolsConfig.config,
        configStringLength: configString.length,
        configStringNrLines: (configString.match(/\n/g) || []).length,
        configString,
    });
}

async function pageGenerate(req, res) {
    res.end(await smstoolsConfigCreator());
}

async function pageModemList(req, res) {
    const modems = [];
    // eslint-disable-next-line no-restricted-syntax
    for (const [key, value] of Object.entries(smstoolsConfigData.modems || {})) {
        modems.push({
            label: `${key}: ${value.device}, INCOMING${value.outgoing ? ' and OUTGOING' : ''}`,
            value: key,
            data: value,
        });
    }

    res.json(modems);
}

async function pageSet(req, res) {
    const keyword = (req.params.keyword || req.query.keyword || '').trim();
    const value = (req.query.value || '').trim();

    if (!keyword) {
        res.end('Invalid keyword');
        return;
    }

    const result = await smstoolsConfigSetter.set(keyword, value);
    res.json({
        dirty: !!smstoolsConfigData.dirty,
        result,
    });
}

async function pageModemSet(req, res) {
    if (!req.body) {
        res.json({
            status: 'NOT OK',
            message: 'Empty body',
        });
        return;
    }

    const modemName = (req.params.modemName || '').trim();
    if (!modemName) {
        res.json({
            status: 'NOT OK',
            message: 'Invalid modem name',
        });
        return;
    }

    const result = await smstoolsConfigSetter.setModem(modemName, req.body);
    res.json({
        dirty: !!smstoolsConfigData.dirty,
        result,
    });
}

async function pageModemSetSingleValue(req, res) {
    if (!req.body) {
        res.json({
            status: 'NOT OK',
            message: 'Empty body',
        });
        return;
    }

    const modemName = (req.params.modemName || '').trim();
    if (!modemName) {
        res.json({
            status: 'NOT OK',
            message: 'Invalid modem name',
        });
        return;
    }

    const keyword = (req.body.keyword || '').trim();
    if (!keyword) {
        res.json({
            status: 'NOT OK',
            message: 'Invalid keyword',
        });
        return;
    }

    const { value } = req.body;

    const result = await smstoolsConfigSetter.setModemSingleValue(modemName, keyword, value);
    res.json({
        dirty: !!smstoolsConfigData.dirty,
        result,
    });
}

async function pageModemDelete(req, res) {
    const modemName = (req.params.modemName || '').trim();
    if (!modemName) {
        res.json({
            status: 'NOT OK',
            message: 'Invalid modem name',
        });
        return;
    }

    const result = await smstoolsConfigSetter.delModem(modemName);
    res.json({
        dirty: !!smstoolsConfigData.dirty,
        result,
    });
}

async function pageInstallConfig(req, res) {
    logger.info('ROUTER-SMSTOOLS-CONFIG: Going to write configuration and restart smsd service');
    await smstoolsConfigSetter.writeConfig();

    const fileToExec = `${process.cwd()}/bin/smstools-config-install`;
    childProcess.execFile(fileToExec, [config.smstools_config_file || '/etc/smsd.conf'], (err, stdout, stderr) => {
        res.json({
            err,
            stdout,
            stderr,
        });
    });
}

async function pageQueuesAndProviders(req, res) {
    res.json(smstoolsConfigData.queues);
}

function pageModemQueueName(req, res) {
    const modemName = req.params.modemName || req.query.modemName || req.query.modem_name;
    res.json({
        modemName,
        queueName: queuesAndProviders.getModemQueueName(modemName),
    });
}

router.get('/', pageIndex);
router.get('/generate', pageGenerate);
router.get('/modems', pageModemList);

router.get('/set/:keyword', pageSet);
router.post('/modem/set/:modemName', bodyParser.json({ type: '*/json' }), pageModemSet);
router.post('/modem/set-single-value/:modemName', bodyParser.json({ type: '*/json' }), pageModemSetSingleValue);
router.get('/modem/delete/:modemName', pageModemDelete);
router.get('/install-config', pageInstallConfig);
router.get('/queues-and-providers', pageQueuesAndProviders);
router.get('/modem-queue-name', pageModemQueueName);
router.get('/modem-queue-name/:modemName', pageModemQueueName);