setter.js 3.17 KB
const fs = require('fs');
const logger = require('komodo-sdk/logger');
const smstoolsConfigData = require('./config-file');
const creator = require('./creator');

async function writeConfig() {
    const data = smstoolsConfigData;
    data.ts = new Date();
    const configFilename = 'config.smstools.json';
    try {
        await fs.promises.writeFile(configFilename, JSON.stringify(data || {}, 0, 4));
    } catch (e) {
        logger.warn('SMSTOOLS-CONFIG/setter: Exception on writeConfig', { filename: configFilename, e });
        return e;
    }

    const newSmsdConfFilename = 'smsd.conf.tmp';
    const newSmsdConf = await creator();
    try {
        await fs.promises.writeFile(newSmsdConfFilename, newSmsdConf);
    } catch (e) {
        logger.warn('SMSTOOLS-CONFIG/setter: Exception on writeConfig', { filename: newSmsdConfFilename, e });
        return e;
    }

    return null;
}
exports.writeConfig = writeConfig;

exports.set = async (keyword, value) => {
    if (!keyword) return smstoolsConfigData;
    smstoolsConfigData[keyword] = value;
    smstoolsConfigData.dirty = true;
    await writeConfig();
    return smstoolsConfigData;
};

function getModemByDevice(device) {
    let modemName = null;
    if (!device) return modemName;

    // eslint-disable-next-line no-restricted-syntax
    for (const [key, value] of Object.entries(smstoolsConfigData.modems || {})) {
        if (value.device === device) {
            modemName = key;
        }
    }

    return modemName;
}


exports.setModem = async (modemName, data) => {
    if (!modemName) return smstoolsConfigData;

    if (data.device) {
        const modemWithSameDevice = getModemByDevice(data.device);
        if (modemWithSameDevice && modemWithSameDevice !== modemName) {
            return smstoolsConfigData;
        }
    }

    if (!smstoolsConfigData.modems) {
        smstoolsConfigData.modems = {};
    }

    if (!smstoolsConfigData.modems[modemName]) {
        smstoolsConfigData.modems[modemName] = {};
    }

    smstoolsConfigData.modems[modemName] = data;
    smstoolsConfigData.dirty = true;
    await writeConfig();
    return smstoolsConfigData;
};

exports.setModemSingleValue = async (modemName, keyword, value) => {
    if (!modemName) return smstoolsConfigData;

    if (keyword === 'device') {
        const modemWithSameDevice = getModemByDevice(value);
        if (modemWithSameDevice && modemWithSameDevice !== modemName) {
            return smstoolsConfigData;
        }
    }

    if (!smstoolsConfigData.modems) {
        smstoolsConfigData.modems = {};
    }

    if (!smstoolsConfigData.modems[modemName]) {
        smstoolsConfigData.modems[modemName] = {};
    }

    smstoolsConfigData.modems[modemName][keyword] = value;
    smstoolsConfigData.dirty = true;
    await writeConfig();
    return smstoolsConfigData;
};


exports.delModem = async (modemName) => {
    if (!modemName) return smstoolsConfigData;

    if (!smstoolsConfigData.modems) {
        return smstoolsConfigData;
    }

    if (!smstoolsConfigData.modems[modemName]) {
        return smstoolsConfigData;
    }

    delete smstoolsConfigData.modems[modemName];
    smstoolsConfigData.dirty = true;
    await writeConfig();
    return smstoolsConfigData;
};