Commit 1d120a911060e042f9671582a46eced56b4d8446

Authored by Adhidarma Hadiwinoto
1 parent 788e8154b3
Exists in master

SMSTOOLS-CONFIG set single value

Showing 2 changed files with 61 additions and 0 deletions Inline Diff

lib/apiserver/routers/smstools-config.js
1 const childProcess = require('child_process'); 1 const childProcess = require('child_process');
2 2
3 const express = require('express'); 3 const express = require('express');
4 const bodyParser = require('body-parser'); 4 const bodyParser = require('body-parser');
5 5
6 const config = require('komodo-sdk/config'); 6 const config = require('komodo-sdk/config');
7 const smstoolsConfig = require('../../smstools-config'); 7 const smstoolsConfig = require('../../smstools-config');
8 const smstoolsConfigCreator = require('../../smstools-config/creator'); 8 const smstoolsConfigCreator = require('../../smstools-config/creator');
9 const smstoolsConfigSetter = require('../../smstools-config/setter'); 9 const smstoolsConfigSetter = require('../../smstools-config/setter');
10 const smstoolsConfigData = require('../../smstools-config/config-file'); 10 const smstoolsConfigData = require('../../smstools-config/config-file');
11 11
12 const router = express.Router(); 12 const router = express.Router();
13 module.exports = router; 13 module.exports = router;
14 14
15 function pageIndex(req, res) { 15 function pageIndex(req, res) {
16 const configString = smstoolsConfigCreator(); 16 const configString = smstoolsConfigCreator();
17 res.json({ 17 res.json({
18 dirty: smstoolsConfig.config.dirty, 18 dirty: smstoolsConfig.config.dirty,
19 config: smstoolsConfig.config, 19 config: smstoolsConfig.config,
20 configStringLength: configString.length, 20 configStringLength: configString.length,
21 configStringNrLines: (configString.match(/\n/g) || []).length, 21 configStringNrLines: (configString.match(/\n/g) || []).length,
22 configString, 22 configString,
23 }); 23 });
24 } 24 }
25 25
26 function pageGenerate(req, res) { 26 function pageGenerate(req, res) {
27 res.end(smstoolsConfigCreator()); 27 res.end(smstoolsConfigCreator());
28 } 28 }
29 29
30 async function pageModemList(req, res) { 30 async function pageModemList(req, res) {
31 const modems = []; 31 const modems = [];
32 // eslint-disable-next-line no-restricted-syntax 32 // eslint-disable-next-line no-restricted-syntax
33 for (const [key, value] of Object.entries(smstoolsConfigData.modems || {})) { 33 for (const [key, value] of Object.entries(smstoolsConfigData.modems || {})) {
34 modems.push({ 34 modems.push({
35 label: `${key}: ${value.device}, INCOMING${value.outgoing ? ' and OUTGOING' : ''}`, 35 label: `${key}: ${value.device}, INCOMING${value.outgoing ? ' and OUTGOING' : ''}`,
36 value: key, 36 value: key,
37 data: value, 37 data: value,
38 }); 38 });
39 } 39 }
40 40
41 res.json(modems); 41 res.json(modems);
42 } 42 }
43 43
44 async function pageSet(req, res) { 44 async function pageSet(req, res) {
45 const keyword = (req.params.keyword || req.query.keyword || '').trim(); 45 const keyword = (req.params.keyword || req.query.keyword || '').trim();
46 const value = (req.query.value || '').trim(); 46 const value = (req.query.value || '').trim();
47 47
48 if (!keyword) { 48 if (!keyword) {
49 res.end('Invalid keyword'); 49 res.end('Invalid keyword');
50 return; 50 return;
51 } 51 }
52 52
53 const result = await smstoolsConfigSetter.set(keyword, value); 53 const result = await smstoolsConfigSetter.set(keyword, value);
54 res.json({ 54 res.json({
55 dirty: !!smstoolsConfigData.dirty, 55 dirty: !!smstoolsConfigData.dirty,
56 result, 56 result,
57 }); 57 });
58 } 58 }
59 59
60 async function pageModemSet(req, res) { 60 async function pageModemSet(req, res) {
61 if (!req.body) { 61 if (!req.body) {
62 res.json({ 62 res.json({
63 status: 'NOT OK', 63 status: 'NOT OK',
64 message: 'Empty body', 64 message: 'Empty body',
65 }); 65 });
66 return; 66 return;
67 } 67 }
68 68
69 const modemName = (req.params.modemName || '').trim(); 69 const modemName = (req.params.modemName || '').trim();
70 if (!modemName) { 70 if (!modemName) {
71 res.json({ 71 res.json({
72 status: 'NOT OK', 72 status: 'NOT OK',
73 message: 'Invalid modem name', 73 message: 'Invalid modem name',
74 }); 74 });
75 return; 75 return;
76 } 76 }
77 77
78 const result = await smstoolsConfigSetter.setModem(modemName, req.body); 78 const result = await smstoolsConfigSetter.setModem(modemName, req.body);
79 res.json({ 79 res.json({
80 dirty: !!smstoolsConfigData.dirty, 80 dirty: !!smstoolsConfigData.dirty,
81 result, 81 result,
82 }); 82 });
83 } 83 }
84 84
85 async function pageModemSetSingleValue(req, res) {
86 if (!req.body) {
87 res.json({
88 status: 'NOT OK',
89 message: 'Empty body',
90 });
91 return;
92 }
93
94 const modemName = (req.params.modemName || '').trim();
95 if (!modemName) {
96 res.json({
97 status: 'NOT OK',
98 message: 'Invalid modem name',
99 });
100 return;
101 }
102
103 const keyword = (req.body.keyword || '').trim();
104 if (!keyword) {
105 res.json({
106 status: 'NOT OK',
107 message: 'Invalid keyword',
108 });
109 return;
110 }
111
112 const { value } = req.body;
113
114 const result = await smstoolsConfigSetter.setModemSingleValue(modemName, keyword, value);
115 res.json({
116 dirty: !!smstoolsConfigData.dirty,
117 result,
118 });
119 }
120
85 async function pageModemDelete(req, res) { 121 async function pageModemDelete(req, res) {
86 const modemName = (req.params.modemName || '').trim(); 122 const modemName = (req.params.modemName || '').trim();
87 if (!modemName) { 123 if (!modemName) {
88 res.json({ 124 res.json({
89 status: 'NOT OK', 125 status: 'NOT OK',
90 message: 'Invalid modem name', 126 message: 'Invalid modem name',
91 }); 127 });
92 return; 128 return;
93 } 129 }
94 130
95 const result = await smstoolsConfigSetter.delModem(modemName); 131 const result = await smstoolsConfigSetter.delModem(modemName);
96 res.json({ 132 res.json({
97 dirty: !!smstoolsConfigData.dirty, 133 dirty: !!smstoolsConfigData.dirty,
98 result, 134 result,
99 }); 135 });
100 } 136 }
101 137
102 function pageInstallConfig(req, res) { 138 function pageInstallConfig(req, res) {
103 const fileToExec = `${process.cwd()}/bin/smstools-config-install`; 139 const fileToExec = `${process.cwd()}/bin/smstools-config-install`;
104 childProcess.execFile(fileToExec, [config.smstools_config_file || '/etc/smsd.conf'], (err, stdout, stderr) => { 140 childProcess.execFile(fileToExec, [config.smstools_config_file || '/etc/smsd.conf'], (err, stdout, stderr) => {
105 res.json({ 141 res.json({
106 err, 142 err,
107 stdout, 143 stdout,
108 stderr, 144 stderr,
109 }); 145 });
110 }); 146 });
111 } 147 }
112 148
113 router.get('/', pageIndex); 149 router.get('/', pageIndex);
114 router.get('/generate', pageGenerate); 150 router.get('/generate', pageGenerate);
115 router.get('/modems', pageModemList); 151 router.get('/modems', pageModemList);
116 152
117 router.get('/set/:keyword', pageSet); 153 router.get('/set/:keyword', pageSet);
118 router.post('/modem/set/:modemName', bodyParser.json({ type: '*/json' }), pageModemSet); 154 router.post('/modem/set/:modemName', bodyParser.json({ type: '*/json' }), pageModemSet);
155 router.post('/modem/set-single-value/:modemName', bodyParser({ type: '*/json' }), pageModemSetSingleValue);
119 router.get('/modem/delete/:modemName', pageModemDelete); 156 router.get('/modem/delete/:modemName', pageModemDelete);
120 router.get('/install-config', pageInstallConfig); 157 router.get('/install-config', pageInstallConfig);
121 158
lib/smstools-config/setter.js
1 const fs = require('fs'); 1 const fs = require('fs');
2 const logger = require('komodo-sdk/logger'); 2 const logger = require('komodo-sdk/logger');
3 const smstoolsConfigData = require('./config-file'); 3 const smstoolsConfigData = require('./config-file');
4 const creator = require('./creator'); 4 const creator = require('./creator');
5 5
6 async function writeConfig() { 6 async function writeConfig() {
7 const data = smstoolsConfigData; 7 const data = smstoolsConfigData;
8 data.ts = new Date(); 8 data.ts = new Date();
9 const configFilename = 'config.smstools.json'; 9 const configFilename = 'config.smstools.json';
10 try { 10 try {
11 await fs.promises.writeFile(configFilename, JSON.stringify(data || {}, 0, 4)); 11 await fs.promises.writeFile(configFilename, JSON.stringify(data || {}, 0, 4));
12 } catch (e) { 12 } catch (e) {
13 logger.warn('SMSTOOLS-CONFIG/setter: Exception on writeConfig', { filename: configFilename, e }); 13 logger.warn('SMSTOOLS-CONFIG/setter: Exception on writeConfig', { filename: configFilename, e });
14 return e; 14 return e;
15 } 15 }
16 16
17 const newSmsdConfFilename = 'smsd.conf.tmp'; 17 const newSmsdConfFilename = 'smsd.conf.tmp';
18 const newSmsdConf = await creator(); 18 const newSmsdConf = await creator();
19 try { 19 try {
20 await fs.promises.writeFile(newSmsdConfFilename, newSmsdConf); 20 await fs.promises.writeFile(newSmsdConfFilename, newSmsdConf);
21 } catch (e) { 21 } catch (e) {
22 logger.warn('SMSTOOLS-CONFIG/setter: Exception on writeConfig', { filename: newSmsdConfFilename, e }); 22 logger.warn('SMSTOOLS-CONFIG/setter: Exception on writeConfig', { filename: newSmsdConfFilename, e });
23 return e; 23 return e;
24 } 24 }
25 25
26 return null; 26 return null;
27 } 27 }
28 28
29 exports.set = async (keyword, value) => { 29 exports.set = async (keyword, value) => {
30 if (!keyword) return smstoolsConfigData; 30 if (!keyword) return smstoolsConfigData;
31 smstoolsConfigData[keyword] = value; 31 smstoolsConfigData[keyword] = value;
32 smstoolsConfigData.dirty = true; 32 smstoolsConfigData.dirty = true;
33 await writeConfig(); 33 await writeConfig();
34 return smstoolsConfigData; 34 return smstoolsConfigData;
35 }; 35 };
36 36
37 function getModemByDevice(device) { 37 function getModemByDevice(device) {
38 let modemName = null; 38 let modemName = null;
39 if (!device) return modemName; 39 if (!device) return modemName;
40 40
41 // eslint-disable-next-line no-restricted-syntax 41 // eslint-disable-next-line no-restricted-syntax
42 for (const [key, value] of Object.entries(smstoolsConfigData.modems || {})) { 42 for (const [key, value] of Object.entries(smstoolsConfigData.modems || {})) {
43 if (value.device === device) { 43 if (value.device === device) {
44 modemName = key; 44 modemName = key;
45 } 45 }
46 } 46 }
47 47
48 return modemName; 48 return modemName;
49 } 49 }
50 50
51 51
52 exports.setModem = async (modemName, data) => { 52 exports.setModem = async (modemName, data) => {
53 if (!modemName) return smstoolsConfigData; 53 if (!modemName) return smstoolsConfigData;
54 54
55 if (data.device) { 55 if (data.device) {
56 const modemWithSameDevice = getModemByDevice(data.device); 56 const modemWithSameDevice = getModemByDevice(data.device);
57 if (modemWithSameDevice && modemWithSameDevice !== modemName) { 57 if (modemWithSameDevice && modemWithSameDevice !== modemName) {
58 return smstoolsConfigData; 58 return smstoolsConfigData;
59 } 59 }
60 } 60 }
61 61
62 if (!smstoolsConfigData.modems) { 62 if (!smstoolsConfigData.modems) {
63 smstoolsConfigData.modems = {}; 63 smstoolsConfigData.modems = {};
64 } 64 }
65 65
66 if (!smstoolsConfigData.modems[modemName]) { 66 if (!smstoolsConfigData.modems[modemName]) {
67 smstoolsConfigData.modems[modemName] = {}; 67 smstoolsConfigData.modems[modemName] = {};
68 } 68 }
69 69
70 smstoolsConfigData.modems[modemName] = data; 70 smstoolsConfigData.modems[modemName] = data;
71 smstoolsConfigData.dirty = true; 71 smstoolsConfigData.dirty = true;
72 await writeConfig(); 72 await writeConfig();
73 return smstoolsConfigData; 73 return smstoolsConfigData;
74 }; 74 };
75 75
76 exports.setModemSingleValue = async (modemName, keyword, value) => {
77 if (!modemName) return smstoolsConfigData;
78
79 if (keyword === 'device') {
80 const modemWithSameDevice = getModemByDevice(value);
81 if (modemWithSameDevice && modemWithSameDevice !== modemName) {
82 return smstoolsConfigData;
83 }
84 }
85
86 if (!smstoolsConfigData.modems) {
87 smstoolsConfigData.modems = {};
88 }
89
90 if (!smstoolsConfigData.modems[modemName]) {
91 smstoolsConfigData.modems[modemName] = {};
92 }
93
94 smstoolsConfigData.modems[modemName][keyword] = value;
95 smstoolsConfigData.dirty = true;
96 await writeConfig();
97 return smstoolsConfigData;
98 };
99
76 100
77 exports.delModem = async (modemName) => { 101 exports.delModem = async (modemName) => {
78 if (!modemName) return smstoolsConfigData; 102 if (!modemName) return smstoolsConfigData;
79 103
80 if (!smstoolsConfigData.modems) { 104 if (!smstoolsConfigData.modems) {
81 return smstoolsConfigData; 105 return smstoolsConfigData;
82 } 106 }
83 107
84 if (!smstoolsConfigData.modems[modemName]) { 108 if (!smstoolsConfigData.modems[modemName]) {
85 return smstoolsConfigData; 109 return smstoolsConfigData;
86 } 110 }
87 111
88 delete smstoolsConfigData.modems[modemName]; 112 delete smstoolsConfigData.modems[modemName];
89 smstoolsConfigData.dirty = true; 113 smstoolsConfigData.dirty = true;
90 await writeConfig(); 114 await writeConfig();
91 return smstoolsConfigData; 115 return smstoolsConfigData;
92 }; 116 };
93 117