-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathserver.js
101 lines (86 loc) · 3.22 KB
/
server.js
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
89
90
91
92
93
94
95
96
97
98
99
100
'use strict';
const packageFile = require('./package.json');
const GuacamoleLite = require('./lib/Server');
const Https = require('https');
const fs = require('fs');
const { createLogger, transports, format } = require('winston');
const { combine, splat, timestamp, printf } = format;
const PORT = process.env.PORT || 8080;
const CRYPT_SECRET = process.env.CRYPT_SECRET;
const CRYPT_CYPHER = process.env.CRYPT_CYPHER || 'AES-256-CBC';
const GUACD_HOST = process.env.GUACD_HOST || '127.0.0.1';
const GUACD_PORT = process.env.GUACD_PORT || 4822;
const USER_DRIVE_ROOT = process.env.USER_DRIVE_ROOT || '/tmp/drives'
const SSL_CERT_PATH = process.env.SSL_CERT_PATH;
const SSL_KEY_PATH = process.env.SSL_KEY_PATH;
const loggerFormat = printf( ({ level, message, timestamp , ...metadata}) => {
let msg = `${timestamp} [${level}] : ${message} `
if(metadata) {
msg += JSON.stringify(metadata)
}
return msg
});
const logger = createLogger({
level: process.env.LOG_LEVEL || 'info',
format: format.combine(
format.colorize(),
splat(),
timestamp(),
loggerFormat
),
transports: [
new transports.Console(),
]
});
function start(cryptKey, cryptCypher, websocketPort , guacdHost, guacdPort) {
logger.info('[GUACWS] Starting Server');
logger.info(`[GUACWS] Version ${packageFile.version}`);
if (!cryptKey || cryptKey.length === 0) {
logger.error('[GUACWS] No secret key specified, please specify a key with CRYPT_SECRET environment variable');
return;
}
let httpsServer = undefined;
if (SSL_CERT_PATH && SSL_KEY_PATH) {
try {
const hasCert = fs.existsSync(SSL_CERT_PATH);
const hasKey = fs.existsSync(SSL_KEY_PATH);
if (hasCert && hasKey) {
httpsServer = Https.createServer({
cert: fs.readFileSync(SSL_CERT_PATH),
key: fs.readFileSync(SSL_KEY_PATH),
});
}
} catch (err) {
logger.error('[GUACWS] Could not load SSL certificate/key, please check the SSL certificate key and path exist and are valid');
return;
}
}
const websocketOptions = httpsServer ? { server: httpsServer } : { port: websocketPort };
const guacdOptions = {
host: guacdHost,
port: guacdPort,
};
const clientOptions = {
crypt: {
cypher: cryptCypher,
key: cryptKey
}
};
const callbacks = {
processConnectionSettings: function (settings, callback) {
if (settings.userFolder) {
settings.connection['drive-path'] = `${USER_DRIVE_ROOT}/user_${settings.userFolder}`;
}
callback(null, settings);
}
};
logger.info(`[GUACWS] WebSocket on ${httpsServer ? 'wss' : 'ws'}://0.0.0.0:${websocketPort}`);
logger.info(`[GUACWS] GuacD host on ${guacdHost}:${guacdPort}`);
return new GuacamoleLite(logger, websocketOptions, guacdOptions, clientOptions, callbacks);
}
const server = start(CRYPT_SECRET, CRYPT_CYPHER, PORT, GUACD_HOST, GUACD_PORT);
if (server) {
logger.info('[GUACWS] WebSocket Tunnel running');
} else {
logger.error('[GUACWS] Failed to start WebSocket Tunnel');
}