Commit cd4feda874d40350602bf6821c4d9bef6e0d8bed
1 parent
05d016dd09
Exists in
master
and in
1 other branch
APISERVER and MATRIX
Showing 11 changed files with 132 additions and 3 deletions Side-by-side Diff
config.sample.json
index.js
... | ... | @@ -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
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, |
lib/matrix.js
... | ... | @@ -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', |