yoopies-redis-commander
Version:
Redis web-based management tool written in node.js
150 lines (136 loc) • 4.47 kB
JavaScript
var sf = require('sf');
var ejs = require('ejs');
var fs = require('fs');
var path = require('path');
var Redis = require('ioredis');
var express = require('express');
var browserify = require('browserify-middleware');
var myUtils = require('./util');
var methodOverride = require('method-override');
var bodyParser = require('body-parser');
var partials = require('express-partials');
var flash = require('express-flash');
process.chdir( path.join(__dirname, '..') ); // fix the cwd
var viewsPath = path.join(__dirname, '../web/views');
var staticPath = path.join(__dirname, '../web/static');
var redisConnections = [];
redisConnections.getLast = myUtils.getLast;
module.exports = function (httpServerOptions, _redisConnections, nosave, rootPattern) {
redisConnections = _redisConnections;
var app = express();
app.use(partials());
app.use(flash());
app.use(function(req, res, next) {
res.locals.sf = sf;
res.locals.getFlashes = function() {
return req.flash();
};
res.locals.getConnections = function() {
return req.redisConnections;
};
next();
});
app.getConfig = myUtils.getConfig;
if (!nosave) {
app.saveConfig = myUtils.saveConfig;
} else {
app.saveConfig = function (config, callback) { callback(null) };
}
app.login = login;
app.logout = logout;
app.layoutFilename = path.join(__dirname, '../web/views/layout.ejs');
app.rootPattern = rootPattern;
app.set('views', viewsPath);
app.set('view engine', 'ejs');
app.use(httpAuth(httpServerOptions.username, httpServerOptions.password));
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(methodOverride());
app.use(express.query());
app.use(express.cookieParser());
app.use(express.session({ secret: "rediscommander" }));
app.use(addConnectionsToRequest);
app.get('/browserify.js', browserify(['cmdparser','readline-browserify']));
app.use(app.router);
app.use(express.static(staticPath));
require('./routes')(app);
app.listen(httpServerOptions.webPort, httpServerOptions.webAddress);
console.log("listening on ", httpServerOptions.webAddress, ":", httpServerOptions.webPort);
};
function httpAuth (username, password) {
if (username && password) {
return express.basicAuth(function (user, pass) {
return (username === user && password == pass);
});
} else {
return function (req, res, next) {
next()
}
}
}
function logout (hostname, port, db, callback) {
var notRemoved = true;
redisConnections.forEach(function (instance, index) {
if (notRemoved && instance.options.host == hostname && instance.options.port == port && instance.options.db == db) {
notRemoved = false;
var connectionToClose = redisConnections.splice(index, 1);
connectionToClose[0].quit();
}
});
if (notRemoved) {
return callback(new Error("Could not remove ", hostname, port, "."));
} else {
return callback(null);
}
}
function login (label, hostname, port, password, dbIndex, callback) {
console.log('connecting... ', hostname, port);
var client = new Redis(port, hostname);
client.label = label;
redisConnections.push(client);
redisConnections.getLast().on("error", function (err) {
console.error("Redis error", err.stack);
});
redisConnections.getLast().on("end", function () {
console.log("Connection closed. Attempting to Reconnect...");
});
if (password) {
return redisConnections.getLast().auth(password, function (err) {
if (err) {
console.error("Could not authenticate", err.stack);
if (callback) {
callback(err);
callback = null;
}
return;
}
redisConnections.getLast().on("connect", selectDatabase);
});
} else {
return redisConnections.getLast().on("connect", selectDatabase);
}
function selectDatabase () {
try {
dbIndex = parseInt(dbIndex || 0);
} catch (e) {
return callback(e);
}
return redisConnections.getLast().select(dbIndex, function (err) {
if (err) {
console.log("could not select database", err.stack);
if (callback) {
callback(err);
callback = null;
}
return;
}
console.log("Using Redis DB #" + dbIndex);
return callback();
});
}
}
function addConnectionsToRequest (req, res, next) {
req.redisConnections = redisConnections;
return next();
}
;