Αντίγραφο ασφαλείας ενός φακέλου με BACKUP() και RESTORE(), και εκτέλεση εντολών με SHELL()
- Το
BACKUP(filename, directory, [callback], [filter])πακετάρει έναν κατάλογο (με τους υποκαταλόγους του) σε ένα αρχείο και επιλύεται με{ filename, files, size }. Ένα υπάρχον αρχείο με αυτό το όνομα αντικαθίσταται. Χωρίς callback επιστρέφει promise. - Το
RESTORE(filename, directory, [callback], [filter])αποπακετάρει ένα αρχείο που έγινε μεBACKUP()σε έναν κατάλογο, δημιουργώντας τους φακέλους που χρειάζονται, και επιλύεται με{ files, size, path }. - Το
SHELL(command, [callback], [cwd])εκτελεί μια εντολή του shell και επιλύεται με την έξοδό της (stdout). Ο φάκελος είναι αυτός του έργου ή το κείμενο που περνάτε ως τελευταίο όρισμα. Όταν η εντολή αποτύχει, το promise απορρίπτεται με ένα σφάλμα του οποίου τοcodeείναι ο κωδικός εξόδου. Με callback καλείται ωςcallback(err, stdout, stderr).
Το SHELL() εκτελεί ακριβώς το κείμενο που του δίνετε: μην φτιάχνετε ποτέ την εντολή από όσα έστειλε ένας χρήστης.
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 }));
}