Commit cd4feda874d40350602bf6821c4d9bef6e0d8bed

Authored by Adhidarma Hadiwinoto
1 parent 05d016dd09
Exists in master and in 1 other branch dev

APISERVER and MATRIX

Showing 11 changed files with 132 additions and 3 deletions Side-by-side Diff

... ... @@ -11,6 +11,10 @@
11 11 },
12 12 "core": {
13 13 "port": 25615
  14 + },
  15 + "apiserver": {
  16 + "port": 25617,
  17 + "apikey": "PLEASE_CHANGE_ME"
14 18 }
15 19 },
16 20  
... ... @@ -30,6 +30,8 @@ if (config.cluster && cluster.isMaster) {
30 30 }
31 31  
32 32 // eslint-disable-next-line global-require
  33 + require('./lib/apiserver');
  34 + // eslint-disable-next-line global-require
33 35 require('./lib/core-callback');
34 36 // eslint-disable-next-line global-require
35 37 require('./lib/partner-listener');
lib/apiserver/index.js
... ... @@ -0,0 +1,47 @@
  1 +const MODULE_NAME = 'APISERVER';
  2 +
  3 +const express = require('express');
  4 +const config = require('komodo-sdk/config');
  5 +const logger = require('komodo-sdk/logger');
  6 +
  7 +const validApikey = require('./valid-apikey');
  8 +
  9 +const middlewareCommon = require('../middlewares/common');
  10 +const routerMatrix = require('./routers/matrix');
  11 +
  12 +const app = express();
  13 +
  14 +app.use((req, res, next) => {
  15 + res.locals.httpgetx_subsystem = MODULE_NAME;
  16 + next();
  17 +});
  18 +
  19 +const apikeyChecker = (req, res, next) => {
  20 + if (validApikey(req.params.apikey)) {
  21 + next();
  22 + } else {
  23 + res.status(403).end('Invalid APIKEY');
  24 + }
  25 +};
  26 +
  27 +app.use(middlewareCommon);
  28 +
  29 +app.use('/apikey/:apikey', apikeyChecker);
  30 +app.use('/apikey/:apikey/matrix', routerMatrix);
  31 +
  32 +app.use((req, res) => {
  33 + const { xid } = res.locals;
  34 + res.status(404).end(`KOMODO-HTTP-GET-X CENTER (APISERVER).\n404: Method not found.\n\nXID: ${xid}.\n`);
  35 +});
  36 +
  37 +const listenPort = config.listener && config.listener.apiserver && config.listener.apiserver.port;
  38 +if (
  39 + listenPort
  40 + && config.listener && config.listener.apiserver && config.listener.apiserver.apikey
  41 +) {
  42 + app.listen(listenPort, () => {
  43 + logger.info(`${MODULE_NAME} FAEE1E47: Listening`, { port: listenPort });
  44 + });
  45 +} else {
  46 + logger.info(`${MODULE_NAME}: Disabled because of missing configuration`);
  47 +}
lib/apiserver/routers/matrix.js
... ... @@ -0,0 +1,18 @@
  1 +const express = require('express');
  2 +
  3 +const os = require('os');
  4 +const matrix = require('../../matrix');
  5 +
  6 +const router = express.Router();
  7 +module.exports = router;
  8 +
  9 +const pageIndex = (req, res) => {
  10 + matrix.uptime = process.uptime();
  11 + matrix.loadavg = os.loadavg();
  12 + matrix.workdir = process.cwd;
  13 + matrix.memory_usage = process.memoryUsage();
  14 +
  15 + res.json(matrix);
  16 +};
  17 +
  18 +router.all('/', pageIndex);
lib/apiserver/valid-apikey.js
... ... @@ -0,0 +1,6 @@
  1 +const config = require('komodo-sdk/config');
  2 +
  3 +module.exports = (apikey) => apikey
  4 + && apikey === (
  5 + config.listener && config.listener.apiserver && config.listener.apiserver.apikey
  6 + );
lib/core-callback/index.js
... ... @@ -7,6 +7,8 @@ const config = require('komodo-sdk/config');
7 7 const logger = require('komodo-sdk/logger');
8 8 const middlewareCommon = require('../middlewares/common');
9 9 const sender = require('./sender');
  10 +const matrix = require('../matrix');
  11 +
10 12  
11 13 const app = express();
12 14  
... ... @@ -21,6 +23,7 @@ app.use((req, res, next) => {
21 23 app.use(middlewareCommon);
22 24  
23 25 app.use((req, res) => {
  26 + matrix.messages_from_core += 1;
24 27 res.end('OK');
25 28 sender(req.query, res.locals.xid);
26 29 });
lib/core-callback/sender.js
... ... @@ -4,6 +4,8 @@ const axios = require('axios').default;
4 4 const config = require('komodo-sdk/config');
5 5 const logger = require('komodo-sdk/logger');
6 6  
  7 +const matrix = require('../matrix');
  8 +
7 9 const HTTP_TIMEOUT = Number(
8 10 config.callback_sender && config.callback_sender.http_timeout_ms,
9 11 ) || 30 * 1000;
... ... @@ -98,6 +100,14 @@ const sender = async (data, xid, retry) => {
98 100 headers: axiosHeaders,
99 101 });
100 102  
  103 + matrix.callback_sender.message_sent += 1;
  104 +
  105 + if (isPostpaid) {
  106 + matrix.callback_sender.message_sent_using_post_method += 1;
  107 + } else {
  108 + matrix.callback_sender.message_sent_using_get_method += 1;
  109 + }
  110 +
101 111 logger.info(`${MODULE_NAME} 3641FBD7: Has been sent to PARTNER successfully`, {
102 112 xid,
103 113 retry,
... ... @@ -105,6 +115,8 @@ const sender = async (data, xid, retry) => {
105 115 responseBody: response && response.data,
106 116 });
107 117 } catch (e) {
  118 + matrix.callback_sender.message_sent_failed += 1;
  119 +
108 120 logger.warn(`${MODULE_NAME} A1EC9E70: Failed on sending to PARTNER`, {
109 121 xid,
110 122 retry,
... ... @@ -0,0 +1,20 @@
  1 +const os = require('os');
  2 +// const config = require('komodo-sdk/config');
  3 +
  4 +module.exports = {
  5 + pid: process.pid,
  6 + start_time: new Date(),
  7 + uptime: process.uptime(),
  8 + hostname: os.hostname(),
  9 + loadavg: os.loadavg(),
  10 + workdir: process.cwd(),
  11 + memory_usage: process.memoryUsage(),
  12 + messages_from_core: 0,
  13 + messages_to_core: 0,
  14 + callback_sender: {
  15 + message_sent: 0,
  16 + message_sent_failed: 0,
  17 + message_sent_using_get_method: 0,
  18 + message_sent_using_post_method: 0,
  19 + },
  20 +};
lib/middlewares/common.js
1   -// const uuidv1 = require('uuid/v1');
  1 +const MODULE_NAME = 'MIDDLEWARES';
  2 +
  3 +const uuidv1 = require('uuid/v1');
2 4 const uniqid = require('uniqid');
  5 +
  6 +const config = require('komodo-sdk/config');
3 7 const logger = require('komodo-sdk/logger');
4 8  
5 9 module.exports = function common(req, res, next) {
... ... @@ -8,12 +12,15 @@ module.exports = function common(req, res, next) {
8 12 return;
9 13 }
10 14  
11   - res.locals.xid = uniqid();
  15 + res.locals.xid = config.xid_from_uuid ? uuidv1()
  16 + : uniqid();
  17 +
12 18 res.locals.x_http_request_ts = new Date();
13 19  
14   - logger.info(`Got request from ${res.locals.httpgetx_subsystem === 'CORE-CALLBACK' ? 'CORE' : 'PARTNER'}`, {
  20 + logger.info(`${MODULE_NAME}.COMMON B6257542: Got a request`, {
15 21 xid: res.locals.xid,
16 22 pid: process.pid,
  23 + subsystem: res.locals.httpgetx_subsystem,
17 24 requester_ip: req.ip,
18 25 method: req.method,
19 26 path: req.path,
lib/partner-listener/index.js
  1 +const MODULE_NAME = 'PARTNER-LISTENER';
  2 +
1 3 const DEFAULT_LISTENER_FROM_PARTNER_PORT = 25614;
2 4  
3 5 const express = require('express');
... ... @@ -18,6 +20,11 @@ if (config.partner && config.partner.trust_proxy) {
18 20 app.set('trust proxy', config.partner.trust_proxy);
19 21 }
20 22  
  23 +app.use((req, res, next) => {
  24 + res.locals.httpgetx_subsystem = MODULE_NAME;
  25 + next();
  26 +});
  27 +
21 28 app.use(express.json({ extended: true }));
22 29 app.use(express.urlencoded({ extended: true }));
23 30 app.use(middlewareCommon);
lib/partner-listener/routers/topup.js
... ... @@ -6,6 +6,7 @@ const config = require('komodo-sdk/config');
6 6 const logger = require('komodo-sdk/logger');
7 7 const coreapi = require('komodo-sdk/coreapi');
8 8 // const coreapi = require('../../coreapi');
  9 +const matrix = require('../../matrix');
9 10  
10 11 const router = express.Router();
11 12 module.exports = router;
... ... @@ -58,6 +59,8 @@ async function pageIndex(req, res) {
58 59  
59 60 const terminalName = `${req.body.terminal_name || req.query.terminal_name}@${req.ip.replace(/^::ffff:/, '')}`;
60 61  
  62 + matrix.messages_to_core += 1;
  63 +
61 64 const [err, coreResponse] = await coreapi({
62 65 xid,
63 66 path: '/prepaid/buy',