Commit 1d120a911060e042f9671582a46eced56b4d8446
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 |