changeset 27:83f9a799a374

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.
author John "Elwin" Edwards <elwin@sdf.org>
date Mon, 04 Jun 2012 14:21:41 -0700
parents 9b58f8d3ea70
children 2ad2b6491aa9
files rlgterm.js rlgwebd.js
diffstat 2 files changed, 44 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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/');