# HG changeset patch # User John "Elwin" Edwards # Date 1338844901 25200 # Node ID 83f9a799a3745182c8b257d0ec4d8c2d8843f242 # Parent 9b58f8d3ea700c08d00b4b2278c0b669954dc6e4 rlgwebd.js: read commands from the console The RLG-Web server can now be controlled with commands sent to stdin. Currently, the only one implemented is "quit". Some improvements to the shutdown process were also made. diff -r 9b58f8d3ea70 -r 83f9a799a374 rlgterm.js --- a/rlgterm.js Mon Jun 04 10:19:36 2012 -0700 +++ b/rlgterm.js Mon Jun 04 14:21:41 2012 -0700 @@ -132,7 +132,7 @@ if (!msgDict.t) return null; else if (msgDict.t == "E") { - if (msgDict.c == 1) { + if (msgDict.c == 1 || msgDict.c == 6) { logout(); } debug(1, "Server error: " + msgDict.s); diff -r 9b58f8d3ea70 -r 83f9a799a374 rlgwebd.js --- a/rlgwebd.js Mon Jun 04 10:19:36 2012 -0700 +++ b/rlgwebd.js Mon Jun 04 14:21:41 2012 -0700 @@ -15,6 +15,7 @@ var serveStaticRoot = "/var/www/"; // inside the chroot var passwdfile = "/dgldir/dgl-login"; var sessions = {}; +var allowlogin = true; var games = { "rogue3": { @@ -198,8 +199,9 @@ ss.remove(); }; this.remove = function () { - delete sessions[ss.sessid]; - tslog("Session %s removed.", this.sessid); + var id = ss.sessid; + delete sessions[id]; + tslog("Session %s removed.", id); }; } @@ -305,6 +307,10 @@ } function login(req, res, formdata) { + if (!allowlogin) { + sendError(res, 6, null); + return; + } if (!("game" in formdata)) { sendError(res, 2, "No game specified."); return; @@ -521,8 +527,14 @@ if (result == null) { if (term.alive) reply.t = "n"; - else - reply.t = "q"; + else { + if (allowlogin) + reply.t = "q"; + else { + sendError(res, 6, null); + return; + } + } } else { reply.t = "d"; @@ -539,7 +551,8 @@ } var errorcodes = [ "Generic Error", "Not logged in", "Invalid data", - "Login failed", "Already playing", "Game launch failed" ]; + "Login failed", "Already playing", "Game launch failed", + "Server shutting down" ]; function sendError(res, ecode, msg) { res.writeHead(200, { "Content-Type": "text/plain" }); @@ -554,7 +567,7 @@ res.end(); } -function handler(req, res) { +function webHandler(req, res) { /* default headers for the response */ var resheaders = {'Content-Type': 'text/html'}; /* The request body will be added to this as it arrives. */ @@ -635,6 +648,26 @@ } +function shutdown () { + httpServer.close(); + httpServer.removeAllListeners('request'); + process.stdin.removeAllListeners('data'); + tslog("Shutting down..."); + process.exit(); +} + +function conHandler(chunk) { + var msg = chunk.toString().split('\n')[0]; + if (msg == "quit") { + allowlogin = false; + tslog("Disconnecting..."); + for (var sessid in sessions) { + sessions[sessid].close(); + } + setTimeout(shutdown, 10000); + } +} + process.on("exit", function () { for (var sessid in sessions) { if (sessions[sessid].alive) @@ -675,5 +708,8 @@ process.exit(1); } -http.createServer(handler).listen(8080, "127.0.0.1"); +process.stdin.on('data', conHandler); +process.stdin.resume(); +var httpServer = http.createServer(webHandler); +httpServer.listen(8080, "127.0.0.1"); tslog('rlgwebd running at http://127.0.0.1:8080/');