penguins-eggs
Version:
A remaster system tool, compatible with Almalinux, Alpine, Arch, Debian, Devuan, Fedora, Manjaro, Opensuse, Ubuntu and derivatives
104 lines (103 loc) • 3.62 kB
JavaScript
/**
* ./src/classes/ovary.d/make-squashfs.ts
* penguins-eggs v.25.7.x / ecmascript 2020
* author: Piero Proietti
* email: piero.proietti@gmail.com
* license: MIT
*/
// packages
import fs from 'fs';
import path from 'node:path';
// classes
import { exec } from '../../lib/utils.js';
import Utils from '../utils.js';
// _dirname
const __dirname = path.dirname(new URL(import.meta.url).pathname);
/**
* squashFs: crea in live filesystem.squashfs
*/
export async function makeSquashfs(scriptOnly = false, includeRootHome = false) {
if (this.verbose) {
console.log('Ovary: makeSquashfs');
}
/**
* exclude all the accurence of cryptdisks in rc0.d, etc
*/
const fexcludes = ['/boot/efi/EFI', '/boot/loader/entries/', '/etc/fstab', '/var/lib/containers/', '/var/lib/docker/', '/etc/mtab', '/etc/udev/rules.d/70-persistent-cd.rules', '/etc/udev/rules.d/70-persistent-net.rules'];
for (const i in fexcludes) {
this.addExclusion(fexcludes[i]);
}
/**
* Non sò che fa, ma sicuro non serve per archlinux
*/
if (this.familyId === 'debian') {
const rcd = ['rc0.d', 'rc1.d', 'rc2.d', 'rc3.d', 'rc4.d', 'rc5.d', 'rc6.d', 'rcS.d'];
let files;
// escludo per ci
for (const i in rcd) {
if (fs.existsSync(`${this.settings.work_dir.merged}/etc/${rcd[i]}`)) {
files = fs.readdirSync(`${this.settings.work_dir.merged}/etc/${rcd[i]}`);
for (const n in files) {
if (files[n].includes('cryptdisks')) {
this.addExclusion(`/etc/${rcd[i]}${files[n]}`);
}
}
}
}
}
/**
* secure
*/
if (!includeRootHome) {
this.addExclusion(`root/*`);
this.addExclusion(`root/.*`);
}
this.addExclusion(this.settings.config.snapshot_dir /* .absolutePath() */);
const sfsPath = path.join(this.settings.iso_work, 'live/filesystem.squashfs');
if (fs.existsSync(sfsPath)) {
fs.unlinkSync(sfsPath);
}
const compression = `-comp ${this.settings.config.compression}`;
/**
* limit: patch per Raspberry
*/
const limit = '';
if (Utils.uefiArch() === 'arm64') {
// limit = ' -processors 2 -mem 1024M'
}
/**
* mksquashfs
*
* SYNTAX: mksquashfs source1 source2 ...
* FILESYSTEM [OPTIONS]
* [-ef exclude.list]
* [-e list of exclude dirs/files]
*/
const sfsName = 'filesystem.squashfs';
let cmd = `mksquashfs ${this.settings.work_dir.merged} ${sfsPath} ${compression} ${limit} -wildcards -ef ${this.settings.config.snapshot_excludes} ${this.settings.session_excludes}`;
cmd = cmd.replaceAll(/\s\s+/g, ' ');
Utils.writeX(`${this.settings.work_dir.bin}mksquashfs`, cmd);
if (!scriptOnly) {
Utils.warning('creating filesystem.squashfs on (ISO)/live');
// Utils.warning(`compression: ` + compression)
const test = (await exec(cmd, Utils.setEcho(true))).code;
if (test !== 0) {
process.exit();
}
}
return cmd;
}
/**
* Add or remove exclusion
* @param add {boolean} true = add, false remove
* @param exclusion {string} path to add/remove
*/
export function addExclusion(exclusion) {
if (this.verbose) {
console.log(`add exclusion: ${exclusion}`);
}
if (exclusion.startsWith('/')) {
exclusion = exclusion.slice(1); // remove / initial Non compatible with rsync
}
this.settings.session_excludes += this.settings.session_excludes === '' ? `-e '${exclusion}' ` : ` '${exclusion}' `;
}