diff --git a/index.js b/index.js index 46778a2..1cb3646 100644 --- a/index.js +++ b/index.js @@ -6,6 +6,7 @@ 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')(); @@ -19,16 +20,72 @@ 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 x.friendly_name === image); + srcImage['enabled'] = true; + selectedImages.images.push(srcImage); + selectedImages.group_images.push({image_id: srcImage.image_id, group_id: "68d557ac-4cac-42cc-a9f3-1c7c853de0f3"}); } socket.emit('install', [installSettings, selectedImages]); } } +// Execute upgrade +async function upgrade() { + showTerminal() + titleChange('Upgrading'); + // Create new object based on image selection + let selectedImages = {alembic_version: images.alembic_version, images: [], group_images: []}; + if (installImages.length == 0) { + socket.emit('upgrade', [upgradeSettings, false]); + } else { + for await (let image of installImages) { + let srcImage = images.images.find(x => x.friendly_name === image); + srcImage['enabled'] = true; + selectedImages.images.push(srcImage); + selectedImages.group_images.push({image_id: srcImage.image_id, group_id: "68d557ac-4cac-42cc-a9f3-1c7c853de0f3"}); + } + socket.emit('upgrade', [upgradeSettings, selectedImages]); + } +} + // Show page container function showContainer() { $('#terminal').empty(); @@ -73,6 +94,7 @@ function renderInstall(data) { titleChange('EULA'); EULA = data[0]; images = data[1]; + gpus = data[2]; let EULADiv = $('
', {id: 'EULA'}).text(EULA); $('#container').append(EULADiv); let EULAButton = $('