]>
Commit | Line | Data |
---|---|---|
a8f02531 CJ |
1 | #!/usr/bin/env node |
2 | ||
6cc8b3cd | 3 | /** |
628af053 | 4 | * term.js |
6cc8b3cd CJ |
5 | * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) |
6 | */ | |
7 | ||
8 | var http = require('http') | |
9 | , express = require('express') | |
10 | , io = require('socket.io') | |
628af053 CJ |
11 | , pty = require('pty.js') |
12 | , terminal = require('../'); | |
6cc8b3cd CJ |
13 | |
14 | /** | |
628af053 | 15 | * term.js |
6cc8b3cd CJ |
16 | */ |
17 | ||
628af053 | 18 | process.title = 'term.js'; |
6cc8b3cd | 19 | |
15f68335 CJ |
20 | /** |
21 | * Dump | |
22 | */ | |
23 | ||
24 | var stream; | |
25 | if (process.argv[2] === '--dump') { | |
26 | stream = require('fs').createWriteStream(__dirname + '/dump.log'); | |
27 | } | |
28 | ||
6cc8b3cd CJ |
29 | /** |
30 | * Open Terminal | |
31 | */ | |
32 | ||
33 | var buff = [] | |
34 | , socket | |
35 | , term; | |
36 | ||
628af053 CJ |
37 | term = pty.fork(process.env.SHELL || 'sh', [], { |
38 | name: require('fs').existsSync('/usr/share/terminfo/x/xterm-256color') | |
39 | ? 'xterm-256color' | |
40 | : 'xterm', | |
6cc8b3cd CJ |
41 | cols: 80, |
42 | rows: 24, | |
43 | cwd: process.env.HOME | |
44 | }); | |
45 | ||
46 | term.on('data', function(data) { | |
15f68335 | 47 | if (stream) stream.write('OUT: ' + data + '\n-\n'); |
6cc8b3cd CJ |
48 | return !socket |
49 | ? buff.push(data) | |
50 | : socket.emit('data', data); | |
51 | }); | |
52 | ||
53 | console.log('' | |
54 | + 'Created shell with pty master/slave' | |
55 | + ' pair (master: %d, pid: %d)', | |
56 | term.fd, term.pid); | |
57 | ||
58 | /** | |
59 | * App & Server | |
60 | */ | |
61 | ||
62 | var app = express() | |
63 | , server = http.createServer(app); | |
64 | ||
65 | app.use(function(req, res, next) { | |
66 | var setHeader = res.setHeader; | |
67 | res.setHeader = function(name) { | |
68 | switch (name) { | |
69 | case 'Cache-Control': | |
70 | case 'Last-Modified': | |
71 | case 'ETag': | |
72 | return; | |
73 | } | |
74 | return setHeader.apply(res, arguments); | |
75 | }; | |
76 | next(); | |
77 | }); | |
78 | ||
628af053 CJ |
79 | app.use(express.basicAuth(function(user, pass, next) { |
80 | if (user !== 'foo' || pass !== 'bar') { | |
81 | return next(true); | |
82 | } | |
83 | return next(null, user); | |
84 | })); | |
85 | ||
6cc8b3cd | 86 | app.use(express.static(__dirname)); |
628af053 | 87 | app.use(terminal.middleware()); |
6cc8b3cd | 88 | |
a8f02531 CJ |
89 | if (!~process.argv.indexOf('-n')) { |
90 | server.on('connection', function(socket) { | |
91 | var address = socket.remoteAddress; | |
92 | if (address !== '127.0.0.1' && address !== '::1') { | |
93 | try { | |
94 | socket.destroy(); | |
95 | } catch (e) { | |
96 | ; | |
97 | } | |
98 | console.log('Attempted connection from %s. Refused.', address); | |
efa0e3c1 | 99 | } |
a8f02531 CJ |
100 | }); |
101 | } | |
102 | ||
103 | server.listen(8080); | |
efa0e3c1 | 104 | |
6cc8b3cd CJ |
105 | /** |
106 | * Sockets | |
107 | */ | |
108 | ||
628af053 CJ |
109 | io = io.listen(server, { |
110 | log: false | |
6cc8b3cd CJ |
111 | }); |
112 | ||
113 | io.sockets.on('connection', function(sock) { | |
114 | socket = sock; | |
115 | ||
116 | socket.on('data', function(data) { | |
15f68335 | 117 | if (stream) stream.write('IN: ' + data + '\n-\n'); |
6cc8b3cd CJ |
118 | term.write(data); |
119 | }); | |
120 | ||
121 | socket.on('disconnect', function() { | |
122 | socket = null; | |
123 | }); | |
124 | ||
125 | while (buff.length) { | |
126 | socket.emit('data', buff.shift()); | |
127 | } | |
128 | }); |