Mercurial > hg > rlgwebd
comparison rlgwebd.js @ 139:dcd07c1d846a
Replace the daemon module with posix.
The daemon module doesn't include chroot() anymore, so a replacement
is needed. Detaching a daemon keeps getting harder to do in Node, so
some setup has been moved into a shell script.
| author | John "Elwin" Edwards |
|---|---|
| date | Sat, 20 Jul 2013 12:23:53 -0700 |
| parents | 823e878e5840 |
| children | 1a156a7746a7 |
comparison
equal
deleted
inserted
replaced
| 138:144595e50376 | 139:dcd07c1d846a |
|---|---|
| 7 var url = require('url'); | 7 var url = require('url'); |
| 8 var path = require('path'); | 8 var path = require('path'); |
| 9 var fs = require('fs'); | 9 var fs = require('fs'); |
| 10 var events = require('events'); | 10 var events = require('events'); |
| 11 var child_process = require('child_process'); | 11 var child_process = require('child_process'); |
| 12 var daemon = require(path.join(localModules, "daemon")); | 12 var posix = require(path.join(localModules, "posix")); |
| 13 var pty = require(path.join(localModules, "pty.js")); | 13 var pty = require(path.join(localModules, "pty.js")); |
| 14 var WebSocketServer = require(path.join(localModules, "websocket")).server; | 14 var WebSocketServer = require(path.join(localModules, "websocket")).server; |
| 15 | 15 |
| 16 /* Configuration variables */ | 16 /* Configuration variables */ |
| 17 // These first two files are NOT in the chroot. | 17 // The first file is NOT in the chroot. |
| 18 var ctlsocket = "/var/local/rlgwebd/ctl"; | 18 var ctlsocket = "/var/local/rlgwebd/ctl"; |
| 19 var logfile = "/var/local/rlgwebd/log"; | |
| 20 var httpPort = 8080; | 19 var httpPort = 8080; |
| 21 var chrootDir = "/var/dgl/"; | 20 var chrootDir = "/var/dgl/"; |
| 22 var dropToUID = 501; | 21 var dropToUID = 501; |
| 23 var dropToGID = 501; | 22 var dropToGID = 501; |
| 24 var serveStaticRoot = "/var/www/"; // inside the chroot | 23 var serveStaticRoot = "/var/www/"; // inside the chroot |
| 909 if (err) { | 908 if (err) { |
| 910 sendError(res, 7); | 909 sendError(res, 7); |
| 911 return; | 910 return; |
| 912 } | 911 } |
| 913 var pid = parseInt(fdata.split('\n')[0], 10); | 912 var pid = parseInt(fdata.split('\n')[0], 10); |
| 914 process.kill(pid, 'SIGHUP'); | 913 try { |
| 914 process.kill(pid, 'SIGHUP'); | |
| 915 } | |
| 916 catch (err) { | |
| 917 /* If the PID is invalid, the lockfile is stale. */ | |
| 918 if (err.code == "ESRCH") { | |
| 919 var nodere = RegExp("^" + pname + ":node:"); | |
| 920 if (fname.match(nodere)) { | |
| 921 fs.unlink(fullfile); | |
| 922 } | |
| 923 } | |
| 924 } | |
| 915 /* The response doesn't mean that the game is gone. The only way | 925 /* The response doesn't mean that the game is gone. The only way |
| 916 * to make sure a dgamelaunch-supervised game is over would be to | 926 * to make sure a dgamelaunch-supervised game is over would be to |
| 917 * poll fname until it disappears. */ | 927 * poll fname until it disappears. */ |
| 918 res.writeHead(200, {'Content-Type': 'application/json'}); | 928 res.writeHead(200, {'Content-Type': 'application/json'}); |
| 919 res.write(JSON.stringify({"t": "q"})); | 929 res.write(JSON.stringify({"t": "q"})); |
| 1394 /* Open the control socket before chrooting where it can't be found */ | 1404 /* Open the control socket before chrooting where it can't be found */ |
| 1395 var ctlServer = net.createServer(function (sock) { | 1405 var ctlServer = net.createServer(function (sock) { |
| 1396 sock.on('data', conHandler); | 1406 sock.on('data', conHandler); |
| 1397 }); | 1407 }); |
| 1398 ctlServer.listen(ctlsocket, function () { | 1408 ctlServer.listen(ctlsocket, function () { |
| 1399 /* fork off and die */ | 1409 /* rlgwebd.js now assumes that it has been started by the rlgwebd shell |
| 1410 * script, or some other method that detaches it and sets up stdio. */ | |
| 1411 /* chroot and drop permissions. posix.chroot() does chdir() itself. */ | |
| 1400 try { | 1412 try { |
| 1401 daemon.start(logfile); | 1413 posix.chroot(chrootDir); |
| 1402 } | |
| 1403 catch (err) { | |
| 1404 tslog("Daemonization failed: %s", err); | |
| 1405 process.exit(1); | |
| 1406 } | |
| 1407 /* chroot and drop permissions. daemon.chroot() does chdir() itself. */ | |
| 1408 try { | |
| 1409 daemon.chroot(chrootDir); | |
| 1410 } | 1414 } |
| 1411 catch (err) { | 1415 catch (err) { |
| 1412 tslog("chroot to %s failed: %s", chrootDir, err); | 1416 tslog("chroot to %s failed: %s", chrootDir, err); |
| 1413 process.exit(1); | 1417 process.exit(1); |
| 1414 } | 1418 } |
