diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3f66362 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/node_modules/ +/logs/ +config.js diff --git a/config.json b/config.json new file mode 100644 index 0000000..6eaeeb6 --- /dev/null +++ b/config.json @@ -0,0 +1,7 @@ +{ + "listen_port": 25613, + "center_port": 25614, + "origin": "HTTPGET0", + "do_not_prefix_request_id": true, + "core_url": "http://localhost:32972/apikey/c47ed08df360a15f9c60e8cfb3020f7d083b3f89" +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..697c40f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +"use strict"; + +const transport = require('./transport'); +const trxCenter = require('komodo-sdk/center/messaging/trx-center'); + +transport.init(trxCenter.callback); +trxCenter.setTransport(transport); diff --git a/package.json b/package.json new file mode 100644 index 0000000..e5018ae --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "komodo-center-httpget", + "version": "1.0.0", + "description": "Komodo HTTP GET Center", + "main": "index.js", + "scripts": { + "test": "mocha" + }, + "repository": { + "type": "git", + "url": "git@gitlab.kodesumber.com:komodo/komodo-center-httpget.git" + }, + "keywords": [ + "komodo", + "ppob", + "center" + ], + "author": "Adhidarma Hadiwinoto <me@adhisimon.org>", + "license": "ISC", + "dependencies": { + "komodo-sdk": "git+http://gitlab.kodesumber.com/komodo/komodo-sdk.git", + "request": "^2.81.0" + } +} diff --git a/transport.js b/transport.js new file mode 100644 index 0000000..4660d24 --- /dev/null +++ b/transport.js @@ -0,0 +1,115 @@ +"use strict"; + +const http = require('http'); +const url = require('url'); +const request = require('request'); + +const config = require('komodo-sdk/config') +const logger = require('komodo-sdk/logger'); + +let _callback; + +function createHttpServer() { + let listenPort = config.center_port; + + http.createServer(onRequest).listen(listenPort, function() { + logger.info('Center HTTP server listen on port ' + listenPort); + });; +} + +function onRequest(req, res) { + + let remote_address = req.socket.address().address.replace(/^::ffff:/, ''); + + logger.verbose('Got a request from ' + remote_address); + + let qs = url.parse(req.url, true).query; + + let partner = qs.terminal_name + '@' + remote_address; + let password = qs.password; + let reverse_url = qs.reverse_url; + + let product_name = qs.product_name; + let destination = qs.destination; + let request_id = qs.request_id; + + if (!qs.terminal_name || !password || !reverse_url || ! product_name || !destination || !request_id) { + res.end('INVALID REQUEST'); + return; + } + + let msg = [ product_name, destination, password, request_id ].join('.'); + + _callback.onIncomingMessage( + { + me: config.username, + partner: partner, + msg: msg.trim(), + reverse_url: reverse_url + }, + + function(err, _result) { + let result = cleanResponseToPartner(_result); + + logger.verbose('Forwarding CORE response to partner', _result); + res.end(JSON.stringify(result)); + } + ) +} + +function cleanResponseToPartner(_data) { + let data = JSON.parse(JSON.stringify(_data)); + + delete data.origin; + delete data.origin_report_ip; + delete data.origin_report_port; + delete data.reverse_url; + + return data; +} + +function init(cb) { + if (!cb) { + logger.warn('Callback is not defined'); + console.trace(); + process.exit(1); + return; + } + + _callback = cb; + + createHttpServer(); +} + +function send(partner, msg, params) { + logger.verbose('Got response from CORE', {partner: partner, msg: msg, params: params}); + + if (!params || !params.reverse_url) { + logger.verbose('Undefined reverse_url, not forwarding message to partner'); + return; + } + + + let reqOptions = { + url: params.reverse_url, + qs: cleanResponseToPartner(params) + } + + logger.verbose('Sending reverse report to partner', {request: reqOptions}); + request(reqOptions, function(err, res, body) { + if (err) { + logger.warn('Error sending reverse report to partner', {request: reqOptions, err: err}); + return; + } + + if (res.statusCode != 200) { + logger.warn('Partner not returning HTTP status code 200 on reverse report', {request: reqOptions, http_status: res.statusCode}); + return; + } + + logger.verbose('Reverse report has been sent to partner', {request: reqOptions}); + }) +} + +exports.init = init; +exports.send = send;