Commit 8bb45441541567530258d5e1b0fde91b21a3dfad

Authored by Adhidarma Hadiwinoto
1 parent 7cb66aa3cf
Exists in master

Hapus prefix IMSI_ pada origin_label

Showing 2 changed files with 2 additions and 2 deletions Inline Diff

lib/apiserver/index.js
1 "use strict"; 1 "use strict";
2 2
3 /** 3 /**
4 * Modul untuk menerima callback dari modem handler jika ada SMS masuk. 4 * Modul untuk menerima callback dari modem handler jika ada SMS masuk.
5 */ 5 */
6 6
7 7
8 const express = require('express'); 8 const express = require('express');
9 const moment = require('moment'); 9 const moment = require('moment');
10 10
11 const messagingService = require('komodo-center-messaging-client-lib'); 11 const messagingService = require('komodo-center-messaging-client-lib');
12 12
13 const config = require('komodo-sdk/config'); 13 const config = require('komodo-sdk/config');
14 const logger = require('komodo-sdk/logger'); 14 const logger = require('komodo-sdk/logger');
15 15
16 const transport = require('../transport'); 16 const transport = require('../transport');
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 modems = require('../modems2'); 19 // const modems = require('../modems2');
20 20
21 const routerConfigSenders = require('./router-config-senders'); 21 const routerConfigSenders = require('./router-config-senders');
22 const routerModems = require('./router-modems'); 22 const routerModems = require('./router-modems');
23 23
24 if (config.handler_callback_server) { 24 if (config.handler_callback_server) {
25 logger.warn('Deprecated config.handler_callback_server. Please migrate it to config.apiserver!'); 25 logger.warn('Deprecated config.handler_callback_server. Please migrate it to config.apiserver!');
26 } 26 }
27 27
28 const app = express(); 28 const app = express();
29 messagingService.setTransport(transport); 29 messagingService.setTransport(transport);
30 30
31 function apikeyChecker(req, res, next) { 31 function apikeyChecker(req, res, next) {
32 res.locals.has_valid_apikey = req.params.apikey === ((config.apiserver && config.apiserver.apikey ? config.apiserver.apikey : null) || config.handler_callback_server.apikey); 32 res.locals.has_valid_apikey = req.params.apikey === ((config.apiserver && config.apiserver.apikey ? config.apiserver.apikey : null) || config.handler_callback_server.apikey);
33 if (res.locals.has_valid_apikey) { 33 if (res.locals.has_valid_apikey) {
34 next(); 34 next();
35 } 35 }
36 else { 36 else {
37 logger.warn('Invalid apikey', { ip: req.ip }); 37 logger.warn('Invalid apikey', { ip: req.ip });
38 res.end('APISERVER: Invalid apikey'); 38 res.end('APISERVER: Invalid apikey');
39 } 39 }
40 } 40 }
41 41
42 function onIncomingSms(req, res) { 42 function onIncomingSms(req, res) {
43 res.end('OK'); 43 res.end('OK');
44 44
45 if (!req.query.number) return; 45 if (!req.query.number) return;
46 const numberWithSuffix = req.query.number.replace(/^\+/, '') + (config.number_suffix || ''); 46 const numberWithSuffix = req.query.number.replace(/^\+/, '') + (config.number_suffix || '');
47 47
48 partnerLastSeen.set(req.query.number, req.query.modem_imsi); 48 partnerLastSeen.set(req.query.number, req.query.modem_imsi);
49 49
50 history.push({ 50 history.push({
51 ts: req.query.ts || moment().format('YYYY-MM-DD HH:mm:ss'), 51 ts: req.query.ts || moment().format('YYYY-MM-DD HH:mm:ss'),
52 modem: { 52 modem: {
53 name: req.query.modem, 53 name: req.query.modem,
54 imsi: req.query.modem_imsi, 54 imsi: req.query.modem_imsi,
55 msisdn: req.query.modem_msisdn, 55 msisdn: req.query.modem_msisdn,
56 }, 56 },
57 direction: 'INCOMING', 57 direction: 'INCOMING',
58 partner: req.query.number, 58 partner: req.query.number,
59 message: req.query.msg, 59 message: req.query.msg,
60 }); 60 });
61 61
62 /* 62 /*
63 modems.set({ 63 modems.set({
64 name: req.query.modem, 64 name: req.query.modem,
65 device: req.query.modem_device, 65 device: req.query.modem_device,
66 imsi: req.query.modem_imsi, 66 imsi: req.query.modem_imsi,
67 msisdn: req.query.modem_msisdn, 67 msisdn: req.query.modem_msisdn,
68 networkId: req.query.modem.network_id, 68 networkId: req.query.modem.network_id,
69 networkName: req.query.modem_network_name, 69 networkName: req.query.modem_network_name,
70 signalStrength: req.query.modem_signal_strength, 70 signalStrength: req.query.modem_signal_strength,
71 uptime: req.query.uptime, 71 uptime: req.query.uptime,
72 reportIp: req.query.report_ip || req.ip, 72 reportIp: req.query.report_ip || req.ip,
73 reportPort: req.query.report_port, 73 reportPort: req.query.report_port,
74 reportApikey: req.query.report_apikey, 74 reportApikey: req.query.report_apikey,
75 reportPathSms: req.query.report_path_sms || '/sms', 75 reportPathSms: req.query.report_path_sms || '/sms',
76 }); 76 });
77 */ 77 */
78 78
79 logger.info('APISERVER: Incoming SMS', { modem: req.query.modem, from: req.query.number, from_with_suffix: numberWithSuffix, msg: req.query.msg }); 79 logger.info('APISERVER: Incoming SMS', { modem: req.query.modem, from: req.query.number, from_with_suffix: numberWithSuffix, msg: req.query.msg });
80 messagingService.onIncomingMessage({ 80 messagingService.onIncomingMessage({
81 me: req.query.modem, 81 me: req.query.modem,
82 partner: numberWithSuffix, 82 partner: numberWithSuffix,
83 partner_raw: req.query.number, 83 partner_raw: req.query.number,
84 msg: req.query.msg, 84 msg: req.query.msg,
85 origin_label: `IMSI_${req.query.modem_imsi || 'UNKNOWN'}`, 85 origin_label: req.query.modem_imsi || 'UNKNOWN',
86 origin_transport: 'SMS', 86 origin_transport: 'SMS',
87 origin_partner: req.query.number, 87 origin_partner: req.query.number,
88 do_not_forward_to_core: (req.query.number.indexOf('+62') !== 0) || (req.query.number.length <= 8), 88 do_not_forward_to_core: (req.query.number.indexOf('+62') !== 0) || (req.query.number.length <= 8),
89 }); 89 });
90 } 90 }
91 91
92 async function pageHistory(req, res) { 92 async function pageHistory(req, res) {
93 res.json(await history.dump()); 93 res.json(await history.dump());
94 } 94 }
95 95
96 app.use(function(req, res, next) { 96 app.use(function(req, res, next) {
97 if ( 97 if (
98 req && req.path && typeof req.path === 'string' 98 req && req.path && typeof req.path === 'string'
99 && ( 99 && (
100 req.path.search(/\/modems$/) >= 0 100 req.path.search(/\/modems$/) >= 0
101 || req.path.search(/\/modems\/set$/) >= 0 101 || req.path.search(/\/modems\/set$/) >= 0
102 ) 102 )
103 ) { 103 ) {
104 next(); 104 next();
105 return; 105 return;
106 } 106 }
107 107
108 logger.verbose('APISERVER: Incoming http request', { ip: req.ip, path: req.path, url: req.url }); 108 logger.verbose('APISERVER: Incoming http request', { ip: req.ip, path: req.path, url: req.url });
109 next(); 109 next();
110 }) 110 })
111 111
112 app.use('/apikey/:apikey', apikeyChecker); 112 app.use('/apikey/:apikey', apikeyChecker);
113 app.get('/apikey/:apikey/on-sms', onIncomingSms); 113 app.get('/apikey/:apikey/on-sms', onIncomingSms);
114 app.get('/apikey/:apikey/inbox', onIncomingSms); 114 app.get('/apikey/:apikey/inbox', onIncomingSms);
115 app.get('/apikey/:apikey/on-sms/inbox', onIncomingSms); 115 app.get('/apikey/:apikey/on-sms/inbox', onIncomingSms);
116 app.get('/apikey/:apikey/history', pageHistory); 116 app.get('/apikey/:apikey/history', pageHistory);
117 app.use('/apikey/:apikey/modems', routerModems); 117 app.use('/apikey/:apikey/modems', routerModems);
118 app.use('/apikey/:apikey/config/senders', routerConfigSenders); 118 app.use('/apikey/:apikey/config/senders', routerConfigSenders);
119 119
120 const listenPort = (config && config.apiserver && config.apiserver.listen_port ? config.apiserver.listen_port : null) 120 const listenPort = (config && config.apiserver && config.apiserver.listen_port ? config.apiserver.listen_port : null)
121 || (config && config.handler_callback_server ? config.handler_callback_server.listen_port : null); 121 || (config && config.handler_callback_server ? config.handler_callback_server.listen_port : null);
122 122
123 if (listenPort) { 123 if (listenPort) {
124 app.listen(listenPort, () => { 124 app.listen(listenPort, () => {
125 logger.info('HTTP Handler Callback server listening on port ' + listenPort); 125 logger.info('HTTP Handler Callback server listening on port ' + listenPort);
126 }); 126 });
127 } else { 127 } else {
128 logger.warn('Undefined config.apiserver.listen_port for APISERVER. Not listening for command.'); 128 logger.warn('Undefined config.apiserver.listen_port for APISERVER. Not listening for command.');
129 } 129 }
130 130
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 common = require('./common'); 15 const common = require('./common');
16 const modems = require('./modems2'); 16 const modems = require('./modems2');
17 const modemChooser = require('./modem-chooser'); 17 const modemChooser = require('./modem-chooser');
18 // const partnerLastSeen = require('./partner-last-seen'); 18 // const partnerLastSeen = require('./partner-last-seen');
19 const history = require('./history'); 19 const history = require('./history');
20 const prefixes = require('./prefixes'); 20 const prefixes = require('./prefixes');
21 21
22 function _send(destinationNumber, msg, handlerIMSI) { 22 function _send(destinationNumber, msg, handlerIMSI) {
23 23
24 if (msg.length > 160) { 24 if (msg.length > 160) {
25 logger.info('Splitting message'); 25 logger.info('Splitting message');
26 26
27 const newMsg = msg.slice(0, MAX_SMS_LENGTH); 27 const newMsg = msg.slice(0, MAX_SMS_LENGTH);
28 const remainingMsg = msg.slice(MAX_SMS_LENGTH); 28 const remainingMsg = msg.slice(MAX_SMS_LENGTH);
29 29
30 _send(destinationNumber, newMsg, handlerIMSI); 30 _send(destinationNumber, newMsg, handlerIMSI);
31 setTimeout(() => { 31 setTimeout(() => {
32 _send(destinationNumber, remainingMsg, handlerIMSI); 32 _send(destinationNumber, remainingMsg, handlerIMSI);
33 }, 1000); 33 }, 1000);
34 34
35 return; 35 return;
36 } 36 }
37 37
38 const modem = modems.get('imsi', handlerIMSI); 38 const modem = modems.get('imsi', handlerIMSI);
39 if (!modem) { 39 if (!modem) {
40 logger.warn('Not knowing modem to use. Ignoring message', { destination_number: destinationNumber, msg: msg, modem_imsi: handlerIMSI }); 40 logger.warn('Not knowing modem to use. Ignoring message', { destination_number: destinationNumber, msg: msg, modem_imsi: handlerIMSI });
41 return; 41 return;
42 } 42 }
43 43
44 if (!modem.reportIp || !modem.reportPort || !modem.reportApikey) { 44 if (!modem.reportIp || !modem.reportPort || !modem.reportApikey) {
45 logger.warn('Invalid modem configuration', { modem }); 45 logger.warn('Invalid modem configuration', { modem });
46 return; 46 return;
47 } 47 }
48 48
49 const reqId = uuidv4(); 49 const reqId = uuidv4();
50 50
51 history.push({ 51 history.push({
52 ts: moment().format('YYYY-MM-DD HH:mm:ss'), 52 ts: moment().format('YYYY-MM-DD HH:mm:ss'),
53 modem: { 53 modem: {
54 name: modem.name, 54 name: modem.name,
55 imsi: modem.imsi, 55 imsi: modem.imsi,
56 msisdn: modem.msisdn, 56 msisdn: modem.msisdn,
57 }, 57 },
58 direction: 'OUTGOING', 58 direction: 'OUTGOING',
59 partner: destinationNumber, 59 partner: destinationNumber,
60 message: msg, 60 message: msg,
61 }); 61 });
62 62
63 logger.verbose('TRANSPORT: saving outgoing message'); 63 logger.verbose('TRANSPORT: saving outgoing message');
64 messagingService.onIncomingMessage({ 64 messagingService.onIncomingMessage({
65 me: modem.name, 65 me: modem.name,
66 partner: destinationNumber, 66 partner: destinationNumber,
67 partner_raw: `+${destinationNumber}`.replace(/^\++/, '+'), 67 partner_raw: `+${destinationNumber}`.replace(/^\++/, '+'),
68 msg: msg, 68 msg: msg,
69 origin_label: `IMSI_${modem.imsi || 'UNKNOWN'}`, 69 origin_label: modem.imsi || 'UNKNOWN',
70 origin_transport: 'SMS', 70 origin_transport: 'SMS',
71 origin_partner: destinationNumber, 71 origin_partner: destinationNumber,
72 do_not_forward_to_core: true, 72 do_not_forward_to_core: true,
73 is_outgoing: true, 73 is_outgoing: true,
74 }); 74 });
75 75
76 const requestOptions = { 76 const requestOptions = {
77 url: url.format({ 77 url: url.format({
78 protocol: 'http', 78 protocol: 'http',
79 hostname: modem.reportIp, 79 hostname: modem.reportIp,
80 port: modem.reportPort, 80 port: modem.reportPort,
81 pathname: modem.reportPathSms || '/sms', 81 pathname: modem.reportPathSms || '/sms',
82 }), 82 }),
83 qs: { 83 qs: {
84 msg: msg, 84 msg: msg,
85 number: destinationNumber, 85 number: destinationNumber,
86 reqid: reqId, 86 reqid: reqId,
87 apikey: modem.reportApikey, 87 apikey: modem.reportApikey,
88 } 88 }
89 } 89 }
90 90
91 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 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 });
92 request(requestOptions, function(err, res, body) { 92 request(requestOptions, function(err, res, body) {
93 if (err) { 93 if (err) {
94 logger.warn('Error requesting to modem handler. ' + err.toString(), { req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi }); 94 logger.warn('Error requesting to modem handler. ' + err.toString(), { req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi });
95 95
96 } 96 }
97 else if (res.statusCode != 200) { 97 else if (res.statusCode != 200) {
98 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 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 });
99 } 99 }
100 else { 100 else {
101 logger.verbose('Message sent to handler', { req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi, response_body: body }); 101 logger.verbose('Message sent to handler', { req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi, response_body: body });
102 } 102 }
103 }) 103 })
104 104
105 } 105 }
106 106
107 async function send(partner, msg) { 107 async function send(partner, msg) {
108 if (!partner) return; 108 if (!partner) return;
109 109
110 if (typeof msg !== 'string') { 110 if (typeof msg !== 'string') {
111 logger.warn('Message to send is not a string, ignoring message'); 111 logger.warn('Message to send is not a string, ignoring message');
112 return; 112 return;
113 } 113 }
114 114
115 msg = msg.trim(); 115 msg = msg.trim();
116 if (!msg) return; 116 if (!msg) return;
117 117
118 const destinationNumber = common.removeSuffixFromNumber(partner, config.number_suffix); 118 const destinationNumber = common.removeSuffixFromNumber(partner, config.number_suffix);
119 const prefixName = await prefixes.lookup(destinationNumber); 119 const prefixName = await prefixes.lookup(destinationNumber);
120 logger.verbose('Destination number prefix lookup', {partner: destinationNumber, prefix: prefixName}); 120 logger.verbose('Destination number prefix lookup', {partner: destinationNumber, prefix: prefixName});
121 121
122 // logger.verbose('Choosing handler name', { partner, destinationNumber, msg, origin }); 122 // logger.verbose('Choosing handler name', { partner, destinationNumber, msg, origin });
123 // const handlerIMSI = await partnerLastSeen.get(destinationNumber) ; 123 // const handlerIMSI = await partnerLastSeen.get(destinationNumber) ;
124 const handlerIMSI = await modemChooser.chooser(destinationNumber, config); 124 const handlerIMSI = await modemChooser.chooser(destinationNumber, config);
125 125
126 if (!handlerIMSI) { 126 if (!handlerIMSI) {
127 logger.warn(`Unknown handler for sending message to partner`, { partner, destinationNumber }); 127 logger.warn(`Unknown handler for sending message to partner`, { partner, destinationNumber });
128 return; 128 return;
129 } 129 }
130 130
131 _send(destinationNumber, msg, handlerIMSI); 131 _send(destinationNumber, msg, handlerIMSI);
132 } 132 }
133 133
134 exports.send = send; 134 exports.send = send;