| const fs = require('fs'); |
| const path = require('path'); |
| const http = require('http'); |
| const SSHClient = require('ssh2').Client; |
| const socketIO = require('socket.io'); |
|
|
| |
| const server = http.createServer(onRequest); |
|
|
| |
| const io = socketIO(server); |
|
|
| |
| let staticFiles = {}; |
| let basePath = path.join(require.resolve('xterm'), '..'); |
| staticFiles['/xterm.css'] = fs.readFileSync(path.join(basePath, '../css/xterm.css')); |
| staticFiles['/xterm.js'] = fs.readFileSync(path.join(basePath, 'xterm.js')); |
| basePath = path.join(require.resolve('xterm-addon-fit'), '..'); |
| staticFiles['/xterm-addon-fit.js'] = fs.readFileSync(path.join(basePath, 'xterm-addon-fit.js')); |
| staticFiles['/'] = fs.readFileSync('index.html'); |
|
|
| |
| function onRequest(req, res) { |
| let file; |
| if (req.method === 'GET' && (file = staticFiles[req.url])) { |
| res.writeHead(200, { |
| 'Content-Type': 'text/' + (/css$/.test(req.url) ? 'css' : (/js$/.test(req.url) ? 'javascript' : 'html')) |
| }); |
| return res.end(file); |
| } |
| res.writeHead(404); |
| res.end(); |
| } |
|
|
| |
| io.on('connection', (socket) => { |
| const conn = new SSHClient(); |
|
|
| |
| conn.on('debug', (msg) => { |
| console.log('DEBUG:', msg); |
| }); |
|
|
| |
| conn.on('ready', () => { |
| socket.emit('data', '\r\n*** SSH CONNECTION ESTABLISHED ***\r\n'); |
|
|
| |
| conn.shell((err, stream) => { |
| if (err) { |
| return socket.emit('data', '\r\n*** SSH SHELL ERROR: ' + err.message + ' ***\r\n'); |
| } |
|
|
| |
| socket.on('data', (data) => { |
| stream.write(data); |
| }); |
|
|
| |
| stream.on('data', (d) => { |
| socket.emit('data', d.toString('binary')); |
| }).on('close', () => { |
| conn.end(); |
| }); |
| }); |
| }) |
| .on('close', () => { |
| socket.emit('data', '\r\n*** SSH CONNECTION CLOSED ***\r\n'); |
| }) |
| .on('error', (err) => { |
| console.error('SSH Connection Error:', err); |
| socket.emit('data', '\r\n*** SSH CONNECTION ERROR: ' + err.message + ' ***\r\n'); |
| }) |
| .connect({ |
| host: process.env.REMOTE_HOST, |
| port: 22, |
| username: process.env.REMOTE_USERNAME, |
| password: process.env.REMOTE_PASSWORD, |
| readyTimeout: 60000, |
| debug: (msg) => console.log('DEBUG:', msg) |
| }); |
| }); |
|
|
| |
| const port = 8000; |
| console.log('Listening on port', port); |
| server.listen(port); |
|
|