penguins-eggs
Version:
A remaster system tool, compatible with Almalinux, Alpine, Arch, Debian, Devuan, Fedora, Manjaro, Opensuse, Ubuntu and derivatives
82 lines (81 loc) • 2.7 kB
JavaScript
/**
* ./src/classes/ovary.d/luks-helpers.ts
* penguins-eggs v.25.10.x / ecmascript 2020
* author: Piero Proietti
* email: piero.proietti@gmail.com
* license: MIT
*/
import { spawn } from 'node:child_process';
import Utils from '../utils.js';
const noop = () => { };
/**
* Funzione helper per eseguire comandi esterni in modo asincrono,
* gestendo lo standard input per passare le password.
* Restituisce una Promise che si risolve al successo o si rigetta in caso di errore.
*/
export function luksExecuteCommand(command, args, stdinData) {
if (!this.hidden) {
Utils.info(`${command} ${args.join(' ')}`);
}
return new Promise((resolve, reject) => {
// Se passiamo dati a stdin, dobbiamo usare 'pipe'. Altrimenti, 'inherit'.
const stdioConfig = stdinData ? ['pipe', 'inherit', 'inherit'] : 'inherit';
const process = spawn(command, args, { stdio: stdioConfig });
// Se fornito, scriviamo i dati (es. la password) nello stdin del processo.
if (stdinData && process.stdin) {
process.stdin.write(stdinData);
process.stdin.end();
}
process.on('error', (err) => {
reject(new Error(`Error starting command "${command}": ${err.message}`));
});
process.on('close', (code) => {
if (code === 0) {
resolve(); // Success
}
else {
reject(new Error(`Command "${command} ${args.join(' ')}" ended with error code ${code}`));
}
});
});
}
/**
* buildLuksFormatArgs
*/
export function buildLuksFormatArgs(config, luksFile) {
const args = [
'--batch-mode', // Per saltare la conferma "YES"
'luksFormat',
'--type',
'luks2',
// Parametri base
'--cipher',
config.cipher,
'--key-size',
config['key-size'].toString(),
'--hash',
config.hash,
'--sector-size',
config['sector-size'].toString(),
'--pbkdf',
config.pbkdf
];
// Aggiungi i parametri condizionali del PBKDF
switch (config.pbkdf) {
case 'argon2i':
case 'argon2id': {
const argonConfig = config;
args.push('--pbkdf-memory', argonConfig['pbkdf-memory (KiB)'].toString());
args.push('--pbkdf-parallel', argonConfig['pbkdf-parallel (threads)'].toString());
break;
}
case 'pbkdf2': {
const pbkdf2Config = config;
args.push('--iter-time', pbkdf2Config['iter-time (ms)'].toString());
break;
}
}
// Aggiungi il file di destinazione
args.push(luksFile);
return args;
}