UNPKG

vhd-manager

Version:

VHD Manager

143 lines (108 loc) 3.43 kB
const { exec } = require('child_process'); const fs = require('fs'); /** * @Description (Vhd Manager) * @site jezuu.es * @author chulibyy * @date 29-03-2019 */ class VHD { /** * @constructor * @return {object}{name, version, methods} */ constructor() { this.name = 'Vhd Manager'; this.version = '1.0.2'; this.methods = { create: this.create } } /** * @create * @param {object} data {file<string>, size<string>:<int>, unit<string>, type<string>, format<string>, label<string>, start<bool>} * @return {Promise<object>} out {msg<string>, error<bool>} */ async create(data) { const _isElevated = async(data) => { return new Promise(async(resolve) => { await exec('NET SESSION', (err, so, se) => { resolve(se.length === 0 ? true : false); }); }); }; if (!await _isElevated()) return { msg: 'Access denied due to insufficient privilege.', error: true }; const _getTempFile = () => { let currentTime = new Date().getTime(); let tempDir = process.env.TEMP || process.env.TMPDIR; return tempDir + '\\' + 'vhd-' + currentTime; }; const _getAppData = () => { let dataDir = process.env.APPDATA; return dataDir + '\\VHD\\'; }; if (!Number.isInteger(data.size)) data.size = parseInt(data.size, 10); if (data.unit === 'mb') data.size = data.size; if (data.unit === 'gb') data.size = data.size * 1000; if (data.unit === 'tb') data.size = data.size * 1000000; return new Promise(async(resolve) => { let temp = _getTempFile(); if (fs.existsSync(temp)) fs.unlinkSync(temp); let content = [ `create vdisk file="${data.file}" maximum=${data.size} type=${data.type}`, `select vdisk file="${data.file}"`, `attach vdisk`, `create partition primary`, `format fs=${data.format} label="${data.label}" quick`, `assign` ].join(`\r\n`); await fs.writeFile(temp, content, { flag: 'wx' }, async (err) => { if(!err) { await exec(`diskpart /s "${temp}"`, async (error, stdout) => { if (!error && data.start === true) { let app = _getAppData(); await fs.lstat(app, async (err) => { if (err && err.code === 'ENOENT') await fs.mkdirSync(app); let currentTime = new Date().getTime(); let appData = app + `${data.label}_${currentTime}.bin`; let appScript = app + `${data.label}_${currentTime}.cmd`; let dataContent = [ `select vdisk file="${data.file}"`, `attach vdisk` ].join(`\r\n`); let scriptContent = [ `@echo off`, `DISKPART /s "${appData}"` ].join(`\r\n`); await fs.writeFile(appData, dataContent, { flag: 'a+' }, async (err) => { if (!err) { await fs.writeFile(appScript, scriptContent, { flag: 'a+' }, async (err) => { if (!err) await exec(`SCHTASKS /CREATE /RU "SYSTEM" /TN "Auto-Mount VHD-${data.label}" /TR "${appScript}" /SC ONSTART`); }); } }); }); } resolve({ msg: error ? 'Error Creating VHD.' : 'VHD Created.', error: error ? true : false }); await fs.unlink(temp, (err) => {}); }); } }); }); } }; module.exports = new VHD();