Commit 46087d220e136fc89f05d1c542ae16723240d692
1 parent
f1510ef10d
Exists in
master
write to config tmp before install
Showing 2 changed files with 4 additions and 1 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 logger = require('komodo-sdk/logger'); | 7 | const logger = require('komodo-sdk/logger'); |
8 | 8 | ||
9 | const smstoolsConfig = require('../../smstools-config'); | 9 | const smstoolsConfig = require('../../smstools-config'); |
10 | const smstoolsConfigCreator = require('../../smstools-config/creator'); | 10 | const smstoolsConfigCreator = require('../../smstools-config/creator'); |
11 | const smstoolsConfigSetter = require('../../smstools-config/setter'); | 11 | const smstoolsConfigSetter = require('../../smstools-config/setter'); |
12 | const smstoolsConfigData = require('../../smstools-config/config-file'); | 12 | const smstoolsConfigData = require('../../smstools-config/config-file'); |
13 | 13 | ||
14 | const router = express.Router(); | 14 | const router = express.Router(); |
15 | module.exports = router; | 15 | module.exports = router; |
16 | 16 | ||
17 | function pageIndex(req, res) { | 17 | function pageIndex(req, res) { |
18 | const configString = smstoolsConfigCreator(); | 18 | const configString = smstoolsConfigCreator(); |
19 | res.json({ | 19 | res.json({ |
20 | dirty: smstoolsConfig.config.dirty, | 20 | dirty: smstoolsConfig.config.dirty, |
21 | config: smstoolsConfig.config, | 21 | config: smstoolsConfig.config, |
22 | configStringLength: configString.length, | 22 | configStringLength: configString.length, |
23 | configStringNrLines: (configString.match(/\n/g) || []).length, | 23 | configStringNrLines: (configString.match(/\n/g) || []).length, |
24 | configString, | 24 | configString, |
25 | }); | 25 | }); |
26 | } | 26 | } |
27 | 27 | ||
28 | function pageGenerate(req, res) { | 28 | function pageGenerate(req, res) { |
29 | res.end(smstoolsConfigCreator()); | 29 | res.end(smstoolsConfigCreator()); |
30 | } | 30 | } |
31 | 31 | ||
32 | async function pageModemList(req, res) { | 32 | async function pageModemList(req, res) { |
33 | const modems = []; | 33 | const modems = []; |
34 | // eslint-disable-next-line no-restricted-syntax | 34 | // eslint-disable-next-line no-restricted-syntax |
35 | for (const [key, value] of Object.entries(smstoolsConfigData.modems || {})) { | 35 | for (const [key, value] of Object.entries(smstoolsConfigData.modems || {})) { |
36 | modems.push({ | 36 | modems.push({ |
37 | label: `${key}: ${value.device}, INCOMING${value.outgoing ? ' and OUTGOING' : ''}`, | 37 | label: `${key}: ${value.device}, INCOMING${value.outgoing ? ' and OUTGOING' : ''}`, |
38 | value: key, | 38 | value: key, |
39 | data: value, | 39 | data: value, |
40 | }); | 40 | }); |
41 | } | 41 | } |
42 | 42 | ||
43 | res.json(modems); | 43 | res.json(modems); |
44 | } | 44 | } |
45 | 45 | ||
46 | async function pageSet(req, res) { | 46 | async function pageSet(req, res) { |
47 | const keyword = (req.params.keyword || req.query.keyword || '').trim(); | 47 | const keyword = (req.params.keyword || req.query.keyword || '').trim(); |
48 | const value = (req.query.value || '').trim(); | 48 | const value = (req.query.value || '').trim(); |
49 | 49 | ||
50 | if (!keyword) { | 50 | if (!keyword) { |
51 | res.end('Invalid keyword'); | 51 | res.end('Invalid keyword'); |
52 | return; | 52 | return; |
53 | } | 53 | } |
54 | 54 | ||
55 | const result = await smstoolsConfigSetter.set(keyword, value); | 55 | const result = await smstoolsConfigSetter.set(keyword, value); |
56 | res.json({ | 56 | res.json({ |
57 | dirty: !!smstoolsConfigData.dirty, | 57 | dirty: !!smstoolsConfigData.dirty, |
58 | result, | 58 | result, |
59 | }); | 59 | }); |
60 | } | 60 | } |
61 | 61 | ||
62 | async function pageModemSet(req, res) { | 62 | async function pageModemSet(req, res) { |
63 | if (!req.body) { | 63 | if (!req.body) { |
64 | res.json({ | 64 | res.json({ |
65 | status: 'NOT OK', | 65 | status: 'NOT OK', |
66 | message: 'Empty body', | 66 | message: 'Empty body', |
67 | }); | 67 | }); |
68 | return; | 68 | return; |
69 | } | 69 | } |
70 | 70 | ||
71 | const modemName = (req.params.modemName || '').trim(); | 71 | const modemName = (req.params.modemName || '').trim(); |
72 | if (!modemName) { | 72 | if (!modemName) { |
73 | res.json({ | 73 | res.json({ |
74 | status: 'NOT OK', | 74 | status: 'NOT OK', |
75 | message: 'Invalid modem name', | 75 | message: 'Invalid modem name', |
76 | }); | 76 | }); |
77 | return; | 77 | return; |
78 | } | 78 | } |
79 | 79 | ||
80 | const result = await smstoolsConfigSetter.setModem(modemName, req.body); | 80 | const result = await smstoolsConfigSetter.setModem(modemName, req.body); |
81 | res.json({ | 81 | res.json({ |
82 | dirty: !!smstoolsConfigData.dirty, | 82 | dirty: !!smstoolsConfigData.dirty, |
83 | result, | 83 | result, |
84 | }); | 84 | }); |
85 | } | 85 | } |
86 | 86 | ||
87 | async function pageModemSetSingleValue(req, res) { | 87 | async function pageModemSetSingleValue(req, res) { |
88 | if (!req.body) { | 88 | if (!req.body) { |
89 | res.json({ | 89 | res.json({ |
90 | status: 'NOT OK', | 90 | status: 'NOT OK', |
91 | message: 'Empty body', | 91 | message: 'Empty body', |
92 | }); | 92 | }); |
93 | return; | 93 | return; |
94 | } | 94 | } |
95 | 95 | ||
96 | const modemName = (req.params.modemName || '').trim(); | 96 | const modemName = (req.params.modemName || '').trim(); |
97 | if (!modemName) { | 97 | if (!modemName) { |
98 | res.json({ | 98 | res.json({ |
99 | status: 'NOT OK', | 99 | status: 'NOT OK', |
100 | message: 'Invalid modem name', | 100 | message: 'Invalid modem name', |
101 | }); | 101 | }); |
102 | return; | 102 | return; |
103 | } | 103 | } |
104 | 104 | ||
105 | const keyword = (req.body.keyword || '').trim(); | 105 | const keyword = (req.body.keyword || '').trim(); |
106 | if (!keyword) { | 106 | if (!keyword) { |
107 | res.json({ | 107 | res.json({ |
108 | status: 'NOT OK', | 108 | status: 'NOT OK', |
109 | message: 'Invalid keyword', | 109 | message: 'Invalid keyword', |
110 | }); | 110 | }); |
111 | return; | 111 | return; |
112 | } | 112 | } |
113 | 113 | ||
114 | const { value } = req.body; | 114 | const { value } = req.body; |
115 | 115 | ||
116 | const result = await smstoolsConfigSetter.setModemSingleValue(modemName, keyword, value); | 116 | const result = await smstoolsConfigSetter.setModemSingleValue(modemName, keyword, value); |
117 | res.json({ | 117 | res.json({ |
118 | dirty: !!smstoolsConfigData.dirty, | 118 | dirty: !!smstoolsConfigData.dirty, |
119 | result, | 119 | result, |
120 | }); | 120 | }); |
121 | } | 121 | } |
122 | 122 | ||
123 | async function pageModemDelete(req, res) { | 123 | async function pageModemDelete(req, res) { |
124 | const modemName = (req.params.modemName || '').trim(); | 124 | const modemName = (req.params.modemName || '').trim(); |
125 | if (!modemName) { | 125 | if (!modemName) { |
126 | res.json({ | 126 | res.json({ |
127 | status: 'NOT OK', | 127 | status: 'NOT OK', |
128 | message: 'Invalid modem name', | 128 | message: 'Invalid modem name', |
129 | }); | 129 | }); |
130 | return; | 130 | return; |
131 | } | 131 | } |
132 | 132 | ||
133 | const result = await smstoolsConfigSetter.delModem(modemName); | 133 | const result = await smstoolsConfigSetter.delModem(modemName); |
134 | res.json({ | 134 | res.json({ |
135 | dirty: !!smstoolsConfigData.dirty, | 135 | dirty: !!smstoolsConfigData.dirty, |
136 | result, | 136 | result, |
137 | }); | 137 | }); |
138 | } | 138 | } |
139 | 139 | ||
140 | function pageInstallConfig(req, res) { | 140 | async function pageInstallConfig(req, res) { |
141 | logger.info('ROUTER-SMSTOOLS-CONFIG: Going to write configuration and restart smsd service'); | 141 | logger.info('ROUTER-SMSTOOLS-CONFIG: Going to write configuration and restart smsd service'); |
142 | await smstoolsConfigSetter.writeConfig(); | ||
143 | |||
142 | const fileToExec = `${process.cwd()}/bin/smstools-config-install`; | 144 | const fileToExec = `${process.cwd()}/bin/smstools-config-install`; |
143 | childProcess.execFile(fileToExec, [config.smstools_config_file || '/etc/smsd.conf'], (err, stdout, stderr) => { | 145 | childProcess.execFile(fileToExec, [config.smstools_config_file || '/etc/smsd.conf'], (err, stdout, stderr) => { |
144 | res.json({ | 146 | res.json({ |
145 | err, | 147 | err, |
146 | stdout, | 148 | stdout, |
147 | stderr, | 149 | stderr, |
148 | }); | 150 | }); |
149 | }); | 151 | }); |
150 | } | 152 | } |
151 | 153 | ||
152 | function pageSmsdLog(req, res) { | 154 | function pageSmsdLog(req, res) { |
153 | const maxLines = (req.params.maxLines || 200); | 155 | const maxLines = (req.params.maxLines || 200); |
154 | childProcess.exec(`tail -n ${maxLines} /var/log/smsd/smsd.log | tac`, (err, stdout, stderr) => { | 156 | childProcess.exec(`tail -n ${maxLines} /var/log/smsd/smsd.log | tac`, (err, stdout, stderr) => { |
155 | res.json({ | 157 | res.json({ |
156 | err, | 158 | err, |
157 | stdout, | 159 | stdout, |
158 | stderr, | 160 | stderr, |
159 | }); | 161 | }); |
160 | }); | 162 | }); |
161 | } | 163 | } |
162 | 164 | ||
163 | router.get('/', pageIndex); | 165 | router.get('/', pageIndex); |
164 | router.get('/generate', pageGenerate); | 166 | router.get('/generate', pageGenerate); |
165 | router.get('/modems', pageModemList); | 167 | router.get('/modems', pageModemList); |
166 | 168 | ||
167 | router.get('/set/:keyword', pageSet); | 169 | router.get('/set/:keyword', pageSet); |
168 | router.post('/modem/set/:modemName', bodyParser.json({ type: '*/json' }), pageModemSet); | 170 | router.post('/modem/set/:modemName', bodyParser.json({ type: '*/json' }), pageModemSet); |
169 | router.post('/modem/set-single-value/:modemName', bodyParser.json({ type: '*/json' }), pageModemSetSingleValue); | 171 | router.post('/modem/set-single-value/:modemName', bodyParser.json({ type: '*/json' }), pageModemSetSingleValue); |
170 | router.get('/modem/delete/:modemName', pageModemDelete); | 172 | router.get('/modem/delete/:modemName', pageModemDelete); |
171 | router.get('/install-config', pageInstallConfig); | 173 | router.get('/install-config', pageInstallConfig); |
172 | router.get('/smsd-log/:maxLines', pageSmsdLog); | 174 | router.get('/smsd-log/:maxLines', pageSmsdLog); |
173 | router.get('/smsd-log', pageSmsdLog); | 175 | router.get('/smsd-log', pageSmsdLog); |
174 | 176 |
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 | exports.writeConfig = writeConfig; | ||
28 | 29 | ||
29 | exports.set = async (keyword, value) => { | 30 | exports.set = async (keyword, value) => { |
30 | if (!keyword) return smstoolsConfigData; | 31 | if (!keyword) return smstoolsConfigData; |
31 | smstoolsConfigData[keyword] = value; | 32 | smstoolsConfigData[keyword] = value; |
32 | smstoolsConfigData.dirty = true; | 33 | smstoolsConfigData.dirty = true; |
33 | await writeConfig(); | 34 | await writeConfig(); |
34 | return smstoolsConfigData; | 35 | return smstoolsConfigData; |
35 | }; | 36 | }; |
36 | 37 | ||
37 | function getModemByDevice(device) { | 38 | function getModemByDevice(device) { |
38 | let modemName = null; | 39 | let modemName = null; |
39 | if (!device) return modemName; | 40 | if (!device) return modemName; |
40 | 41 | ||
41 | // eslint-disable-next-line no-restricted-syntax | 42 | // eslint-disable-next-line no-restricted-syntax |
42 | for (const [key, value] of Object.entries(smstoolsConfigData.modems || {})) { | 43 | for (const [key, value] of Object.entries(smstoolsConfigData.modems || {})) { |
43 | if (value.device === device) { | 44 | if (value.device === device) { |
44 | modemName = key; | 45 | modemName = key; |
45 | } | 46 | } |
46 | } | 47 | } |
47 | 48 | ||
48 | return modemName; | 49 | return modemName; |
49 | } | 50 | } |
50 | 51 | ||
51 | 52 | ||
52 | exports.setModem = async (modemName, data) => { | 53 | exports.setModem = async (modemName, data) => { |
53 | if (!modemName) return smstoolsConfigData; | 54 | if (!modemName) return smstoolsConfigData; |
54 | 55 | ||
55 | if (data.device) { | 56 | if (data.device) { |
56 | const modemWithSameDevice = getModemByDevice(data.device); | 57 | const modemWithSameDevice = getModemByDevice(data.device); |
57 | if (modemWithSameDevice && modemWithSameDevice !== modemName) { | 58 | if (modemWithSameDevice && modemWithSameDevice !== modemName) { |
58 | return smstoolsConfigData; | 59 | return smstoolsConfigData; |
59 | } | 60 | } |
60 | } | 61 | } |
61 | 62 | ||
62 | if (!smstoolsConfigData.modems) { | 63 | if (!smstoolsConfigData.modems) { |
63 | smstoolsConfigData.modems = {}; | 64 | smstoolsConfigData.modems = {}; |
64 | } | 65 | } |
65 | 66 | ||
66 | if (!smstoolsConfigData.modems[modemName]) { | 67 | if (!smstoolsConfigData.modems[modemName]) { |
67 | smstoolsConfigData.modems[modemName] = {}; | 68 | smstoolsConfigData.modems[modemName] = {}; |
68 | } | 69 | } |
69 | 70 | ||
70 | smstoolsConfigData.modems[modemName] = data; | 71 | smstoolsConfigData.modems[modemName] = data; |
71 | smstoolsConfigData.dirty = true; | 72 | smstoolsConfigData.dirty = true; |
72 | await writeConfig(); | 73 | await writeConfig(); |
73 | return smstoolsConfigData; | 74 | return smstoolsConfigData; |
74 | }; | 75 | }; |
75 | 76 | ||
76 | exports.setModemSingleValue = async (modemName, keyword, value) => { | 77 | exports.setModemSingleValue = async (modemName, keyword, value) => { |
77 | if (!modemName) return smstoolsConfigData; | 78 | if (!modemName) return smstoolsConfigData; |
78 | 79 | ||
79 | if (keyword === 'device') { | 80 | if (keyword === 'device') { |
80 | const modemWithSameDevice = getModemByDevice(value); | 81 | const modemWithSameDevice = getModemByDevice(value); |
81 | if (modemWithSameDevice && modemWithSameDevice !== modemName) { | 82 | if (modemWithSameDevice && modemWithSameDevice !== modemName) { |
82 | return smstoolsConfigData; | 83 | return smstoolsConfigData; |
83 | } | 84 | } |
84 | } | 85 | } |
85 | 86 | ||
86 | if (!smstoolsConfigData.modems) { | 87 | if (!smstoolsConfigData.modems) { |
87 | smstoolsConfigData.modems = {}; | 88 | smstoolsConfigData.modems = {}; |
88 | } | 89 | } |
89 | 90 | ||
90 | if (!smstoolsConfigData.modems[modemName]) { | 91 | if (!smstoolsConfigData.modems[modemName]) { |
91 | smstoolsConfigData.modems[modemName] = {}; | 92 | smstoolsConfigData.modems[modemName] = {}; |
92 | } | 93 | } |
93 | 94 | ||
94 | smstoolsConfigData.modems[modemName][keyword] = value; | 95 | smstoolsConfigData.modems[modemName][keyword] = value; |
95 | smstoolsConfigData.dirty = true; | 96 | smstoolsConfigData.dirty = true; |
96 | await writeConfig(); | 97 | await writeConfig(); |
97 | return smstoolsConfigData; | 98 | return smstoolsConfigData; |
98 | }; | 99 | }; |
99 | 100 | ||
100 | 101 | ||
101 | exports.delModem = async (modemName) => { | 102 | exports.delModem = async (modemName) => { |
102 | if (!modemName) return smstoolsConfigData; | 103 | if (!modemName) return smstoolsConfigData; |
103 | 104 | ||
104 | if (!smstoolsConfigData.modems) { | 105 | if (!smstoolsConfigData.modems) { |
105 | return smstoolsConfigData; | 106 | return smstoolsConfigData; |
106 | } | 107 | } |
107 | 108 | ||
108 | if (!smstoolsConfigData.modems[modemName]) { | 109 | if (!smstoolsConfigData.modems[modemName]) { |
109 | return smstoolsConfigData; | 110 | return smstoolsConfigData; |
110 | } | 111 | } |
111 | 112 | ||
112 | delete smstoolsConfigData.modems[modemName]; | 113 | delete smstoolsConfigData.modems[modemName]; |
113 | smstoolsConfigData.dirty = true; | 114 | smstoolsConfigData.dirty = true; |
114 | await writeConfig(); | 115 | await writeConfig(); |
115 | return smstoolsConfigData; | 116 | return smstoolsConfigData; |
116 | }; | 117 | }; |
117 | 118 |