UNPKG

penguins-eggs

Version:

A remaster system tool, compatible with Almalinux, Alpine, Arch, Debian, Devuan, Fedora, Manjaro, Opensuse, Ubuntu and derivatives

375 lines (374 loc) 15.6 kB
/** * penguins-eggs * class: distro.ts * author: Piero Proietti * email: piero.proietti@gmail.com * license: MIT */ import yaml from 'js-yaml'; import fs from 'node:fs'; import path from 'node:path'; import { shx } from '../lib/utils.js'; import Diversions from './diversions.js'; import Utils from './utils.js'; // _dirname const __dirname = path.dirname(new URL(import.meta.url).pathname); /** * Classe */ class Distro { bugReportUrl; codenameId; distroId; distroLike; distroUniqueId; familyId; homeUrl; isCalamaresAvailable; liveMediumPath; releaseId; squashfs; supportUrl; syslinuxPath; usrLibPath; /** * Costruttore */ constructor() { // Tutti i default sono per Debian this.bugReportUrl = 'https://github.com-pieroproietti/penguins-eggs/issue'; this.codenameId = ''; this.distroUniqueId = ''; this.distroId = ''; this.distroLike = ''; this.familyId = 'debian'; this.homeUrl = 'https://penguins-eggs.net'; this.isCalamaresAvailable = true; this.liveMediumPath = '/run/live/medium/'; this.releaseId = ''; this.squashfs = 'live/filesystem.squashfs'; this.supportUrl = 'https://penguins-eggs.net'; this.syslinuxPath = path.resolve(__dirname, `../../syslinux`); this.usrLibPath = '/usr/lib'; /** * getOsRelease */ const osInfo = Utils.getOsRelease(); this.distroId = osInfo.ID; this.codenameId = osInfo.VERSION_CODENAME; this.releaseId = osInfo.VERSION_ID; if (this.distroId === 'Debian' && this.codenameId === 'sid') { this.codenameId = 'trixie'; } if (this.distroId.includes('Biglinux')) { this.distroId = 'Biglinux'; } if (this.distroId.includes('Bigcommunity')) { this.distroId = 'Bigcommunity'; } /** * Alpine, Fedora, openmamba, opensuse analyze **distroId** * * Arch, Debian, Devuan, Ubuntu and derivatives we analyze **codebaseId** * */ switch (this.distroId) { case 'Almalinux': case 'Fedora': case 'Nobara': case 'Rhel': case 'Rocky': { this.familyId = 'fedora'; this.distroLike = 'Fedora'; this.codenameId = 'rolling'; // viene rimosso dal nome this.distroUniqueId = this.familyId; // per krill this.liveMediumPath = '/run/initramfs/live/'; /** * openmamba */ break; } case 'Alpine': { /** * Alpine compatible */ this.familyId = 'alpine'; this.distroLike = this.distroId; this.codenameId = 'rolling'; // viene rimosso dal nome this.distroUniqueId = this.familyId; // per krill this.liveMediumPath = '/mnt/'; // Qua è deciso da noi /** * Fedora family: Almalinux, Fedora, Nobara. Rhel, Rocky */ break; } case 'Openmamba': { this.familyId = 'openmamba'; this.distroLike = 'Openmamba'; this.codenameId = 'rolling'; // viene rimosso dal nome this.distroUniqueId = this.familyId; // per krill this.liveMediumPath = '/run/initramfs/live/'; /** * opensuse compatible */ break; } default: { if (this.distroId.includes('Opensuse')) { this.familyId = 'opensuse'; this.distroLike = 'Opensuse'; // this.distroId this.codenameId = 'rolling'; // sistemare non this.distroUniqueId = this.familyId; // per krill this.liveMediumPath = '/run/initramfs/live/'; // check } else { /** * Debian/ARCH: we analize **codenameId** */ /** * Arch */ switch (this.codenameId) { case 'beowulf': { this.distroLike = 'Devuan'; this.distroUniqueId = 'beowulf'; /** * Devuan chimaera */ break; } case 'bookworm': { this.distroLike = 'Debian'; this.distroUniqueId = 'bookworm'; /** * Debian 13 trixie */ break; } case 'bullseye': { this.distroLike = 'Debian'; this.distroUniqueId = 'bullseye'; /** * Debian 12 bookworm */ break; } case 'buster': { this.distroLike = 'Debian'; this.distroUniqueId = 'buster'; /** * Debian 11 bullseye */ break; } case 'chimaera': { this.distroLike = 'Devuan'; this.distroUniqueId = 'chimaera'; /** * Devuan daedalus */ break; } case 'daedalus': { this.distroLike = 'Devuan'; this.distroUniqueId = 'daedalus'; /** * Devuan excalibur */ break; } case 'devel': { this.distroLike = 'Ubuntu'; this.distroUniqueId = 'devel'; break; } case 'excalibur': { this.distroLike = 'Devuan'; this.distroUniqueId = 'excalibur'; /** * Ubuntu focal */ break; } case 'focal': { this.distroLike = 'Ubuntu'; this.distroUniqueId = 'focal'; /** * Ubuntu jammy */ break; } case 'forky': { this.distroLike = 'Debian'; this.distroUniqueId = 'forky'; /** * Devuan beowulf */ break; } case 'jammy': { this.distroLike = 'Ubuntu'; this.distroUniqueId = 'jammy'; /** * Ubuntu noble */ break; } case 'jessie': { this.distroLike = 'Debian'; this.distroUniqueId = 'jessie'; this.liveMediumPath = '/lib/live/mount/medium/'; this.isCalamaresAvailable = false; /** * Debian 9 stretch */ break; } case 'n/a': case 'rolling': { this.familyId = 'archlinux'; this.distroLike = 'Arch'; this.codenameId = 'rolling'; this.distroUniqueId = 'archlinux'; this.liveMediumPath = '/run/archiso/bootmnt/'; this.squashfs = `arch/x86_64/airootfs.sfs`; /** * Debian 8 jessie */ break; } case 'noble': { this.distroLike = 'Ubuntu'; this.distroUniqueId = 'noble'; /** * Ubuntu devel */ break; } case 'stretch': { this.distroLike = 'Debian'; this.distroUniqueId = 'stretch'; this.liveMediumPath = '/lib/live/mount/medium/'; this.isCalamaresAvailable = false; /** * Debian 10 buster */ break; } case 'trixie': { this.distroLike = 'Debian'; this.distroUniqueId = 'trixie'; this.liveMediumPath = '/run/live/medium/'; // initramfs /** * Debian 14 forky */ break; } default: { /** * derivatives */ let found = false; /** * derivatives: families archlinux, debian */ let archDebianDerivatives = path.resolve(__dirname, '../../conf/derivatives.yaml'); if (fs.existsSync('/etc/penguins-eggs.d/derivatives.yaml')) { archDebianDerivatives = '/etc/penguins-eggs.d/derivatives.yaml'; } const content = fs.readFileSync(archDebianDerivatives, 'utf8'); const distros = yaml.load(content); for (const distro of distros) { if (distro.ids !== undefined) { for (let n = 0; n < distro.ids.length; n++) { if (this.codenameId === distro.ids[n]) { found = true; this.distroLike = distro.distroLike; this.distroUniqueId = distro.id; this.familyId = distro.family; found = true; } } } } /** * derivatives: family fedora */ if (!found) { let fedoraDerivatives = path.resolve(__dirname, '../../conf/derivatives_fedora.yaml'); if (fs.existsSync('/etc/penguins-eggs.d/derivatives_fedora.yaml')) { fedoraDerivatives = '/etc/penguins-eggs.d/derivatives_fedora.yaml'; } const content = fs.readFileSync(fedoraDerivatives, 'utf8'); const elem = yaml.load(content); if (elem.includes(this.distroId)) { this.familyId = 'fedora'; this.distroLike = 'Fedora'; this.codenameId = 'rolling'; this.distroUniqueId = this.familyId; this.liveMediumPath = '/run/initramfs/live/'; found = true; } } if (!found) { console.log(`This distro ${this.distroId}/${this.codenameId} is not yet recognized!`); console.log(''); console.log('You can edit /usr/lib/penguins-eggs/conf/derivatives.yaml to add it -'); console.log('after that - run: sudo eggs dad -d to re-configure eggs.'); console.log('If you can create your new iso, you can contribute to the project'); console.log('by suggesting your modification.'); process.exit(0); } } } } } } /** * Ultimi ritocchi */ /** * Debian: /usr/lib/x86_64-linux-gnu * /usr/lib/aarch64-linux-gnu */ if (this.familyId === 'debian') { this.usrLibPath = '/usr/lib/' + Utils.usrLibPath(); } else if (this.familyId === 'opensuse') { this.usrLibPath = '/usr/lib64/'; } /** * Manjarolinux anf derivatives (biglinux) */ if (Diversions.isManjaroBased(this.distroId)) { this.liveMediumPath = '/run/miso/bootmnt/'; this.squashfs = 'manjaro/x86_64/livefs.sfs'; this.codenameId = shx.exec(`lsb_release -cs`, { silent: true }).stdout.toString().trim(); this.distroUniqueId = 'manjaro'; } /** * lettura os_release per i pulsanti */ const os_release = '/etc/os-release'; if (fs.existsSync(os_release)) { let lines = []; if (fs.existsSync(os_release)) { const data = fs.readFileSync(os_release, 'utf8'); lines = data.split('\n'); } // read every line for (const line of lines) { if (line.startsWith('HOME_URL=')) { this.homeUrl = line.slice('HOME_URL='.length).replaceAll('"', ''); } else if (line.startsWith('SUPPORT_URL=')) { this.supportUrl = line.slice('SUPPORT_URL='.length).replaceAll('"', ''); } else if (line.startsWith('BUG_REPORT_URL=')) { this.bugReportUrl = line.slice('BUG_REPORT_URL='.length).replaceAll('"', ''); } } } } } export default Distro;