Mercurial > hg > rlgwebd
annotate webtty.js @ 0:bd412f63ce0d
Put this project under version control, finally.
| author | John "Elwin" Edwards <elwin@sdf.org> | 
|---|---|
| date | Sun, 06 May 2012 08:45:40 -0700 | 
| parents | |
| children | 98bf7c94c954 | 
| rev | line source | 
|---|---|
| 
0
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
1 #!/usr/bin/env node | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
2 var http = require('http'); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
3 var url = require('url'); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
4 var path = require('path'); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
5 var fs = require('fs'); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
6 //var tty = require("tty"); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
7 var child_process = require("child_process"); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
8 | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
9 var serveStaticRoot = "/home/elwin/hk/nodejs/rlg/s/"; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
10 var sessions = {}; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
11 | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
12 /* Constructor for TermSessions. Note that it opens the terminal and | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
13 * adds itself to the sessions dict. | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
14 */ | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
15 function TermSession(sessid) { | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
16 //var pterm = tty.open("/bin/bash"); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
17 this.child = child_process.spawn("./ptywreck/ptyhelperC", ["bash"]); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
18 var ss = this; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
19 /* Eventually we'll need to make sure the sessid isn't in use yet. */ | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
20 this.sessid = sessid; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
21 //this.ptmx = pterm[0]; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
22 //this.child = pterm[1]; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
23 this.alive = true; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
24 this.data = []; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
25 this.child.stdout.on("data", function (buf) { | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
26 ss.data.push(buf); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
27 }); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
28 this.child.stderr.on("data", function (buf) { | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
29 ss.data.push(buf); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
30 }); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
31 this.child.on("exit", function (code, signal) { | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
32 ss.exitcode = (code != null ? code : 255); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
33 ss.alive = false; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
34 /* Wait for all the data to get collected */ | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
35 setTimeout(ss.cleanup, 1000); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
36 }); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
37 this.write = function (data) { | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
38 if (this.alive) | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
39 this.child.stdin.write(data); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
40 /* Otherwise, throw some kind of exception? */ | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
41 }; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
42 this.read = function () { | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
43 if (this.data.length == 0) | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
44 return null; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
45 var pos = 0; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
46 var i = 0; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
47 for (i = 0; i < this.data.length; i++) | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
48 pos += this.data[i].length; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
49 var nbuf = new Buffer(pos); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
50 var tptr; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
51 pos = 0; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
52 while (this.data.length > 0) { | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
53 tptr = this.data.shift(); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
54 tptr.copy(nbuf, pos); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
55 pos += tptr.length; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
56 } | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
57 return nbuf; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
58 }; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
59 this.close = function () { | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
60 if (this.alive) | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
61 this.child.kill('SIGHUP'); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
62 }; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
63 this.cleanup = function () { | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
64 /* Call this when the child is dead. */ | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
65 if (this.alive) | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
66 return; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
67 //ss.ptmx.destroy(); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
68 /* Give the client a chance to read any leftover data. */ | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
69 if (ss.data.length > 0) | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
70 setTimeout(ss.remove, 8000); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
71 else | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
72 ss.remove(); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
73 }; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
74 this.remove = function () { | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
75 delete sessions[ss.sessid]; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
76 console.log("Session " + this.sessid + " removed."); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
77 }; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
78 sessions[sessid] = this; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
79 } | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
80 | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
81 function randkey() { | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
82 rnum = Math.floor(Math.random() * 65536 * 65536); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
83 hexstr = rnum.toString(16); | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
84 while (hexstr.length < 8) | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
85 hexstr = "0" + hexstr; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org> 
parents:  
diff
changeset
 | 
86 return hexstr; | 
| 
 
bd412f63ce0d
Put this project under version control, finally.
 
John "Elwin" Edwards <elwin@sdf.org>  | 
