From b438a278a16fbac3b38ad2105c3431b7e669df83 Mon Sep 17 00:00:00 2001 From: Egil Moeller Date: Tue, 3 Jul 2012 23:30:40 +0200 Subject: [PATCH] Make the server restart on plugin install --- src/ep.json | 4 ++ src/node/hooks/express.js | 62 +++++++++++++++++++++++++++++ src/node/hooks/express/webaccess.js | 11 ++++- src/node/server.js | 45 +-------------------- src/static/js/pluginfw/installer.js | 10 ++++- 5 files changed, 85 insertions(+), 47 deletions(-) create mode 100644 src/node/hooks/express.js diff --git a/src/ep.json b/src/ep.json index 6bc77735..ce6d3a00 100644 --- a/src/ep.json +++ b/src/ep.json @@ -1,5 +1,9 @@ { "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": "specialpages", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/specialpages:expressCreateServer" } }, { "name": "padurlsanitize", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/padurlsanitize:expressCreateServer" } }, diff --git a/src/node/hooks/express.js b/src/node/hooks/express.js new file mode 100644 index 00000000..c7897e77 --- /dev/null +++ b/src/node/hooks/express.js @@ -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); +} \ No newline at end of file diff --git a/src/node/hooks/express/webaccess.js b/src/node/hooks/express/webaccess.js index 028d8ab1..ffced047 100644 --- a/src/node/hooks/express/webaccess.js +++ b/src/node/hooks/express/webaccess.js @@ -88,6 +88,8 @@ exports.basicAuth = function (req, res, next) { }); } +var secret = null; + 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. // 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 * 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, key: 'express_sid', - secret: apikey = randomString(32)})); + secret: secret})); args.app.use(exports.basicAuth); } diff --git a/src/node/server.js b/src/node/server.js index 4eb38ea7..2cfcde82 100755 --- a/src/node/server.js +++ b/src/node/server.js @@ -22,36 +22,13 @@ */ var log4js = require('log4js'); -var fs = require('fs'); var settings = require('./utils/Settings'); var db = require('./db/DB'); var async = require('async'); -var express = require('express'); -var path = require('path'); var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins"); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks"); 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 log4js.setGlobalLogLevel(settings.loglevel); @@ -75,27 +52,7 @@ async.waterfall([ //initalize the http server function (callback) { - //create server - 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"); - } + hooks.callAll("createServer", {}); callback(null); } ]); diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index 1bb8db9e..e7c6fb80 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -3,7 +3,7 @@ var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks"); var npm = require("npm"); 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) { if (er) return cb({progress:1, error:er}); npm.on("log", function (message) { @@ -15,6 +15,7 @@ var withNpm = function (npmfn, cb) { data.progress = 1; data.message = "Done."; cb(data); + final(); }); }); } @@ -36,6 +37,9 @@ exports.uninstall = function(plugin_name, cb) { }); }); }, + function () { + hooks.aCallAll("restartServer", {}, function () {}); + }, cb ); }; @@ -51,6 +55,9 @@ exports.install = function(plugin_name, cb) { }); }); }, + function () { + hooks.aCallAll("restartServer", {}, function () {}); + }, cb ); }; @@ -93,6 +100,7 @@ exports.search = function(query, cache, cb) { } ); }, + function () { }, cb ); };