Commit 98fa55b40fa585a1d7502e5752d92533dd8a5448
1 parent
4acd86be1e
Exists in
master
Buang modemSelect.js
Showing 3 changed files with 8 additions and 36 deletions Inline Diff
lib/common.js
File was created | 1 | 'use strict'; | |
2 | |||
3 | exports.removeSuffixFromNumber = function removeSuffixFromNumber(number, suffix) { | ||
4 | const re = new RegExp((suffix || '@.*') + '$'); | ||
5 | return number.replace(re, ''); | ||
6 | } | ||
7 |
lib/modemSelect.js
1 | "use strict"; | File was deleted | |
2 | |||
3 | function getModemConfig(modemName, modemsConfig) { | ||
4 | if (!modemsConfig) return; | ||
5 | if (!modemName) return; | ||
6 | if (typeof modemName === 'string' && !modemName.trim()) return; | ||
7 | |||
8 | return modemsConfig[modemName.trim()]; | ||
9 | } | ||
10 | |||
11 | function getModemUrl(modemName, modemsConfig) { | ||
12 | const modemConfig = getModemConfig(modemName, modemsConfig); | ||
13 | return modemConfig ? modemConfig.url : null; | ||
14 | } | ||
15 | |||
16 | function getModemApikey(modemName, modemsConfig) { | ||
17 | const modemConfig = getModemConfig(modemName, modemsConfig); | ||
18 | return modemConfig ? modemConfig.apikey : null; | ||
19 | } | ||
20 | |||
21 | function removeSuffixFromNumber(number, config) { | ||
22 | if (!config) { | ||
23 | config = {}; | ||
24 | } | ||
25 | |||
26 | const suffix = config && config.number_suffix ? config.number_suffix : '@.*'; | ||
27 | const re = new RegExp(suffix + '$'); | ||
28 | return number.replace(re, ''); | ||
29 | } | ||
30 | |||
31 | exports.getModemConfig = getModemConfig; | ||
32 | exports.getModemUrl = getModemUrl; | ||
33 | exports.getModemApikey = getModemApikey; | ||
34 | exports.removeSuffixFromNumber = removeSuffixFromNumber; |
lib/transport.js
1 | "use strict"; | 1 | "use strict"; |
2 | 2 | ||
3 | const MAX_SMS_LENGTH = 160; | 3 | const MAX_SMS_LENGTH = 160; |
4 | 4 | ||
5 | const url = require('url'); | 5 | const url = require('url'); |
6 | const request = require('request'); | 6 | const request = require('request'); |
7 | const uuidv4 = require('uuid/v4'); | 7 | const uuidv4 = require('uuid/v4'); |
8 | const moment = require('moment'); | 8 | const moment = require('moment'); |
9 | 9 | ||
10 | const config = require('komodo-sdk/config'); | 10 | const config = require('komodo-sdk/config'); |
11 | const logger = require('komodo-sdk/logger'); | 11 | const logger = require('komodo-sdk/logger'); |
12 | 12 | ||
13 | const messagingService = require('komodo-center-messaging-client-lib'); | 13 | const messagingService = require('komodo-center-messaging-client-lib'); |
14 | 14 | ||
15 | const modemSelect = require('./modemSelect'); | 15 | const common = require('./common'); |
16 | const modems = require('./modems2'); | 16 | const modems = require('./modems2'); |
17 | const partnerLastSeen = require('./partner-last-seen'); | 17 | const partnerLastSeen = require('./partner-last-seen'); |
18 | const history = require('./history'); | 18 | const history = require('./history'); |
19 | const prefixes = require('./prefixes'); | 19 | const prefixes = require('./prefixes'); |
20 | 20 | ||
21 | function _send(destinationNumber, msg, handlerIMSI) { | 21 | function _send(destinationNumber, msg, handlerIMSI) { |
22 | 22 | ||
23 | if (msg.length > 160) { | 23 | if (msg.length > 160) { |
24 | logger.info('Splitting message'); | 24 | logger.info('Splitting message'); |
25 | 25 | ||
26 | const newMsg = msg.slice(0, MAX_SMS_LENGTH); | 26 | const newMsg = msg.slice(0, MAX_SMS_LENGTH); |
27 | const remainingMsg = msg.slice(MAX_SMS_LENGTH); | 27 | const remainingMsg = msg.slice(MAX_SMS_LENGTH); |
28 | 28 | ||
29 | _send(destinationNumber, newMsg, handlerIMSI); | 29 | _send(destinationNumber, newMsg, handlerIMSI); |
30 | setTimeout(() => { | 30 | setTimeout(() => { |
31 | _send(destinationNumber, remainingMsg, handlerIMSI); | 31 | _send(destinationNumber, remainingMsg, handlerIMSI); |
32 | }, 1000); | 32 | }, 1000); |
33 | 33 | ||
34 | return; | 34 | return; |
35 | } | 35 | } |
36 | 36 | ||
37 | const modem = modems.get('imsi', handlerIMSI); | 37 | const modem = modems.get('imsi', handlerIMSI); |
38 | if (!modem) { | 38 | if (!modem) { |
39 | logger.warn('Not knowing modem to use. Ignoring message', { destination_number: destinationNumber, msg: msg, modem_imsi: handlerIMSI }); | 39 | logger.warn('Not knowing modem to use. Ignoring message', { destination_number: destinationNumber, msg: msg, modem_imsi: handlerIMSI }); |
40 | return; | 40 | return; |
41 | } | 41 | } |
42 | 42 | ||
43 | if (!modem.reportIp || !modem.reportPort || !modem.reportApikey) { | 43 | if (!modem.reportIp || !modem.reportPort || !modem.reportApikey) { |
44 | logger.warn('Invalid modem configuration', { modem }); | 44 | logger.warn('Invalid modem configuration', { modem }); |
45 | return; | 45 | return; |
46 | } | 46 | } |
47 | 47 | ||
48 | const reqId = uuidv4(); | 48 | const reqId = uuidv4(); |
49 | 49 | ||
50 | history.push({ | 50 | history.push({ |
51 | ts: moment().format('YYYY-MM-DD HH:mm:ss'), | 51 | ts: moment().format('YYYY-MM-DD HH:mm:ss'), |
52 | modem: { | 52 | modem: { |
53 | name: modem.name, | 53 | name: modem.name, |
54 | imsi: modem.imsi, | 54 | imsi: modem.imsi, |
55 | msisdn: modem.msisdn, | 55 | msisdn: modem.msisdn, |
56 | }, | 56 | }, |
57 | direction: 'OUTGOING', | 57 | direction: 'OUTGOING', |
58 | partner: destinationNumber, | 58 | partner: destinationNumber, |
59 | message: msg, | 59 | message: msg, |
60 | }); | 60 | }); |
61 | 61 | ||
62 | logger.verbose('TRANSPORT: saving outgoing message'); | 62 | logger.verbose('TRANSPORT: saving outgoing message'); |
63 | messagingService.onIncomingMessage({ | 63 | messagingService.onIncomingMessage({ |
64 | me: modem.name, | 64 | me: modem.name, |
65 | partner: destinationNumber, | 65 | partner: destinationNumber, |
66 | partner_raw: `+${destinationNumber}`.replace(/^\++/, '+'), | 66 | partner_raw: `+${destinationNumber}`.replace(/^\++/, '+'), |
67 | msg: msg, | 67 | msg: msg, |
68 | origin_label: `IMSI_${modem.imsi || 'UNKNOWN'}`, | 68 | origin_label: `IMSI_${modem.imsi || 'UNKNOWN'}`, |
69 | origin_transport: 'SMS', | 69 | origin_transport: 'SMS', |
70 | origin_partner: destinationNumber, | 70 | origin_partner: destinationNumber, |
71 | do_not_forward_to_core: true, | 71 | do_not_forward_to_core: true, |
72 | is_outgoing: true, | 72 | is_outgoing: true, |
73 | }); | 73 | }); |
74 | 74 | ||
75 | const requestOptions = { | 75 | const requestOptions = { |
76 | url: url.format({ | 76 | url: url.format({ |
77 | protocol: 'http', | 77 | protocol: 'http', |
78 | hostname: modem.reportIp, | 78 | hostname: modem.reportIp, |
79 | port: modem.reportPort, | 79 | port: modem.reportPort, |
80 | pathname: modem.reportPathSms || '/sms', | 80 | pathname: modem.reportPathSms || '/sms', |
81 | }), | 81 | }), |
82 | qs: { | 82 | qs: { |
83 | msg: msg, | 83 | msg: msg, |
84 | number: destinationNumber, | 84 | number: destinationNumber, |
85 | reqid: reqId, | 85 | reqid: reqId, |
86 | apikey: modem.reportApikey, | 86 | apikey: modem.reportApikey, |
87 | } | 87 | } |
88 | } | 88 | } |
89 | 89 | ||
90 | logger.info('Sending message to modem handler', { req_id: reqId, destination_number: destinationNumber, msg: msg, msg_length: msg.length, modem_name: modem.name, modem_imsi: modem.imsi }); | 90 | logger.info('Sending message to modem handler', { req_id: reqId, destination_number: destinationNumber, msg: msg, msg_length: msg.length, modem_name: modem.name, modem_imsi: modem.imsi }); |
91 | request(requestOptions, function(err, res, body) { | 91 | request(requestOptions, function(err, res, body) { |
92 | if (err) { | 92 | if (err) { |
93 | logger.warn('Error requesting to modem handler. ' + err.toString(), { req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi }); | 93 | logger.warn('Error requesting to modem handler. ' + err.toString(), { req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi }); |
94 | 94 | ||
95 | } | 95 | } |
96 | else if (res.statusCode != 200) { | 96 | else if (res.statusCode != 200) { |
97 | logger.warn('Modem handler not responding with HTTP status code 200.', { http_status_code: res.statusCode, req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi }); | 97 | logger.warn('Modem handler not responding with HTTP status code 200.', { http_status_code: res.statusCode, req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi }); |
98 | } | 98 | } |
99 | else { | 99 | else { |
100 | logger.verbose('Message sent to handler', { req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi, response_body: body }); | 100 | logger.verbose('Message sent to handler', { req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi, response_body: body }); |
101 | } | 101 | } |
102 | }) | 102 | }) |
103 | 103 | ||
104 | } | 104 | } |
105 | 105 | ||
106 | async function send(partner, msg) { | 106 | async function send(partner, msg) { |
107 | if (!partner) return; | 107 | if (!partner) return; |
108 | 108 | ||
109 | if (typeof msg !== 'string') { | 109 | if (typeof msg !== 'string') { |
110 | logger.warn('Message to send is not a string, ignoring message'); | 110 | logger.warn('Message to send is not a string, ignoring message'); |
111 | return; | 111 | return; |
112 | } | 112 | } |
113 | 113 | ||
114 | msg = msg.trim(); | 114 | msg = msg.trim(); |
115 | if (!msg) return; | 115 | if (!msg) return; |
116 | 116 | ||
117 | const destinationNumber = modemSelect.removeSuffixFromNumber(partner, config); | 117 | const destinationNumber = common.removeSuffixFromNumber(partner, config.number_suffix); |
118 | const prefixName = await prefixes.lookup(destinationNumber); | 118 | const prefixName = await prefixes.lookup(destinationNumber); |
119 | logger.verbose('Destination number prefix lookup', {partner: destinationNumber, prefix: prefixName}); | 119 | logger.verbose('Destination number prefix lookup', {partner: destinationNumber, prefix: prefixName}); |
120 | 120 | ||
121 | // logger.verbose('Choosing handler name', { partner, destinationNumber, msg, origin }); | 121 | // logger.verbose('Choosing handler name', { partner, destinationNumber, msg, origin }); |
122 | const handlerIMSI = await partnerLastSeen.get(destinationNumber) ; | 122 | const handlerIMSI = await partnerLastSeen.get(destinationNumber) ; |
123 | 123 | ||
124 | if (!handlerIMSI) { | 124 | if (!handlerIMSI) { |
125 | logger.warn(`Unknown handler for sending message to partner`, { partner, destinationNumber }); | 125 | logger.warn(`Unknown handler for sending message to partner`, { partner, destinationNumber }); |
126 | return; | 126 | return; |
127 | } | 127 | } |
128 | 128 | ||
129 | _send(destinationNumber, msg, handlerIMSI); | 129 | _send(destinationNumber, msg, handlerIMSI); |
130 | } | 130 | } |
131 | 131 | ||
132 | exports.send = send; | 132 | exports.send = send; |