Commit 46087d220e136fc89f05d1c542ae16723240d692

Authored by Adhidarma Hadiwinoto
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