Skip to content

Instantly share code, notes, and snippets.

@shannon
Created June 30, 2015 15:17
Show Gist options
  • Select an option

  • Save shannon/641c54c3ec11e64fbba0 to your computer and use it in GitHub Desktop.

Select an option

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
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);
});
});
{
"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