Commit adeaa884bb9ff8a6d40939794c4c7ef38fb8cc57
1 parent
db8d24625a
Exists in
master
Retry in 15 minutes on failed
Showing 1 changed file with 41 additions and 2 deletions Inline Diff
lib/smstools-handler/failed.js
1 | const fs = require('fs'); | 1 | const fs = require('fs'); |
2 | const path = require('path'); | ||
3 | const moment = require('moment'); | ||
2 | const logger = require('komodo-sdk/logger'); | 4 | const logger = require('komodo-sdk/logger'); |
3 | const mailparser = require('../mailparser-wrapper'); | 5 | const mailparser = require('../mailparser-wrapper'); |
6 | const config = require('../../config'); | ||
4 | 7 | ||
5 | const eventType = 'FAILED'; | 8 | const eventType = 'FAILED'; |
6 | 9 | ||
7 | module.exports = async (msgFilename) => { | 10 | module.exports = async (msgFilename) => { |
8 | const msg = await fs.promises.readFile(msgFilename); | 11 | const msg = await fs.promises.readFile(msgFilename); |
9 | 12 | ||
10 | if (!msg) { | 13 | if (!msg) { |
11 | logger.warn('Sent failed detected but we can not read message file', { eventType, msgFile: msgFilename }); | 14 | logger.warn('Sent failed detected but we can not read message file', { eventType, msgFile: msgFilename }); |
12 | return; | 15 | return; |
13 | } | 16 | } |
14 | 17 | ||
15 | const parsedMsg = await mailparser(msg); | 18 | const parsedMsg = await mailparser(msg); |
16 | if (!parsedMsg || !parsedMsg.headers) { | 19 | if (!parsedMsg || !parsedMsg.headers) { |
17 | logger.warn('Sent failed detected and we can not parsed message file', { | 20 | logger.warn('Sent failed detected and we can not parsed message file', { |
18 | eventType, | 21 | eventType, |
19 | msgFile: msgFilename, | 22 | msgFile: msgFilename, |
20 | msgFileContent: (msg || '').toString(), | 23 | msgFileContent: (msg || '').toString(), |
21 | }); | 24 | }); |
22 | return; | 25 | return; |
23 | } | 26 | } |
24 | 27 | ||
25 | const to = parsedMsg.headers.get('to').text; | 28 | const to = parsedMsg.headers.get('to').text; |
26 | const modem = parsedMsg.headers.get('modem'); | 29 | const modem = parsedMsg.headers.get('modem'); |
27 | const imsi = parsedMsg.headers.get('imsi'); | 30 | const imsi = parsedMsg.headers.get('imsi'); |
28 | const imei = parsedMsg.headers.get('imei'); | 31 | const imei = parsedMsg.headers.get('imei'); |
29 | const failReason = parsedMsg.headers.get('fail_reason'); | 32 | const failReason = parsedMsg.headers.get('fail_reason'); |
30 | const failed = parsedMsg.headers.get('failed'); | 33 | const failed = parsedMsg.headers.get('failed'); |
31 | const { text } = parsedMsg; | 34 | const { text } = parsedMsg; |
32 | 35 | ||
33 | const originalTsMatched = msgFilename.match(/komodo\.(\d+)_(d+)/); | 36 | const originalTsMatched = msgFilename.match(/komodo\.((\d+)_(\d+))/); |
37 | const originalTs = originalTsMatched && originalTsMatched[1]; | ||
38 | const originalTsParsed = originalTs && moment(originalTs, 'YYYYMMDD_HHmmss'); | ||
34 | 39 | ||
40 | const deltaTimeMs = originalTsParsed && Number(new Date() - originalTsParsed); | ||
41 | const retry = !!(deltaTimeMs && (deltaTimeMs < (15 * 60 * 1000))); | ||
35 | 42 | ||
36 | logger.verbose('Sent failed detected', { | 43 | logger.verbose('Sent failed detected', { |
37 | eventType, | 44 | eventType, |
38 | msgFile: msgFilename, | 45 | msgFile: msgFilename, |
39 | to, | 46 | to, |
40 | modem, | 47 | modem, |
41 | imsi, | 48 | imsi, |
42 | imei, | 49 | imei, |
43 | failReason, | 50 | failReason, |
44 | failed, | 51 | failed, |
45 | text, | 52 | text, |
46 | originalTsMatched, | 53 | originalTsParsed, |
54 | deltaTimeMs, | ||
55 | retry, | ||
47 | }); | 56 | }); |
57 | |||
58 | if (!retry) return; | ||
59 | |||
60 | try { | ||
61 | await fs.promises.unlink(msgFilename); | ||
62 | } catch (e) { | ||
63 | logger.warn(`Can not unlink failed message. ${e.message || e.toString()}`, { | ||
64 | eventType, | ||
65 | msgFile: msgFilename, | ||
66 | }); | ||
67 | return; | ||
68 | } | ||
69 | |||
70 | const newMessageContent = ` | ||
71 | To: ${to} | ||
72 | |||
73 | ${text} | ||
74 | `.trim(); | ||
75 | |||
76 | const outboxDir = config.outbox_dir || '/var/spool/sms/outgoing'; | ||
77 | const newFileName = `${outboxDir}/${path.basename(msgFilename)}`; | ||
78 | |||
79 | try { | ||
80 | fs.promises.writeFile(newFileName, newMessageContent, { mode: 0o660 }); | ||
81 | } catch (e) { | ||
82 | logger.warn(`Can not create retry file. ${e.message || e.toString()}`, { | ||
83 | eventType, | ||
84 | msgFile: msgFilename, | ||
85 | }); | ||
86 | } | ||
48 | }; | 87 | }; |
49 | 88 |