vhd-manager
Version:
VHD Manager
143 lines (108 loc) • 3.43 kB
JavaScript
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();