smstools.js 2.9 KB
const childProcess = require('child_process');
const express = require('express');
const escapeQuotes = require('escape-quotes');

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

const smstoolsUtil = require('../../smstools-util');
const smstoolsStatus = require('../../smstools-status');
const smstoolsStatusParsed = require('../../smstools-status-parsed');
const smstoolsConfigData = require('../../smstools-config/config-file');

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

async function pageStatus(req, res) {
    const filename = config.smstools_status_file || '//var/log/smsd/smsd_stats/status';
    const status = await smstoolsStatusParsed(filename);
    res.json(status);
}

async function pageStatusRaw(req, res) {
    const filename = config.smstools_status_file || '//var/log/smsd/smsd_stats/status';
    const statusContent = await smstoolsStatus(filename);
    res.end(statusContent);
}

async function pageRestart(req, res) {
    res.json(await smstoolsUtil.restart());
}

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);
}

function pageLog(req, res) {
    const maxLines = (Number(req.query.max) || 200);
    const keyword = req.query.keyword && escapeQuotes(req.query.keyword, '\'\n"&|*<>[];$ ');
    const cmd = req.query.keyword ? `tail -n ${maxLines * 50} /var/log/smsd/smsd.log | grep --ignore-case ${keyword} | tail -n ${maxLines} | tac`
        : `tail -n ${maxLines} /var/log/smsd/smsd.log | tac`;

    logger.verbose('ROUTER-SMSTOOLS: Getting log', { keyword, maxLines, cmd });
    childProcess.exec(cmd, (err, stdout, stderr) => {
        res.json({
            err,
            stdout,
            stderr,
        });
    });
}

async function pageSpoolCount(req, res) {
    const checkedCount = await smstoolsUtil.fileCountOnDir('/var/spool/sms/checked');
    const outgoingCount = await smstoolsUtil.fileCountOnDir('/var/spool/sms/outgoing');
    const indosatCount = await smstoolsUtil.fileCountOnDir('/var/spool/sms/queue/indosat');
    const otherCount = await smstoolsUtil.fileCountOnDir('/var/spool/sms/queue/other');

    res.json({
        checkedCount,
        outgoingCount,
        indosatCount,
        otherCount,
        totalQueueCount:
            Number(checkedCount)
            + Number(outgoingCount)
            + Number(indosatCount)
            + Number(otherCount),
    });
}

router.get('/status', pageStatus);
router.get('/status/raw', pageStatusRaw);
router.get('/restart', pageRestart);
router.get('/log', pageLog);
router.get('/spool-count', pageSpoolCount);
router.get('/modems', pageModemList);