2023-01-31 22:00:30 -05:00
|
|
|
import * as toml from 'toml';
|
2023-02-02 21:19:55 -05:00
|
|
|
import IConfig from './IConfig.js';
|
2024-04-24 03:50:17 -04:00
|
|
|
import * as fs from 'fs';
|
2024-05-26 23:19:55 -04:00
|
|
|
import CollabVMServer from './CollabVMServer.js';
|
2024-04-23 09:57:02 -04:00
|
|
|
|
|
|
|
|
import { QemuVM, QemuVmDefinition } from '@cvmts/qemu';
|
|
|
|
|
|
|
|
|
|
import * as Shared from '@cvmts/shared';
|
2024-04-05 09:10:47 -04:00
|
|
|
import AuthManager from './AuthManager.js';
|
2024-05-26 23:19:55 -04:00
|
|
|
import WSServer from './WebSocket/WSServer.js';
|
|
|
|
|
import { User } from './User.js';
|
2024-05-27 00:06:05 -04:00
|
|
|
import TCPServer from './TCP/TCPServer.js';
|
2024-06-11 13:46:24 -04:00
|
|
|
import VM from './VM.js';
|
|
|
|
|
import VNCVM from './VNCVM/VNCVM.js';
|
2024-06-23 02:23:59 -04:00
|
|
|
import GeoIPDownloader from './GeoIPDownloader.js';
|
2023-02-24 22:54:28 -05:00
|
|
|
|
2024-04-24 03:50:17 -04:00
|
|
|
let logger = new Shared.Logger('CVMTS.Init');
|
2024-04-23 09:57:02 -04:00
|
|
|
|
2024-04-24 03:50:17 -04:00
|
|
|
logger.Info('CollabVM Server starting up');
|
2023-01-31 22:00:30 -05:00
|
|
|
|
|
|
|
|
// Parse the config file
|
|
|
|
|
|
2024-04-24 03:50:17 -04:00
|
|
|
let Config: IConfig;
|
2023-01-31 22:00:30 -05:00
|
|
|
|
2024-04-24 03:50:17 -04:00
|
|
|
if (!fs.existsSync('config.toml')) {
|
|
|
|
|
logger.Error('Fatal error: Config.toml not found. Please copy config.example.toml and fill out fields');
|
|
|
|
|
process.exit(1);
|
2023-01-31 22:00:30 -05:00
|
|
|
}
|
|
|
|
|
try {
|
2024-04-24 03:50:17 -04:00
|
|
|
var configRaw = fs.readFileSync('config.toml').toString();
|
|
|
|
|
Config = toml.parse(configRaw);
|
2023-01-31 22:00:30 -05:00
|
|
|
} catch (e) {
|
2024-04-24 03:50:17 -04:00
|
|
|
logger.Error('Fatal error: Failed to read or parse the config file: {0}', (e as Error).message);
|
|
|
|
|
process.exit(1);
|
2023-01-31 22:00:30 -05:00
|
|
|
}
|
|
|
|
|
|
2024-06-11 13:46:24 -04:00
|
|
|
let exiting = false;
|
2024-06-22 21:26:49 -04:00
|
|
|
let VM: VM;
|
2024-06-11 13:46:24 -04:00
|
|
|
|
|
|
|
|
async function stop() {
|
|
|
|
|
if (exiting) return;
|
|
|
|
|
exiting = true;
|
|
|
|
|
await VM.Stop();
|
|
|
|
|
process.exit(0);
|
|
|
|
|
}
|
2024-04-24 03:50:17 -04:00
|
|
|
|
2024-06-11 13:46:24 -04:00
|
|
|
async function start() {
|
2024-06-23 02:23:59 -04:00
|
|
|
let geoipReader = null;
|
|
|
|
|
if (Config.geoip.enabled) {
|
|
|
|
|
let downloader = new GeoIPDownloader(Config.geoip.directory, Config.geoip.accountID, Config.geoip.licenseKey);
|
|
|
|
|
geoipReader = await downloader.getGeoIPReader();
|
|
|
|
|
}
|
2024-04-24 03:50:17 -04:00
|
|
|
// Init the auth manager if enabled
|
|
|
|
|
let auth = Config.auth.enabled ? new AuthManager(Config.auth.apiEndpoint, Config.auth.secretKey) : null;
|
2024-06-11 13:46:24 -04:00
|
|
|
switch (Config.vm.type) {
|
2024-06-22 21:26:49 -04:00
|
|
|
case 'qemu': {
|
2024-06-11 13:46:24 -04:00
|
|
|
// Print a warning if qmpSockDir is set
|
|
|
|
|
// and the host OS is Windows, as this
|
|
|
|
|
// configuration will very likely not work.
|
|
|
|
|
if (process.platform === 'win32' && Config.qemu.qmpSockDir !== null) {
|
|
|
|
|
logger.Warning("You appear to have the option 'qmpSockDir' enabled in the config.");
|
|
|
|
|
logger.Warning('This is not supported on Windows, and you will likely run into issues.');
|
|
|
|
|
logger.Warning('To remove this warning, use the qmpHost and qmpPort options instead.');
|
|
|
|
|
}
|
2024-04-24 03:50:17 -04:00
|
|
|
|
2024-06-11 13:46:24 -04:00
|
|
|
// Fire up the VM
|
|
|
|
|
let def: QemuVmDefinition = {
|
|
|
|
|
id: Config.collabvm.node,
|
2024-06-19 18:03:10 -04:00
|
|
|
command: Config.qemu.qemuArgs,
|
|
|
|
|
snapshot: Config.qemu.snapshots
|
2024-06-11 13:46:24 -04:00
|
|
|
};
|
2024-04-24 03:50:17 -04:00
|
|
|
|
2024-06-11 13:46:24 -04:00
|
|
|
VM = new QemuVM(def);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-06-22 21:26:49 -04:00
|
|
|
case 'vncvm': {
|
2024-06-11 13:46:24 -04:00
|
|
|
VM = new VNCVM(Config.vncvm);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
default: {
|
|
|
|
|
logger.Error('Invalid VM type in config: {0}', Config.vm.type);
|
|
|
|
|
process.exit(1);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
process.on('SIGINT', async () => await stop());
|
|
|
|
|
process.on('SIGTERM', async () => await stop());
|
2024-04-24 03:50:17 -04:00
|
|
|
|
2024-06-11 13:46:24 -04:00
|
|
|
await VM.Start();
|
2024-05-26 23:19:55 -04:00
|
|
|
// Start up the server
|
2024-06-23 02:23:59 -04:00
|
|
|
var CVM = new CollabVMServer(Config, VM, auth, geoipReader);
|
2024-05-26 23:19:55 -04:00
|
|
|
|
|
|
|
|
var WS = new WSServer(Config);
|
|
|
|
|
WS.on('connect', (client: User) => CVM.addUser(client));
|
|
|
|
|
WS.start();
|
2024-05-27 00:06:05 -04:00
|
|
|
|
|
|
|
|
if (Config.tcp.enabled) {
|
|
|
|
|
var TCP = new TCPServer(Config);
|
|
|
|
|
TCP.on('connect', (client: User) => CVM.addUser(client));
|
|
|
|
|
TCP.start();
|
|
|
|
|
}
|
2023-02-02 21:19:55 -05:00
|
|
|
}
|
2024-04-24 03:50:17 -04:00
|
|
|
start();
|