// Those packages needs to be installed to build ipxe: // sudo apt install liblzma-dev // sudo apt install mkisofs /* global __appdir */ var path = require('path') var shell = require('shelljs') var ipxeGIT = 'git://git.ipxe.org/ipxe.git' var io = require(path.join(__appdir, 'lib', 'socketio')) const fs = require('fs') module.exports = { buildIpxe: async function (req, res) { const ipxeVersion = req.params.version // Cloning git. sendToLog(ipxeVersion, 'Cloning git ...\n', 'primary') await cloneIpxe(ipxeVersion) // Copying configs. sendToLog(ipxeVersion, 'Copying configs ...\n', 'primary') copyConfigs(ipxeVersion) // Make ipxe. sendToLog(ipxeVersion, 'Make iPXE ...\n', 'primary') shell.cd(path.join(__appdir, 'ipxe', 'ipxe_' + ipxeVersion, 'src')) // Different make command for efi / bios are needed. var makeCmd = '' if (ipxeVersion === 'efi') makeCmd = 'make bin-x86_64-efi/snponly.efi EMBED=' + path.join(__appdir, 'ipxe', 'embedded_' + ipxeVersion + '.ipxe') + ' TRUST=' + path.join(__appdir, 'bin', 'fullchain.pem')// + ' bin/undionly.kpxe' else if (ipxeVersion === 'bios') makeCmd = 'make EMBED=' + path.join(__appdir, 'ipxe', 'embedded_' + ipxeVersion + '.ipxe') + ' TRUST=' + path.join(__appdir, 'bin', 'fullchain.pem')// + ' bin/undionly.kpxe' await new Promise((resolve, reject) => { var make = shell.exec(makeCmd, { async: true }, () => { resolve() }) // Send the output to the frontend log. make.stdout.on('data', data => { sendToLog(ipxeVersion, data, 'normal') }) make.stderr.on('data', data => { sendToLog(ipxeVersion, data, 'error') }) }) // Copy and rename the ipxe file. shell.cp('bin/undionly.kpxe', path.join(__appdir, 'ipxe')) shell.mv(path.join(__appdir, 'ipxe', 'undionly.kpxe'), path.join(__appdir, 'ipxe', 'ipxe.' + ipxeVersion)) }, clean: async function (ipxeVersion) { shell.cd(path.join(__appdir, 'ipxe')) shell.rm('-rf', 'ipxe_' + ipxeVersion) shell.rm(path.join(__appdir, 'ipxe', 'ipxe.' + ipxeVersion)) shell.rm(path.join(__appdir, 'ipxe', 'log_' + ipxeVersion + '.txt')) sendToLog(ipxeVersion, 'iPXE files successfully cleaned', 'success', false) } } async function cloneIpxe(ipxeVersion) { // Check if git is installed on the server. if (!shell.which('git')) { return { status: 'GIT_MISSING', error_message: 'Please install git on the server.' } } shell.cd(path.join(__appdir, 'ipxe')) return new Promise((resolve, reject) => { var clone = shell.exec('git clone ' + ipxeGIT + ' ipxe_' + ipxeVersion, { async: true }, () => { resolve() }) clone.stdout.on('data', data => { sendToLog(ipxeVersion, data, 'normal') }) clone.stderr.on('data', data => { sendToLog(ipxeVersion, data, 'error') }) }) } function copyConfigs(ipxeVersion) { // Remove the default configs and paste in the customized ones. shell.rm(path.join(__appdir, 'ipxe', 'ipxe_' + ipxeVersion, 'src', 'config', 'general.h')) shell.rm(path.join(__appdir, 'ipxe', 'ipxe_' + ipxeVersion, 'src', 'config', 'console.h')) shell.cp(path.join(__appdir, 'ipxe', 'general_' + ipxeVersion + '.h'), path.join(__appdir, 'ipxe', 'ipxe_' + ipxeVersion, 'src', 'config', 'general.h')) shell.cp(path.join(__appdir, 'ipxe', 'console_' + ipxeVersion + '.h'), path.join(__appdir, 'ipxe', 'ipxe_' + ipxeVersion, 'src', 'config', 'console.h')) return } function sendToLog(ipxeVersion, msg, status, writeLog = true) { var date = new Date(); var dateString = '[' + date.getFullYear() + '-' var month = parseInt(date.getMonth()) + 1 if (month < 10) dateString += '0' + month + '-' else dateString += month + '-' if (parseInt(date.getDate()) < 10) dateString += '0' + date.getDate() + ' ' else dateString += date.getDate() + ' ' if (parseInt(date.getHours()) < 10) dateString += '0' + date.getHours() + ':' else dateString += date.getHours() + ':' if (parseInt(date.getMinutes()) < 10) dateString += '0' + date.getMinutes() + ':' else dateString += date.getMinutes() + ':' if (parseInt(date.getSeconds()) < 10) dateString += '0' + date.getSeconds() else dateString += date.getSeconds() dateString += ']' var logEntry = { date: dateString, status: status, msg: msg } var socket = ipxeVersion + ' log' io.in('broadcast ipxeBuild').emit(socket, logEntry) if (writeLog) writeLog(ipxeVersion, logEntry) } function writeLog(ipxeVersion, logEntry) { fs.writeFile(path.join(__appdir, 'ipxe', 'log_' + ipxeVersion + '.txt'), logEntry.date + '\t' + logEntry.status + '\t' + logEntry.msg, { flag: 'a+' }, (err) => { if (err) throw err }) }