File size: 2,616 Bytes
f5f8a63
 
 
 
 
f1aa5a4
f5f8a63
 
 
 
 
f1aa5a4
 
f5f8a63
 
f1aa5a4
 
 
 
 
 
 
 
f5f8a63
f1aa5a4
 
f5f8a63
f1aa5a4
 
 
 
 
 
 
f5f8a63
 
 
c32ab8c
 
 
 
 
 
f5f8a63
 
f1aa5a4
c32ab8c
f5f8a63
 
 
f1aa5a4
f5f8a63
c32ab8c
f5f8a63
 
f1aa5a4
 
c32ab8c
f5f8a63
 
f1aa5a4
f5f8a63
f1aa5a4
 
 
f5f8a63
 
f1aa5a4
f5f8a63
 
c32ab8c
f1aa5a4
f5f8a63
 
c32ab8c
 
 
 
 
 
f1aa5a4
 
 
f5f8a63
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
const fs = require('fs');
const path = require('path');
const http = require('http');
const SSHClient = require('ssh2').Client;
const socketIO = require('socket.io');

// Create HTTP server
const server = http.createServer(onRequest);

// Attach Socket.IO to the server
const io = socketIO(server);

// Load static files into memory
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');

// Handle static file serving
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();
}

// Setup WebSocket connection
io.on('connection', (socket) => {
  const conn = new SSHClient();

  // Debug logging
  conn.on('debug', (msg) => {
    console.log('DEBUG:', msg);
  });

  // On SSH connection ready
  conn.on('ready', () => {
    socket.emit('data', '\r\n*** SSH CONNECTION ESTABLISHED ***\r\n');

    // Start shell session
    conn.shell((err, stream) => {
      if (err) {
        return socket.emit('data', '\r\n*** SSH SHELL ERROR: ' + err.message + ' ***\r\n');
      }

      // When data is received from the client, write to the stream
      socket.on('data', (data) => {
        stream.write(data);
      });

      // Send data back to the client when received from the SSH session
      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)  // Enable debug logging
  });
});

// Start the server
const port = 8000;
console.log('Listening on port', port);
server.listen(port);