Created
June 30, 2015 15:17
-
-
Save shannon/641c54c3ec11e64fbba0 to your computer and use it in GitHub Desktop.
Simple service for setting up an SSH tunnel for Openshift hosted mongo instance from within FeedHenry
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var tunnel = require('tunnel-ssh') | |
| , fs = require('fs') | |
| , Net = require('net') | |
| , exec = require('ssh-exec') | |
| , express = require('express') | |
| , mbaasApi = require('fh-mbaas-api') | |
| , mbaasExpress = mbaasApi.mbaasExpress() | |
| ; | |
| var username = process.env.OPENSHIFT_USERNAME; | |
| var hostname = process.env.OPENSHIFT_HOSTNAME; | |
| var localHost = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1'; | |
| var localPort = process.env.FH_PORT || process.env.OPENSHIFT_NODEJS_PORT || 8001; | |
| var key = process.env.OPENSHIFT_PRIVATEKEY; | |
| var app = express(); | |
| app.use('/sys', mbaasExpress.sys([])); | |
| app.use('/mbaas', mbaasExpress.mbaas); | |
| function getOpenshiftMongo(cb){ | |
| var stdout = ''; | |
| exec('export', { | |
| host: hostname, | |
| user: username, | |
| key: key | |
| }).on('data', function(data){ | |
| stdout += data; | |
| }).on('end', function(){ | |
| var hostMatches = stdout.match(/OPENSHIFT_MONGODB_DB_HOST="(.*)"/); | |
| var portMatches = stdout.match(/OPENSHIFT_MONGODB_DB_PORT="(.*)"/); | |
| if(!hostMatches || !portMatches){ cb('No MongoDB Instance Found'); } | |
| cb(null, { | |
| host: hostMatches[1], | |
| port: portMatches[1] | |
| }); | |
| }).on('error', function(err){ | |
| cb(err); | |
| }); | |
| } | |
| getOpenshiftMongo(function(err, mongo){ | |
| if(err) { throw err; } | |
| var config = { | |
| host: hostname, | |
| username: username, | |
| privateKey: key, | |
| dstHost: mongo.host, | |
| dstPort: mongo.port, | |
| localHost: localHost, | |
| localPort: localPort, | |
| keepAlive: true | |
| }; | |
| var server, mongoServer, expressServer; | |
| server = Net.createServer(function(connection){ | |
| if(connection.localAddress === '127.0.0.1'){ | |
| mongoServer.emit('connection', connection); | |
| } else { | |
| expressServer.emit('connection', connection); | |
| } | |
| }); | |
| server.listen(localPort, '0.0.0.0', function(){ | |
| console.log('Listening on port', localPort); | |
| }); | |
| //override net listener so we can have one server for mongo connections (127.0.0.1) and express for everything else | |
| var _listen = Net.Server.prototype.listen; | |
| Net.Server.prototype.listen = function(){ | |
| var server = this; | |
| _listen.apply(server, [null, arguments[1], arguments[2]]); | |
| return server; | |
| } | |
| expressServer = app.listen(localPort, localHost, function() { | |
| console.log("Express app started at: " + new Date() + " on port: " + localPort); | |
| }); | |
| mongoServer = tunnel(config, function (err, result) { | |
| if(err){ | |
| return console.log('Error', err); | |
| } | |
| console.log('tunneling connection to openshift', localHost, localPort, '->', config.dstHost, config.dstPort); | |
| }); | |
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "name": "fh-openshift-mongo", | |
| "version": "0.0.1", | |
| "dependencies": { | |
| "ssh-exec": "^1.2.0", | |
| "tunnel-ssh": "git+https://github.com/mrfelton/tunnel-ssh.git", | |
| "fh-mbaas-api": "~4.11.0", | |
| "request": "2.34.0", | |
| "body-parser": "~1.0.2", | |
| "express": "~4.0.0", | |
| "cors": "~2.2.0" | |
| }, | |
| "license": "MIT", | |
| "main": "application.js" | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment