changeset 8:ad0a31e52007

Call the dgl replacement rlgwebd instead of webttyd.
author John "Elwin" Edwards <elwin@sdf.org>
date Mon, 07 May 2012 16:08:59 -0700
parents d1b3c3af34d6
children 826a7ced69f8
files index-rlg.html rlgwebd.js webttyd.js
diffstat 3 files changed, 528 insertions(+), 533 deletions(-) [+]
line wrap: on
line diff
--- a/index-rlg.html	Mon May 07 16:03:10 2012 -0700
+++ b/index-rlg.html	Mon May 07 16:08:59 2012 -0700
@@ -1,14 +1,14 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 <html>
 <head>
-<title>WebTTY</title>
+<title>RLG-Web</title>
 <script type="text/javascript" src="termemu.js"></script>
 <script type="text/javascript" src="termemu-keys.js"></script>
 <script type="text/javascript" src="rlgterm.js"></script>
 <link rel="stylesheet" type="text/css" href="tty.css">
 </head>
 <body onload="setup()" onkeydown="sendkey(event)">
-<h1>WebTTY</h1>
+<h1>RLG-Web</h1>
 <div id ="top">
   <span id="ttitle"></span>
   <img src="/bell.png" alt="bell" id="bell">
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rlgwebd.js	Mon May 07 16:08:59 2012 -0700
@@ -0,0 +1,526 @@
+#!/usr/bin/env node
+
+// If you can't quite trust node to find it on its own
+var localModules = '/usr/local/lib/node_modules/';
+var http = require('http');
+var url = require('url');
+var path = require('path');
+var fs = require('fs');
+var child_process = require('child_process');
+var daemon = require(path.join(localModules, "daemon"));
+
+var chrootDir = "/var/dgl/";
+var dropToUID = 501;
+var dropToGID = 501;
+var serveStaticRoot = "/var/www/"; // inside the chroot
+var passwdfile = "/dgldir/dgl-login";
+var sessions = {};
+
+var games = {
+  "rogue3": {
+    "name": "Rogue V3",
+    "uname": "rogue3",
+    "path": "/bin/rogue3"
+  },
+  "rogue4": {
+    "name": "Rogue V4",
+    "uname": "rogue4",
+    "path": "/bin/rogue4"
+  },
+  "rogue5": {
+    "name": "Rogue V5",
+    "uname": "rogue5",
+    "path": "/bin/rogue5"
+  },
+  "srogue": {
+    "name": "Super-Rogue",
+    "uname": "srogue",
+    "path": "/bin/srogue"
+  }
+};
+
+/* Constructor for TermSessions.  Note that it opens the terminal and 
+ * adds itself to the sessions dict. It currently assumes the user has
+ * been authenticated.
+ */
+function TermSession(game, user, files) {
+  /* First make sure starting the game will work. */
+  if (!(game in games)) {
+    // TODO: throw an exception instead
+    return null;
+  }
+  /* This order seems to best avoid race conditions... */
+  this.alive = false;
+  this.sessid = randkey();
+  while (this.sessid in sessions) {
+    this.sessid = randkey();
+  }
+  /* Grab a spot in the sessions table. */
+  sessions[this.sessid] = this;
+  /* TODO handle tty-opening errors */
+  /* TODO make argument-finding into a method */
+  args = [games[game].path, "-n", user.toString()];
+  this.child = child_process.spawn("/bin/ptyhelper", args);
+  var ss = this;
+  this.alive = true;
+  this.data = [];
+  this.lock = files[0];
+  fs.writeFile(this.lock, this.child.pid.toString() + '\n80\n24\n', "utf8"); 
+  this.record = fs.createWriteStream(files[1], { mode: 0664 });
+  /* END setup */
+  function ttyrec_chunk(buf) {
+    var ts = new Date();
+    var chunk = new Buffer(buf.length + 12);
+    /* TTYREC headers */
+    chunk.writeUInt32LE(Math.floor(ts.getTime() / 1000), 0);
+    chunk.writeUInt32LE(1000 * (ts.getTime() % 1000), 4);
+    chunk.writeUInt32LE(buf.length, 8);
+    buf.copy(chunk, 12);
+    ss.data.push(chunk);
+    ss.record.write(chunk);
+  }
+  this.child.stdout.on("data", ttyrec_chunk);
+  this.child.stderr.on("data", ttyrec_chunk);
+  this.child.on("exit", function (code, signal) {
+    ss.exitcode = (code != null ? code : 255);
+    ss.alive = false;
+    fs.unlink(ss.lock);
+    /* Wait for all the data to get collected */
+    setTimeout(ss.cleanup, 1000);
+  });