Files
collabvm-1.2.ts/cvmts/src/index.ts

120 lines
3.3 KiB
TypeScript
Raw Normal View History

2023-01-31 22:00:30 -05:00
import * as toml from 'toml';
import IConfig from './IConfig.js';
2024-04-24 03:50:17 -04:00
import * as fs from 'fs';
import CollabVMServer from './CollabVMServer.js';
import { QemuVmDefinition } from '@computernewb/superqemu';
import AuthManager from './AuthManager.js';
import WSServer from './WebSocket/WSServer.js';
import { User } from './User.js';
import TCPServer from './TCP/TCPServer.js';
import VM from './vm/interface.js';
import VNCVM from './vm/vnc/VNCVM.js';
2024-06-23 02:23:59 -04:00
import GeoIPDownloader from './GeoIPDownloader.js';
import pino from 'pino';
import { Database } from './Database.js';
import { BanManager } from './BanManager.js';
import { QemuVMShim } from './vm/qemu.js';
import { TheProtocolManager } from './Protocol.js';
import { GuacamoleProtocol } from './GuacamoleProtocol.js';
2023-02-24 22:54:28 -05:00
let logger = pino();
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');
2024-04-24 03:50:17 -04:00
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) {
logger.error('Fatal error: Failed to read or parse the config file: {0}', (e as Error).message);
2024-04-24 03:50:17 -04:00
process.exit(1);
2023-01-31 22:00:30 -05:00
}
2024-06-11 13:46:24 -04:00
let exiting = false;
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;
// Database and ban manager
if (Config.bans.cvmban && !Config.mysql.enabled) {
logger.error('MySQL must be configured to use cvmban.');
process.exit(1);
}
if (!Config.bans.cvmban && !Config.bans.bancmd) {
logger.warn('Neither cvmban nor ban command are configured. Bans will not function.');
}
let db = undefined;
if (Config.mysql.enabled) {
db = new Database(Config.mysql);
await db.init();
}
let banmgr = new BanManager(Config.bans, db);
2024-06-11 13:46:24 -04:00
switch (Config.vm.type) {
case 'qemu': {
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,
2024-08-04 18:28:33 -04:00
snapshot: Config.qemu.snapshots,
forceTcp: false,
vncHost: '127.0.0.1',
vncPort: Config.qemu.vncPort,
2024-06-11 13:46:24 -04:00
};
2024-04-24 03:50:17 -04:00
VM = new QemuVMShim(def);
2024-06-11 13:46:24 -04:00
break;
}
case 'vncvm': {
2024-06-11 13:46:24 -04:00
VM = new VNCVM(Config.vncvm);
break;
}
default: {
logger.error(`Invalid VM type in config: ${Config.vm.type}`);
2024-06-11 13:46:24 -04:00
process.exit(1);
return;
}
}
process.on('SIGINT', async () => await stop());
process.on('SIGTERM', async () => await stop());
2024-04-24 03:50:17 -04:00
// Register protocol(s)
TheProtocolManager.registerProtocol("guacamole", () => new GuacamoleProtocol);
2024-06-11 13:46:24 -04:00
await VM.Start();
// Start up the server
var CVM = new CollabVMServer(Config, VM, banmgr, auth, geoipReader);
var WS = new WSServer(Config, banmgr);
WS.on('connect', (client: User) => CVM.connectionOpened(client));
WS.start();
if (Config.tcp.enabled) {
var TCP = new TCPServer(Config, banmgr);
TCP.on('connect', (client: User) => CVM.connectionOpened(client));
TCP.start();
}
}
2024-04-24 03:50:17 -04:00
start();