ForgeTotal.js 5
sv

Total.js 5

Säkerhetskopiera en mapp med BACKUP() och RESTORE(), och kör kommandon med SHELL()

Total.js 5 · total5@0.0.19 backupshellfiles Körd med Total.js 5
  • BACKUP(filename, directory, [callback], [filter]) packar en katalog (med underkataloger) till en enda fil och löses med { filename, files, size }. En befintlig fil med det namnet ersätts. Utan callback returnerar den ett löfte.
  • RESTORE(filename, directory, [callback], [filter]) packar upp en fil som gjorts med BACKUP() i en katalog, skapar de mappar som behövs, och löses med { files, size, path }.
  • SHELL(command, [callback], [cwd]) kör ett skalkommando och löses med dess utdata (stdout). Mappen är projektets mapp, eller den text du anger som sista argument. När kommandot misslyckas avvisas löftet med ett fel vars code är avslutskoden. Med en callback anropas den som callback(err, stdout, stderr).

SHELL() kör exakt den text du ger den: bygg aldrig kommandot av det en användare skickat.

controllers/backups.js
const Fs = require('fs');
const Path = require('path');

exports.install = function() {
	ROUTE('GET /backup/', backup);
	ROUTE('GET /shell/', shell);
};

async function backup($) {

	// a folder with a file and a subfolder
	const source = PATH.tmp('source');
	Fs.rmSync(source, { recursive: true, force: true });
	Fs.mkdirSync(Path.join(source, 'sub'), { recursive: true });
	Fs.writeFileSync(Path.join(source, 'a.txt'), 'hello');
	Fs.writeFileSync(Path.join(source, 'sub', 'b.txt'), 'world');

	const file = PATH.tmp('folder.backup');
	const packed = await BACKUP(file, source);

	const target = PATH.tmp('restored');
	Fs.rmSync(target, { recursive: true, force: true });
	const unpacked = await RESTORE(file, target);

	$.json({
		packed: [packed.files, packed.filename === file, Fs.existsSync(file)],
		unpacked: [unpacked.files, unpacked.size, unpacked.path === target],
		content: [Fs.readFileSync(Path.join(target, 'a.txt'), 'utf8'), Fs.readFileSync(Path.join(target, 'sub', 'b.txt'), 'utf8')]
	});
}

async function shell($) {

	const output = await SHELL('echo hello');
	const where = await SHELL('pwd', PATH.tmp());

	let code = null;
	try {
		await SHELL('exit 3');
	} catch (e) {
		code = e.code;
	}

	SHELL('echo from callback', (err, stdout) => $.json({ output: output, where: where.trim() === PATH.tmp() || where.trim().endsWith('/tmp'), code: code, callback: stdout }));
}