// Imports var Docker = require('dockerode'); var socketIO = require('socket.io'); var pty = require("node-pty"); var fsw = require('fs').promises; var fs = require('fs'); var os = require('os'); var yaml = require('js-yaml'); var _ = require('lodash'); var si = require('systeminformation'); var express = require('express'); var app = require('express')(); var privateKey = fs.readFileSync('/opt/kasm/certs/kasm_wizard.key', 'utf8'); var certificate = fs.readFileSync('/opt/kasm/certs/kasm_wizard.crt', 'utf8'); var credentials = {key: privateKey, cert: certificate}; var https = require('https').Server(credentials, app); var baserouter = express.Router(); var docker = new Docker({socketPath: '/var/run/docker.sock'}); var arch = os.arch().replace('x64', 'amd64'); var baseUrl = process.env.SUBFOLDER || '/'; var version = process.env.VERSION || 'stable'; var port = process.env.KASM_PORT || '443'; const { spawn } = require('node:child_process'); var EULA; var images; var currentVersion; var gpuInfo; var installSettings = {}; var upgradeSettings = {}; // Grab installer variables async function installerBlobs() { EULA = await fsw.readFile('/kasm_release/licenses/LICENSE.txt', 'utf8'); let imagesText = await fsw.readFile('/wizard/default_images_' + arch + '.yaml', 'utf8'); images = yaml.load(imagesText); currentVersion = fs.readFileSync('/version.txt', 'utf8').replace(/(\r\n|\n|\r)/gm,''); let gpuData = []; let gpuCmd = spawn('/gpuinfo.sh'); gpuCmd.stdout.on('data', function(data) { gpuData.push(data); }); gpuCmd.on('close', function(code) { try { if (code == 0) { gpuInfo = JSON.parse(gpuData.join('')); } else { gpuInfo = {}; } } catch (err) { // Manually backfill GPU info if available gpuInfo = {}; for (let i = 0; i < 10; i++) { let num = i.toString(); if (fs.existsSync('/dev/dri/card' + num)) { gpuInfo['/dev/dri/card' + num] = "Unknown GPU"; } } } }); } installerBlobs(); // GPU image yaml merging async function setGpu(imagesI) { if (upgradeSettings['forceGpu'] !== undefined) { installSettings = upgradeSettings; } let gpu = installSettings.forceGpu.split('|')[0]; let gpuName = installSettings.forceGpu.split('|')[1]; let card = gpu.slice(-1); let render = (Number(card) + 128).toString(); // Handle NVIDIA Gpus var baseRun; if (gpuName.indexOf('NVIDIA') !== -1) { baseRun = JSON.parse('{"runtime":"nvidia","environment":{"NVIDIA_DRIVER_CAPABILITIES":"all","KASM_EGL_CARD":"/dev/dri/card' + card + '","KASM_RENDERD":"/dev/dri/renderD' + render + '"},"device_requests":[{"driver": "","count": -1,"device_ids": null,"capabilities":[["gpu"]],"options":{}}]}'); } else { baseRun = JSON.parse('{"environment":{"DRINODE":"/dev/dri/renderD' + render + '", "HW3D": true},"devices":["/dev/dri/card' + card + ':/dev/dri/card' + card + ':rwm","/dev/dri/renderD' + render + ':/dev/dri/renderD' + render + ':rwm"]}'); } let baseExec = JSON.parse('{"first_launch":{"user":"root","cmd": "bash -c \'chown -R kasm-user:kasm-user /dev/dri/*\'"}}'); for (var i=0; i