Make the server restart on plugin install

This commit is contained in:
Egil Moeller 2012-07-03 23:30:40 +02:00
parent 3338db9485
commit b438a278a1
5 changed files with 85 additions and 47 deletions

View File

@ -1,5 +1,9 @@
{ {
"parts": [ "parts": [
{ "name": "express", "hooks": {
"createServer": "ep_etherpad-lite/node/hooks/express:createServer",
"restartServer": "ep_etherpad-lite/node/hooks/express:restartServer"
} },
{ "name": "static", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/static:expressCreateServer" } }, { "name": "static", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/static:expressCreateServer" } },
{ "name": "specialpages", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/specialpages:expressCreateServer" } }, { "name": "specialpages", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/specialpages:expressCreateServer" } },
{ "name": "padurlsanitize", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/padurlsanitize:expressCreateServer" } }, { "name": "padurlsanitize", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/padurlsanitize:expressCreateServer" } },

62
src/node/hooks/express.js Normal file
View File

@ -0,0 +1,62 @@
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");
var express = require('express');
var settings = require('../utils/Settings');
var fs = require('fs');
var path = require('path');
var _ = require("underscore");
var server;
var serverName;
exports.createServer = function () {
//try to get the git version
var version = "";
try
{
var rootPath = path.resolve(npm.dir, '..');
var ref = fs.readFileSync(rootPath + "/.git/HEAD", "utf-8");
var refPath = rootPath + "/.git/" + ref.substring(5, ref.indexOf("\n"));
version = fs.readFileSync(refPath, "utf-8");
version = version.substring(0, 7);
console.log("Your Etherpad Lite git version is " + version);
}
catch(e)
{
console.warn("Can't get git version for server header\n" + e.message)
}
console.log("Report bugs at https://github.com/Pita/etherpad-lite/issues")
serverName = "Etherpad-Lite " + version + " (http://j.mp/ep-lite)";
exports.restartServer();
console.log("You can access your Etherpad-Lite instance at http://" + settings.ip + ":" + settings.port + "/");
if(!_.isEmpty(settings.users)){
console.log("The plugin admin page is at http://" + settings.ip + ":" + settings.port + "/admin/plugins");
}
else{
console.warn("Admin username and password not set in settings.json. To access admin please uncomment and edit 'users' in settings.json");
}
}
exports.restartServer = function () {
if (server) {
console.log("Restarting express server");
server.close();
}
server = express.createServer();
server.use(function (req, res, next) {
res.header("Server", serverName);
next();
});
server.configure(function() {
hooks.callAll("expressConfigure", {"app": server});
});
hooks.callAll("expressCreateServer", {"app": server});
server.listen(settings.port, settings.ip);
}

View File

@ -88,6 +88,8 @@ exports.basicAuth = function (req, res, next) {
}); });
} }
var secret = null;
exports.expressConfigure = function (hook_name, args, cb) { exports.expressConfigure = function (hook_name, args, cb) {
// If the log level specified in the config file is WARN or ERROR the application server never starts listening to requests as reported in issue #158. // If the log level specified in the config file is WARN or ERROR the application server never starts listening to requests as reported in issue #158.
// Not installing the log4js connect logger when the log level has a higher severity than INFO since it would not log at that level anyway. // Not installing the log4js connect logger when the log level has a higher severity than INFO since it would not log at that level anyway.
@ -100,10 +102,15 @@ exports.expressConfigure = function (hook_name, args, cb) {
* name) to a javascript identifier compatible string. Makes code * name) to a javascript identifier compatible string. Makes code
* handling it cleaner :) */ * handling it cleaner :) */
args.app.sessionStore = new express.session.MemoryStore(); if (!exports.sessionStore) {
exports.sessionStore = new express.session.MemoryStore();
secret = randomString(32);
}
args.app.sessionStore = exports.sessionStore;
args.app.use(express.session({store: args.app.sessionStore, args.app.use(express.session({store: args.app.sessionStore,
key: 'express_sid', key: 'express_sid',
secret: apikey = randomString(32)})); secret: secret}));
args.app.use(exports.basicAuth); args.app.use(exports.basicAuth);
} }

View File

@ -22,36 +22,13 @@
*/ */
var log4js = require('log4js'); var log4js = require('log4js');
var fs = require('fs');
var settings = require('./utils/Settings'); var settings = require('./utils/Settings');
var db = require('./db/DB'); var db = require('./db/DB');
var async = require('async'); var async = require('async');
var express = require('express');
var path = require('path');
var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins"); var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins");
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks"); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");
var npm = require("npm/lib/npm.js"); var npm = require("npm/lib/npm.js");
var _ = require("underscore");
//try to get the git version
var version = "";
try
{
var rootPath = path.resolve(npm.dir, '..');
var ref = fs.readFileSync(rootPath + "/.git/HEAD", "utf-8");
var refPath = rootPath + "/.git/" + ref.substring(5, ref.indexOf("\n"));
version = fs.readFileSync(refPath, "utf-8");
version = version.substring(0, 7);
console.log("Your Etherpad Lite git version is " + version);
}
catch(e)
{
console.warn("Can't get git version for server header\n" + e.message)
}
console.log("Report bugs at https://github.com/Pita/etherpad-lite/issues")
var serverName = "Etherpad-Lite " + version + " (http://j.mp/ep-lite)";
//set loglevel //set loglevel
log4js.setGlobalLogLevel(settings.loglevel); log4js.setGlobalLogLevel(settings.loglevel);
@ -75,27 +52,7 @@ async.waterfall([
//initalize the http server //initalize the http server
function (callback) function (callback)
{ {
//create server hooks.callAll("createServer", {});
var app = express.createServer();
app.use(function (req, res, next) {
res.header("Server", serverName);
next();
});
app.configure(function() { hooks.callAll("expressConfigure", {"app": app}); });
hooks.callAll("expressCreateServer", {"app": app});
//let the server listen
app.listen(settings.port, settings.ip);
console.log("You can access your Etherpad-Lite instance at http://" + settings.ip + ":" + settings.port + "/");
if(!_.isEmpty(settings.users)){
console.log("The plugin admin page is at http://" + settings.ip + ":" + settings.port + "/admin/plugins");
}
else{
console.warn("Admin username and password not set in settings.json. To access admin please uncomment and edit 'users' in settings.json");
}
callback(null); callback(null);
} }
]); ]);

View File

@ -3,7 +3,7 @@ var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");
var npm = require("npm"); var npm = require("npm");
var registry = require("npm/lib/utils/npm-registry-client/index.js"); var registry = require("npm/lib/utils/npm-registry-client/index.js");
var withNpm = function (npmfn, cb) { var withNpm = function (npmfn, final, cb) {
npm.load({}, function (er) { npm.load({}, function (er) {
if (er) return cb({progress:1, error:er}); if (er) return cb({progress:1, error:er});
npm.on("log", function (message) { npm.on("log", function (message) {
@ -15,6 +15,7 @@ var withNpm = function (npmfn, cb) {
data.progress = 1; data.progress = 1;
data.message = "Done."; data.message = "Done.";
cb(data); cb(data);
final();
}); });
}); });
} }
@ -36,6 +37,9 @@ exports.uninstall = function(plugin_name, cb) {
}); });
}); });
}, },
function () {
hooks.aCallAll("restartServer", {}, function () {});
},
cb cb
); );
}; };
@ -51,6 +55,9 @@ exports.install = function(plugin_name, cb) {
}); });
}); });
}, },
function () {
hooks.aCallAll("restartServer", {}, function () {});
},
cb cb
); );
}; };
@ -93,6 +100,7 @@ exports.search = function(query, cache, cb) {
} }
); );
}, },
function () { },
cb cb
); );
}; };