penguins-eggs 25.8.28 → 25.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/.oclif.manifest.json +1 -1
  2. package/README.md +36 -31
  3. package/README.pdf +2720 -2021
  4. package/addons/eggs/adapt/applications/eggs-adapt.desktop +0 -0
  5. package/addons/eggs/pve/applications/eggs-pve.desktop +0 -0
  6. package/addons/eggs/rsupport/applications/eggs-rsupport.desktop +0 -0
  7. package/addons/eggs/theme/applications/install-system.desktop +0 -0
  8. package/assets/calamares/install-system.sh +0 -0
  9. package/assets/penguins-eggs.desktop +0 -0
  10. package/assets/penguins-krill.desktop +0 -0
  11. package/assets/penguins-links-add.desktop +0 -0
  12. package/assets/penguins-live-installer.desktop +0 -0
  13. package/bin/dev.js +0 -0
  14. package/conf/distros/alpine/calamares/calamares-modules/machineid-openrc/machineid-openrc.sh +0 -0
  15. package/conf/distros/bionic/calamares/calamares-modules/after-bootloader/after-bootloader.sh +0 -0
  16. package/conf/distros/bionic/calamares/calamares-modules/before-bootloader/before-bootloader.sh +0 -0
  17. package/conf/distros/bionic/calamares/calamares-modules/before-bootloader-mkdirs/before-bootloader-mkdirs.sh +0 -0
  18. package/conf/distros/bionic/calamares/calamares-modules/bug/bug.sh +0 -0
  19. package/conf/distros/bionic/calamares/calamares-modules/grubcfg/main.py +0 -0
  20. package/conf/distros/buster/calamares/calamares-modules/cleanup/cleanup.sh +0 -0
  21. package/conf/distros/buster/calamares/calamares-modules/dpkg-unsafe-io/dpkg-unsafe-io.sh +0 -0
  22. package/conf/distros/buster/calamares/calamares-modules/sources-yolk/sources-yolk.sh +0 -0
  23. package/conf/distros/fedora/calamares/calamares-modules/bootloaderspecification/bootloaderspecification.sh +0 -0
  24. package/conf/distros/openmamba/calamares/modules/users.yml +1 -1
  25. package/conf/distros/opensuse/calamares/calamares-modules/bootloaderspecification/bootloaderspecification.sh +0 -0
  26. package/conf/distros/opensuse/calamares/settings.yml +0 -0
  27. package/conf/distros/opensuse/calamares/zstd2lzo.sh +0 -0
  28. package/conf/init/unattended.sh +0 -0
  29. package/dist/classes/incubation/incubator.js +5 -1
  30. package/dist/classes/ovary.d/initrd.js +4 -4
  31. package/dist/classes/ovary.d/kernel-copy.js +1 -1
  32. package/dist/classes/ovary.d/make-efi.js +8 -8
  33. package/dist/classes/ovary.d/make-squashfs.js +1 -1
  34. package/dist/classes/ovary.d/produce.js +2 -2
  35. package/dist/classes/pxe.js +1 -9
  36. package/dist/classes/utils.d/kernel.js +2 -1
  37. package/dist/classes/utils.d.ts +2 -1
  38. package/dist/classes/utils.js +19 -5
  39. package/dist/commands/export/pkg.js +3 -3
  40. package/dist/krill/classes/sequence.d/add_user.js +6 -0
  41. package/dist/krill/classes/sequence.d/bootloader.js +27 -4
  42. package/dist/krill/classes/sequence.d/bootloader_config.js +60 -8
  43. package/dist/krill/classes/sequence.d/mkfs.js +8 -4
  44. package/dist/krill/classes/sequence.d/mount_vfs.js +24 -5
  45. package/dist/krill/classes/sequence.d/partition.d/uefi_standard.js +7 -5
  46. package/dist/krill/classes/sequence.js +8 -8
  47. package/dist/{penguins-eggs_25.8.28-1_i386.deb → penguins-eggs_25.9.3-1_amd64.deb} +0 -0
  48. package/dist/penguins-eggs_25.9.3-1_amd64.deb.sha256 +1 -0
  49. package/dist/{penguins-eggs_25.8.28-1_arm64.deb → penguins-eggs_25.9.3-1_arm64.deb} +0 -0
  50. package/dist/penguins-eggs_25.9.3-1_arm64.deb.sha256 +1 -0
  51. package/dist/{penguins-eggs_25.8.28-1_amd64.deb → penguins-eggs_25.9.3-1_i386.deb} +0 -0
  52. package/dist/penguins-eggs_25.9.3-1_i386.deb.sha256 +1 -0
  53. package/eui/eui-autostart-cinnamon.desktop +0 -0
  54. package/eui/eui-autostart-xfce.desktop +0 -0
  55. package/eui/eui-create-image.sh +0 -0
  56. package/eui/eui-start.sh +0 -0
  57. package/package.json +131 -125
  58. package/perrisbrewery/scripts/postinst +0 -0
  59. package/perrisbrewery/scripts/postrm +0 -0
  60. package/perrisbrewery/scripts/preinst +0 -0
  61. package/perrisbrewery/scripts/prerm +0 -0
  62. package/perrisbrewery/template/dependencies-bionic.yaml +10 -7
  63. package/pods/almalinux.sh +0 -0
  64. package/pods/archlinux.sh +0 -0
  65. package/pods/ci/kernel-overlay-install.sh +0 -0
  66. package/pods/ci/minimal/almalinux-container2host.sh +0 -0
  67. package/pods/ci/minimal/archlinux-container2host.sh +0 -0
  68. package/pods/ci/minimal/debian-container2host.sh +0 -0
  69. package/pods/ci/minimal/fedora-container2host.sh +0 -0
  70. package/pods/ci/minimal/manjaro-container2host.sh +0 -0
  71. package/pods/ci/minimal/opensuse-container2host.sh +0 -0
  72. package/pods/ci/penguins-eggs-execute.sh +0 -0
  73. package/pods/ci/penguins-eggs-install.sh +0 -0
  74. package/pods/ci/run +0 -0
  75. package/pods/ci/run-on-almalinux.sh +0 -0
  76. package/pods/ci/run-on-archlinux.sh +0 -0
  77. package/pods/ci/run-on-debian.sh +0 -0
  78. package/pods/ci/run-on-devuan.sh +0 -0
  79. package/pods/ci/run-on-fedora.sh +0 -0
  80. package/pods/ci/run-on-manjaro.sh +0 -0
  81. package/pods/ci/run-on-opensuse.sh +0 -0
  82. package/pods/ci/run-on-rockylinux.sh +0 -0
  83. package/pods/ci/run-on-ubuntu.sh +0 -0
  84. package/pods/debian.sh +0 -0
  85. package/pods/devuan.sh +0 -0
  86. package/pods/fedora.sh +0 -0
  87. package/pods/lmde.sh +0 -0
  88. package/pods/manjaro.sh +0 -0
  89. package/pods/opensuse.sh +0 -0
  90. package/pods/podman.command.sh +0 -0
  91. package/pods/rocky.sh +0 -0
  92. package/pods/run-build-packages-debs.sh +0 -0
  93. package/pods/run-create-debs.sh +0 -0
  94. package/pods/ubuntu.sh +0 -0
  95. package/scripts/99clean +0 -0
  96. package/scripts/adapt.sh +0 -0
  97. package/scripts/bros/waydroid-helper.sh +0 -0
  98. package/scripts/lsb_release +0 -0
  99. package/scripts/mom.sh +0 -0
  100. package/scripts/pve-live.service +0 -0
  101. package/scripts/pve-live.sh +0 -0
  102. package/scripts/resy +0 -0
  103. package/dist/penguins-eggs_25.8.28-1_amd64.deb.sha256 +0 -1
  104. package/dist/penguins-eggs_25.8.28-1_arm64.deb.sha256 +0 -1
  105. package/dist/penguins-eggs_25.8.28-1_i386.deb.sha256 +0 -1
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/bin/dev.js CHANGED
File without changes
@@ -60,7 +60,7 @@ defaultGroups:
60
60
  # Autologin causes a user to become automatically logged in to
61
61
  # the desktop environment on boot.
62
62
  # Disable when your Distribution does not require such a group.
63
- autologinGroup: autologin
63
+ # autologinGroup: autologin
64
64
 
65
65
 
66
66
  ### ROOT AND SUDO
File without changes
File without changes
File without changes
@@ -360,8 +360,12 @@ export default class Incubator {
360
360
  sudoers() {
361
361
  let live = 'live';
362
362
  let content = `${live} ALL=(ALL) NOPASSWD: /usr/bin/calamares`;
363
+ content = `# ${live} ALL=(ALL) NOPASSWD: /usr/bin/calamares`;
363
364
  let fname = '/etc/sudoers.d/calamares';
364
- fs.writeFileSync(fname, content, 'utf-8');
365
+ // su bionic fa un macello
366
+ if (this.distro.codenameLikeId !== 'bionic') {
367
+ fs.writeFileSync(fname, content, 'utf-8');
368
+ }
365
369
  }
366
370
  }
367
371
  /**
@@ -17,7 +17,7 @@ const __dirname = path.dirname(new URL(import.meta.url).pathname);
17
17
  * initrdAlpine
18
18
  */
19
19
  export async function initrdAlpine() {
20
- Utils.warning(`creating ${path.basename(this.initrd)} Alpine on ISO/live`);
20
+ Utils.warning(`creating ${path.basename(this.initrd)} Alpine on (ISO)/live`);
21
21
  let initrdImg = Utils.initrdImg();
22
22
  initrdImg = initrdImg.slice(Math.max(0, initrdImg.lastIndexOf('/') + 1));
23
23
  const pathConf = path.resolve(__dirname, `../../../mkinitfs/live.conf`);
@@ -27,7 +27,7 @@ export async function initrdAlpine() {
27
27
  * initrdArch
28
28
  */
29
29
  export async function initrdArch() {
30
- Utils.warning(`creating ${path.basename(this.initrd)} using mkinitcpio on ISO/live`);
30
+ Utils.warning(`creating ${path.basename(this.initrd)} using mkinitcpio on (ISO)/live`);
31
31
  let dirConf = 'arch';
32
32
  let tool = 'archiso';
33
33
  let hookSrc = '/usr/lib/initcpio/hooks/archiso_pxe_http';
@@ -64,7 +64,7 @@ export async function initrdArch() {
64
64
  * initrdDebian
65
65
  */
66
66
  export async function initrdDebian(verbose = false) {
67
- Utils.warning(`creating ${this.initrd} using mkinitramfs on ISO/live`);
67
+ Utils.warning(`creating ${this.initrd} using mkinitramfs on (ISO)/live`);
68
68
  let isCrypted = false;
69
69
  if (fs.existsSync('/etc/crypttab')) {
70
70
  isCrypted = true;
@@ -79,7 +79,7 @@ export async function initrdDebian(verbose = false) {
79
79
  * initrdDracut) Almalinux/Fedora/Openmamba/Opensuse/Rocky/Voidlinux
80
80
  */
81
81
  export async function initrdDracut() {
82
- Utils.warning(`creating ${path.basename(this.initrd)} using dracut on ISO/live`);
82
+ Utils.warning(`creating ${path.basename(this.initrd)} using dracut on (ISO)/live`);
83
83
  const prefix = this.settings.config.snapshot_prefix;
84
84
  const confdir = '--confdir ' + path.resolve(__dirname, `../../../dracut/dracut.conf.d`);
85
85
  // const dracutdir='--dracutdir /opt/penguins-eggs/dracut'
@@ -17,6 +17,6 @@ const __dirname = path.dirname(new URL(import.meta.url).pathname);
17
17
  * kernelCopy
18
18
  */
19
19
  export async function kernelCopy() {
20
- Utils.warning(`copying ${path.basename(this.vmlinuz)} on ISO/live`);
20
+ Utils.warning(`copying ${path.basename(this.vmlinuz)} on (ISO)/live`);
21
21
  await exec(`cp ${this.vmlinuz} ${this.settings.iso_work}live/`, this.echo);
22
22
  }
@@ -57,9 +57,9 @@ export async function makeEfi(theme = 'eggs') {
57
57
  const efiMemdiskDir = path.join(efiPath, '/memdisk/');
58
58
  const efiImgMnt = path.join(efiPath, 'mnt');
59
59
  const isoDir = this.settings.iso_work;
60
- // create (iso)/boot/grub
60
+ // create (ISO)/boot/grub
61
61
  await exec(`mkdir ${isoDir}/boot/grub/${Utils.uefiFormat()} -p`, this.echo);
62
- // create (iso)/EFI
62
+ // create (ISO)/EFI
63
63
  await exec(`mkdir ${isoDir}/EFI/boot -p`, this.echo);
64
64
  await exec(`cp ${shimEfi} ${isoDir}/EFI/boot/${bootEfiName()}`, this.echo);
65
65
  await exec(`cp ${grubEfi} ${isoDir}/EFI/boot/${grubEfiName()}`, this.echo);
@@ -91,9 +91,9 @@ export async function makeEfi(theme = 'eggs') {
91
91
  cfgSeekerUsbText += seeker;
92
92
  Utils.write(cfgSeekerUsb, cfgSeekerUsbText);
93
93
  /**
94
- * create grub.cfg (bridge) on (iso)/boot/grub/x86_64-efi/grub.cfg
94
+ * create grub.cfg (bridge) on (ISO)/boot/grub/x86_64-efi/grub.cfg
95
95
  */
96
- Utils.warning(`creating grub.cfg bridge to main. (iso)/boot/grub/${Utils.uefiFormat()}`);
96
+ Utils.warning(`creating grub.cfg bridge to main. (ISO)/boot/grub/${Utils.uefiFormat()}`);
97
97
  let cfgBridge = `${isoDir}/boot/grub/${Utils.uefiFormat()}/grub.cfg`;
98
98
  let cfgBridgeText = `# grub.cfg bridge\n`;
99
99
  cfgBridgeText += `# created on ${cfgBridge}\n`;
@@ -109,7 +109,7 @@ export async function makeEfi(theme = 'eggs') {
109
109
  pathBait = path.join(isoDir, '/EFI/ubuntu');
110
110
  }
111
111
  await exec(`mkdir ${pathBait} -p`, this.echo);
112
- Utils.warning(`creating grub.cfg seeker ISO/DVD on (iso)/${pathBait}}`);
112
+ Utils.warning(`creating grub.cfg seeker ISO/DVD on (ISO)/EFI/${path.basename(pathBait)}`);
113
113
  let cfgBait = path.join(pathBait, '/grub.cfg');
114
114
  let cfgBaitText = '';
115
115
  cfgBaitText += `\n`;
@@ -166,12 +166,12 @@ export async function makeEfi(theme = 'eggs') {
166
166
  await exec(`umount ${efiImgMnt}`, this.echo);
167
167
  await new Promise(resolve => setTimeout(resolve, 500));
168
168
  // Copy isoImg in ${${isoDir}/boot/grub
169
- Utils.warning("copyng efi.img on (iso)/boot/grub");
169
+ Utils.warning("copyng (efi.img) on (ISO)/boot/grub");
170
170
  await exec(`cp ${efiImg} ${isoDir}/boot/grub`, this.echo);
171
171
  /**
172
- * creating grub.cfg (4) on (iso)/boot/grub
172
+ * creating grub.cfg (4) on (ISO)/boot/grub
173
173
  */
174
- Utils.warning("creating grub.cfg main on (iso)/boot/grub");
174
+ Utils.warning("creating grub.cfg main on (ISO)/boot/grub");
175
175
  // copy splash to efiWorkDir
176
176
  const splashDest = `${efiWorkDir}/boot/grub/splash.png`;
177
177
  let splashSrc = path.resolve(__dirname, `../../../addons/${theme}/theme/livecd/splash.png`);
@@ -85,7 +85,7 @@ export async function makeSquashfs(scriptOnly = false, unsecure = false) {
85
85
  cmd = cmd.replaceAll(/\s\s+/g, ' ');
86
86
  Utils.writeX(`${this.settings.work_dir.ovarium}mksquashfs`, cmd);
87
87
  if (!scriptOnly) {
88
- Utils.warning('creating filesystem.squashfs on ISO/live');
88
+ Utils.warning('creating filesystem.squashfs on (ISO)/live');
89
89
  // Utils.warning(`compression: ` + compression)
90
90
  const test = (await exec(cmd, Utils.setEcho(true))).code;
91
91
  if (test !== 0) {
@@ -248,8 +248,8 @@ export async function produce(kernel = '', clone = false, cryptedclone = false,
248
248
  synctoCmd += ' --excludes'; // from Marco, usa home.list
249
249
  }
250
250
  await exec(synctoCmd, Utils.setEcho(true));
251
- Utils.warning(`moving ${luksFile} in ${this.nest}iso/live`);
252
- await exec(`mv ${luksFile} ${this.nest}iso/live`, this.echo);
251
+ Utils.warning(`moving ${luksFile} in ${this.nest}(ISO)/live`);
252
+ await exec(`mv ${luksFile} ${this.nest}(ISO)/live`, this.echo);
253
253
  }
254
254
  const mkIsofsCmd = (await this.xorrisoCommand(clone, cryptedclone)).replaceAll(/\s\s+/g, ' ');
255
255
  this.makeDotDisk(this.volid, mksquashfsCmd, mkIsofsCmd);
@@ -334,15 +334,7 @@ export default class Pxe {
334
334
  ip=dhcp`;
335
335
  break;
336
336
  case 'fedora':
337
- lp = `initrd=http://${Utils.address()}/live/${path.basename(this.initrdImg)} \
338
- root=live:http://${Utils.address()}/live/filesystem.squashfs \
339
- rootfstype=auto \
340
- ro \
341
- rd.live.image \
342
- rd.luks=0 \
343
- rd.md=0 \
344
- rd.dm=0\n`;
345
- break;
337
+ case 'openmamba':
346
338
  case 'opensuse':
347
339
  lp = `initrd=http://${Utils.address()}/live/${path.basename(this.initrdImg)} \
348
340
  root=live:http://${Utils.address()}/live/filesystem.squashfs \
@@ -73,10 +73,11 @@ export default class Kernel {
73
73
  initramfs = `/boot/initramfs-${version}-x86_64.img`;
74
74
  }
75
75
  else {
76
- // Gestione generica per le altre distro (Debian, Fedora, SUSE, ecc.)
76
+ // Gestione generica per le altre distro (Debian, Fedora, SUSE, OpenMamba, cc.)
77
77
  const candidates = [
78
78
  `/boot/initrd.img-${kernel}`, // Debian, Ubuntu
79
79
  `/boot/initramfs-${kernel}.img`, // Fedora, RHEL
80
+ `/boot/initramfs-${kernel}-1mamba-x86_64.img`, // Openmamba
80
81
  `/boot/initrd-${kernel}`, // openSUSE
81
82
  `/boot/initramfs-${kernel}`, // fallbacks
82
83
  ];
@@ -294,7 +294,8 @@ export default class Utils {
294
294
  /**
295
295
  *
296
296
  */
297
- static pressKeyToExit(warming?: string, procContinue?: boolean): Promise<void>;
297
+ static pressKeyToExit(warning?: string, procContinue?: boolean): Promise<void>;
298
+ static debug(cmd?: string, procContinue?: boolean): Promise<void>;
298
299
  /**
299
300
  * titles
300
301
  * Penguin's are gettings alive!
@@ -80,13 +80,15 @@ export default class Utils {
80
80
  if (codenameId === 'rolling' || codenameId === '') {
81
81
  const releaseId = Utils.getOsRelease().VERSION_ID.trim();
82
82
  if (releaseId !== '') {
83
- result += `${releaseId}-`;
83
+ result += releaseId;
84
84
  }
85
85
  }
86
86
  else {
87
- result += `${codenameId.toLowerCase()}-`;
87
+ result += `${codenameId.toLowerCase()}`;
88
+ }
89
+ if (!result.endsWith('-')) {
90
+ result += '-';
88
91
  }
89
- result = result.replace(`/`, '-');
90
92
  return result;
91
93
  }
92
94
  /**
@@ -819,8 +821,20 @@ export default class Utils {
819
821
  /**
820
822
  *
821
823
  */
822
- static async pressKeyToExit(warming = 'Process will end', procContinue = true) {
823
- Utils.warning(warming);
824
+ static async pressKeyToExit(warning = 'Process will end', procContinue = true) {
825
+ Utils.warning(warning);
826
+ let msg = 'Press a key to exit...';
827
+ if (procContinue) {
828
+ msg = 'Press a key to continue...';
829
+ }
830
+ console.log(msg);
831
+ const pressKeyToExit = spawnSync('read _ ', { shell: true, stdio: [0, 1, 2] });
832
+ if (!procContinue) {
833
+ process.exit(0);
834
+ }
835
+ }
836
+ static async debug(cmd = 'cmd', procContinue = true) {
837
+ console.log(chalk.redBright('DEBUG >>> ') + cmd + '\n');
824
838
  let msg = 'Press a key to exit...';
825
839
  if (procContinue) {
826
840
  msg = 'Press a key to continue...';
@@ -92,7 +92,7 @@ export default class ExportPkg extends Command {
92
92
  */
93
93
  }
94
94
  else if (familyId === "debian") {
95
- Utils.warning("debian deb");
95
+ Utils.warning("debian DEB");
96
96
  localPath = `/home/${this.user}/penguins-eggs/dist`;
97
97
  remotePath = this.Tu.config.remotePathPackages + "/debs";
98
98
  let arch = Utils.uefiArch();
@@ -105,7 +105,7 @@ export default class ExportPkg extends Command {
105
105
  */
106
106
  }
107
107
  else if (familyId === 'fedora') {
108
- Utils.warning("fedora rpm packages");
108
+ Utils.warning("fedora RPM");
109
109
  localPath = `/home/${this.user}/rpmbuild/RPMS/x86_64`;
110
110
  if (distroId === 'fedora') {
111
111
  remotePath = this.Tu.config.remotePathPackages + "/fedora";
@@ -121,7 +121,7 @@ export default class ExportPkg extends Command {
121
121
  }
122
122
  else if (familyId === 'openmamba') {
123
123
  Utils.warning("openmamba rpm packages");
124
- localPath = `/usr/src/RPM/RPMS/x86_64`;
124
+ localPath = `/home/${this.user}/rpmbuild/RPMS/x86_64`;
125
125
  remotePath = this.Tu.config.remotePathPackages + "/openmamba";
126
126
  filter = `penguins-eggs-[0-9][0-9].@([0-9]|[0-1][0-9]).@([0-9]|[0-3][0-9])-*mamba.*.rpm`;
127
127
  /**
@@ -29,6 +29,9 @@ export default async function addUser(username = 'live', password = 'evolution',
29
29
  else if (this.distro.familyId === 'fedora') {
30
30
  cmd = `chroot ${this.installTarget} adduser ${username} --create-home --shell /bin/bash --comment "${fullusername},${roomNumber},${workPhone},${homePhone}" ${this.toNull}`;
31
31
  }
32
+ else if (this.distro.familyId === 'openmamba') {
33
+ cmd = `chroot ${this.installTarget} useradd ${username} --create-home --shell /bin/bash --comment "${fullusername},${roomNumber},${workPhone},${homePhone}" ${this.toNull}`;
34
+ }
32
35
  else if (this.distro.familyId === 'opensuse') {
33
36
  cmd = `chroot ${this.installTarget} useradd ${username} --create-home --shell /bin/bash --comment "${fullusername},${roomNumber},${workPhone},${homePhone}" ${this.toNull}`;
34
37
  }
@@ -39,6 +42,9 @@ export default async function addUser(username = 'live', password = 'evolution',
39
42
  if (this.distro.familyId === 'debian') {
40
43
  group = 'sudo';
41
44
  }
45
+ else if (this.distro.familyId === 'openmamba') {
46
+ group = 'sysadmin';
47
+ }
42
48
  cmd = `chroot ${this.installTarget} usermod -aG ${group} ${username} ${this.toNull}`;
43
49
  await exec(cmd, this.echo);
44
50
  // add autologin group in archlinux
@@ -18,10 +18,33 @@ import path from 'node:path';
18
18
  export default async function bootloader() {
19
19
  let grubName = Diversion.grubName(this.distro.familyId);
20
20
  let grubForce = Diversion.grubForce(this.distro.familyId);
21
- /**
22
- * grub-install: added --force per fedora family
23
- */
24
- let cmd = `chroot ${this.installTarget} ${grubName}-install ${this.partitions.installationDevice} ${grubForce} ${this.toNull}`;
21
+ let cmd = '';
22
+ let grubLog = '/grub-install.lgo';
23
+ if (this.efi) {
24
+ /**
25
+ * UEFI Installation
26
+ * This is the correct way to install GRUB for UEFI systems.
27
+ * --target: Specifies the EFI architecture (x86_64-efi or arm64-efi).
28
+ * --efi-directory: Tells GRUB where the EFI System Partition is mounted. CRITICAL.
29
+ * --bootloader-id: Creates the \EFI\fedora directory on the ESP and labels the NVRAM entry. CRITICAL.
30
+ * We do NOT specify the device (e.g., /dev/sda) for UEFI.
31
+ */
32
+ let target = `x86_64-efi`;
33
+ if (process.arch === 'arm64') {
34
+ target = `arm64-efi`;
35
+ }
36
+ let bootloaderId = this.distro.distroLike.toLowerCase();
37
+ cmd = `chroot ${this.installTarget} ${grubName}-install --target=${target} --efi-directory=/boot/efi --bootloader-id=${bootloaderId} --recheck ${grubForce}`;
38
+ }
39
+ else {
40
+ /**
41
+ * MBR (Legacy BIOS) Installation
42
+ * For legacy boot, we specify the installation device directly.
43
+ */
44
+ const target = 'i386-pc';
45
+ cmd = `chroot ${this.installTarget} ${grubName}-install --target=${target} ${this.partitions.installationDevice} ${grubForce} ${grubLog}`;
46
+ }
47
+ // await Utils.debug(`grub-install: ${cmd}`)
25
48
  await exec(cmd, this.echo);
26
49
  /**
27
50
  * grub-mkconfig
@@ -20,7 +20,7 @@ export default async function bootloaderConfig() {
20
20
  if (this.distro.familyId === 'alpine') {
21
21
  if (this.efi) {
22
22
  try {
23
- cmd = `chroot ${this.installTarget} apk add grub grub-efi efibootmgr} ${this.toNull}`;
23
+ cmd = `chroot ${this.installTarget} apk add grub grub-efi efibootmgr shim} ${this.toNull}`;
24
24
  await exec(cmd, this.echo);
25
25
  }
26
26
  catch (error) {
@@ -43,7 +43,7 @@ export default async function bootloaderConfig() {
43
43
  else if (this.distro.familyId === 'archlinux') {
44
44
  if (this.efi) {
45
45
  try {
46
- cmd = `chroot ${this.installTarget} pacman -Sy grub efibootmgr} ${this.toNull}`;
46
+ cmd = `chroot ${this.installTarget} pacman -Sy grub efibootmgr shim} ${this.toNull}`;
47
47
  await exec(cmd, this.echo);
48
48
  }
49
49
  catch (error) {
@@ -75,7 +75,7 @@ export default async function bootloaderConfig() {
75
75
  const aptInstallOptions = ' apt install -y --no-upgrade --allow-unauthenticated -o Acquire::gpgv::Options::=--ignore-time-conflict ';
76
76
  if (this.efi) {
77
77
  try {
78
- cmd = `chroot ${this.installTarget} ${aptInstallOptions} grub-efi-${Utils.uefiArch()} --allow-unauthenticated ${this.toNull}`;
78
+ cmd = `chroot ${this.installTarget} ${aptInstallOptions} grub-efi-${Utils.uefiArch()} efibootmgr shim-signed --allow-unauthenticated ${this.toNull}`;
79
79
  await exec(cmd, this.echo);
80
80
  }
81
81
  catch (error) {
@@ -92,13 +92,19 @@ export default async function bootloaderConfig() {
92
92
  }
93
93
  }
94
94
  /**
95
- * fedora/openmamba
95
+ * fedora
96
96
  */
97
97
  }
98
- else if (this.distro.familyId === 'fedora' || this.distro.familyId === 'openmamba') {
98
+ else if (this.distro.familyId === 'fedora') {
99
99
  if (this.efi) {
100
100
  try {
101
- cmd = `chroot ${this.installTarget} dnf -y install grub2 grub2-efi-x64 efibootmgr shim ${this.toNull}`;
101
+ cmd = ``;
102
+ cmd += `chroot ${this.installTarget} `;
103
+ cmd += `dnf -y install grub2 `;
104
+ cmd += `grub2-efi-${process.arch} `;
105
+ cmd += `grub2-efi-${process.arch}-modules `;
106
+ cmd += `efibootmgr `;
107
+ cmd += `shim-${process.arch} ${this.toNull}`;
102
108
  await exec(cmd, this.echo);
103
109
  }
104
110
  catch (error) {
@@ -107,7 +113,43 @@ export default async function bootloaderConfig() {
107
113
  }
108
114
  else {
109
115
  try {
110
- cmd = `chroot ${this.installTarget} dnf -y install grub2 grub2-pc ${this.toNull}`;
116
+ cmd = ``;
117
+ cmd += `chroot ${this.installTarget} `;
118
+ cmd += `dnf -y install grub2 `;
119
+ cmd += `grub2-pc `;
120
+ cmd += `grub2-pc-modules ${this.toNull}`;
121
+ await exec(cmd, this.echo);
122
+ }
123
+ catch (error) {
124
+ await showError(cmd, error);
125
+ }
126
+ }
127
+ /**
128
+ * openmamba
129
+ */
130
+ }
131
+ else if (this.distro.familyId === 'openmamba') {
132
+ if (this.efi) {
133
+ try {
134
+ cmd = ``;
135
+ cmd += `chroot ${this.installTarget} `;
136
+ cmd += `dnf -y install grub `;
137
+ cmd += `grub-efi-x86_64 `;
138
+ cmd += `efibootmgr `;
139
+ cmd += `shim-signed ${this.toNull}`;
140
+ await exec(cmd, this.echo);
141
+ }
142
+ catch (error) {
143
+ await showError(cmd, error);
144
+ }
145
+ }
146
+ else {
147
+ try {
148
+ cmd = ``;
149
+ cmd += `chroot ${this.installTarget} `;
150
+ cmd += `dnf -y install grub2 `;
151
+ cmd += `grub2-pc `;
152
+ cmd += `grub2-pc-modules ${this.toNull}`;
111
153
  await exec(cmd, this.echo);
112
154
  }
113
155
  catch (error) {
@@ -121,7 +163,16 @@ export default async function bootloaderConfig() {
121
163
  else if (this.distro.familyId === 'opensuse') {
122
164
  if (this.efi) {
123
165
  try {
124
- cmd = `chroot ${this.installTarget} zypper install -y grub2 grub2-i386-pc grub2-x86_64-efi- efibootmgr} ${this.toNull}`;
166
+ cmd = `chroot ${this.installTarget} zypper install -y grub2 grub2-x86_64-efi efibootmgr shim} ${this.toNull}`;
167
+ await exec(cmd, this.echo);
168
+ }
169
+ catch (error) {
170
+ await showError(cmd, error);
171
+ }
172
+ }
173
+ else {
174
+ try {
175
+ cmd = `chroot ${this.installTarget} zypper install -y zypper install -y grub2 grub2-i386-pc ${this.toNull}`;
125
176
  await exec(cmd, this.echo);
126
177
  }
127
178
  catch (error) {
@@ -129,6 +180,7 @@ export default async function bootloaderConfig() {
129
180
  }
130
181
  }
131
182
  }
183
+ // await Utils.debug(`grub packages install cmd: ${cmd}`)
132
184
  }
133
185
  /**
134
186
  *
@@ -29,9 +29,11 @@ export default async function mkfs() {
29
29
  this.devices.efi.name = 'none'; // Trovare il modo
30
30
  }
31
31
  if (this.partitions.filesystemType === 'ext4') {
32
- // efi
32
+ /**
33
+ * EFI
34
+ */
33
35
  if (this.efi) {
34
- await exec(`mkdosfs -F 32 -I ${this.devices.efi.name} ${this.toNull}`, this.echo);
36
+ await exec(`mkfs.vfat -F 32 ${this.devices.efi.name} ${this.toNull}`, this.echo);
35
37
  }
36
38
  // boot
37
39
  if (this.devices.boot.name !== 'none') {
@@ -39,11 +41,13 @@ export default async function mkfs() {
39
41
  this.devices.boot.fsType = 'ext2';
40
42
  this.devices.boot.mountPoint = '/boot';
41
43
  }
42
- await exec(`mke2fs -Ft ${this.devices.boot.fsType} ${this.devices.boot.name} ${this.toNull}`, this.echo);
44
+ // await exec(`mke2fs -Ft ${this.devices.boot.fsType} ${this.devices.boot.name} ${this.toNull}`, this.echo)
45
+ await exec(`mkfs.${this.devices.boot.fsType} -F ${this.devices.boot.name} ${this.toNull}`, this.echo);
43
46
  }
44
47
  // root
45
48
  if (this.devices.root.name !== 'none') {
46
- await exec(`mke2fs -Ft ${this.devices.root.fsType} ${this.devices.root.name} ${this.toNull}`, this.echo);
49
+ // await exec(`mke2fs -Ft ${this.devices.root.fsType} ${this.devices.root.name} ${this.toNull}`, this.echo)
50
+ await exec(`mkfs.ext4 -F ${this.devices.root.name} ${this.toNull}`, this.echo);
47
51
  }
48
52
  // data
49
53
  if (this.devices.data.name !== 'none') {
@@ -11,18 +11,37 @@ import { exec } from '../../../lib/utils.js';
11
11
  * mountvfs()
12
12
  */
13
13
  export async function mountVfs() {
14
+ /**
15
+ * dev
16
+ */
14
17
  await exec(`mkdir ${this.installTarget}/dev ${this.toNull}`, this.echo);
15
- await exec(`mkdir ${this.installTarget}/dev/pts ${this.toNull}`, this.echo);
16
- await exec(`mkdir ${this.installTarget}/proc ${this.toNull}`, this.echo);
17
- await exec(`mkdir ${this.installTarget}/sys ${this.toNull}`, this.echo);
18
- await exec(`mkdir ${this.installTarget}/run ${this.toNull}`, this.echo);
19
18
  await exec(`mount -o bind /dev ${this.installTarget}/dev ${this.toNull}`, this.echo);
19
+ /**
20
+ * dev/pts
21
+ */
22
+ await exec(`mkdir ${this.installTarget}/dev/pts ${this.toNull}`, this.echo);
20
23
  await exec(`mount -o bind /dev/pts ${this.installTarget}/dev/pts ${this.toNull}`, this.echo);
24
+ /**
25
+ * proc
26
+ */
27
+ await exec(`mkdir ${this.installTarget}/proc ${this.toNull}`, this.echo);
21
28
  await exec(`mount -o bind /proc ${this.installTarget}/proc ${this.toNull}`, this.echo);
29
+ /**
30
+ * sys
31
+ */
32
+ await exec(`mkdir ${this.installTarget}/sys ${this.toNull}`, this.echo);
22
33
  await exec(`mount -o bind /sys ${this.installTarget}/sys ${this.toNull}`, this.echo);
34
+ /**
35
+ * sys/efivar
36
+ */
23
37
  if (this.efi) {
24
- await exec(`mount -o bind /sys/firmware/efi/efivars ${this.installTarget}/sys/firmware/efi/efivars ${this.toNull}`, this.echo);
38
+ await exec(`mkdir -p ${this.installTarget}/sys/firmware/efi/efivars ${this.toNull}`, this.echo);
39
+ await exec(`mount -o bind /sys/firmware/efi/efivars ${this.installTarget}/sys/firmware/efi/efivars`);
25
40
  }
41
+ /**
42
+ * run: use recursive binding rbins
43
+ */
44
+ await exec(`mkdir ${this.installTarget}/run ${this.toNull}`, this.echo);
26
45
  await exec(`mount -o rbind /run ${this.installTarget}/run ${this.toNull}`, this.echo);
27
46
  }
28
47
  /**
@@ -9,11 +9,13 @@
9
9
  import { exec } from '../../../../lib/utils.js';
10
10
  export default async function uefiStandard(installDevice = "", p = "") {
11
11
  await exec(`parted --script ${installDevice} mklabel gpt`, this.echo);
12
- await exec(`parted --script ${installDevice} mkpart efi fat32 34s 256MiB`, this.echo); // sda1 EFI
13
- await exec(`parted --script ${installDevice} mkpart swap linux-swap 256MiB ${this.swapSize + 256}Mib`, this.echo); // sda2 swap
14
- await exec(`parted --script ${installDevice} mkpart root ext4 ${this.swapSize + 256}MiB 100%`, this.echo); // sda3 root
15
- await exec(`parted --script ${installDevice} set 1 boot on`, this.echo); // sda1
16
- await exec(`parted --script ${installDevice} set 1 esp on`, this.echo); // sda1
12
+ // Partizione EFI: inizia a 1MiB e ha una dimensione di circa 256MiB
13
+ // Finisce a 257MiB per avere uno spazio netto di 256MiB
14
+ await exec(`parted --script ${installDevice} mkpart efi fat32 1MiB 257MiB`, this.echo);
15
+ await exec(`parted --script ${installDevice} mkpart swap linux-swap 257MiB ${this.swapSize + 257}MiB`, this.echo);
16
+ await exec(`parted --script ${installDevice} mkpart root ext4 ${this.swapSize + 257}MiB 100%`, this.echo);
17
+ await exec(`parted --script ${installDevice} set 1 boot on`, this.echo);
18
+ await exec(`parted --script ${installDevice} set 1 esp on`, this.echo);
17
19
  this.devices.efi.name = `${installDevice}${p}1`;
18
20
  this.devices.efi.fsType = 'F 32 -I';
19
21
  this.devices.efi.mountPoint = '/boot/efi';
@@ -162,12 +162,7 @@ export default class Sequence {
162
162
  // Setup (unchanged)
163
163
  await this.setupInstallation(domain, unattended, nointeractive, chroot, halt, verbose);
164
164
  // Installation sequence - each step clearly visible
165
- await this.runInstallationSequence();
166
- // Handle chroot if requested
167
- if (chroot) {
168
- const message = `You are in chroot mode under ${this.installTarget}, type "exit" to exit.`;
169
- await this.emergencyShell(message);
170
- }
165
+ await this.runInstallationSequence(chroot);
171
166
  // Completion
172
167
  await this.completeInstallation();
173
168
  }
@@ -211,7 +206,7 @@ export default class Sequence {
211
206
  /**
212
207
  * Main installation sequence - Linear and clear
213
208
  */
214
- async runInstallationSequence() {
209
+ async runInstallationSequence(chroot = false) {
215
210
  // 1. Partitioning and formatting
216
211
  let isPartitioned = false;
217
212
  await this.executeStep("Creating partitions", 0, async () => {
@@ -316,7 +311,12 @@ export default class Sequence {
316
311
  await this.executeStep(`running ${step}`, 90, () => this.execCalamaresModule(step));
317
312
  }
318
313
  }
319
- // 14. Unmounting
314
+ // 14- Handle chroot if requested
315
+ if (chroot) {
316
+ const message = `You are in chroot mode under ${this.installTarget}, type "exit" to exit.`;
317
+ await this.emergencyShell(message);
318
+ }
319
+ // 15. Unmounting
320
320
  await this.executeStep("umount Virtual File System", 96, () => this.umountVfs());
321
321
  await this.executeStep("umount File system", 99, () => this.umountFs());
322
322
  }
@@ -0,0 +1 @@
1
+ 28ef347c6cbe76b3ed0df657751b9e4c77d540926b62d0429510873bc68d9b55 penguins-eggs_25.9.3-1_amd64.deb
@@ -0,0 +1 @@
1
+ e87f2ff251f6d8043cec34f6679152f36aced09de133d46056cd546f4fbfc0bc penguins-eggs_25.9.3-1_arm64.deb