You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

100 lines
2.5 KiB

var express = require('express');
var http = require('http');
var https = require('https');
var path = require('path');
var ws = require('websocket').server;
var pty = require('pty.js');
var fs = require('fs');
var opts = require('optimist')
.options({
sslkey: {
demand: false,
description: 'path to SSL key'
},
sslcert: {
demand: false,
description: 'path to SSL certificate'
},
port: {
demand: true,
alias: 'p',
description: 'port'
}
}).boolean('allow_discovery').argv;
var runhttps = false;
if (opts.sslkey && opts.sslcert) {
runhttps = true;
opts['ssl'] = {};
opts.ssl['key'] = fs.readFileSync(path.resolve(opts.sslkey));
opts.ssl['cert'] = fs.readFileSync(path.resolve(opts.sslcert));
}
process.on('uncaughtException', function(e) {
console.error('Error: ' + e);
});
var httpserv;
var app = express();
app.use('/', express.static(path.join(__dirname, 'public')));
if (runhttps) {
httpserv = https.createServer(opts.ssl, app).listen(opts.port, function() {
console.log('https on port ' + opts.port);
});
} else {
httpserv = http.createServer(app).listen(opts.port, function() {
console.log('http on port ' + opts.port);
});
}
var wss = new ws({
httpServer: httpserv
});
wss.on('request', function(request) {
var term;
var conn = request.accept('wetty', request.origin);
console.log((new Date()) + ' Connection accepted.');
conn.on('message', function(msg) {
var data = JSON.parse(msg.utf8Data);
if (!term) {
if (process.getuid() == 0) {
term = pty.spawn('/bin/login', [], {
name: 'xterm-256color',
cols: 80,
rows: 30
});
} else {
term = pty.spawn('ssh', ['localhost'], {
name: 'xterm-256color',
cols: 80,
rows: 30
});
}
term.on('data', function(data) {
conn.send(JSON.stringify({
data: data
}));
});
}
if (!data)
return;
if (data.rowcol) {
term.resize(data.col, data.row);
} else if (data.data) {
term.write(data.data);
}
});
conn.on('error', function() {
term.end();
});
conn.on('close', function() {
term.end();
})
})