penguins-eggs 25.10.3 → 25.10.6
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.
- package/.oclif.manifest.json +1 -1
- package/README.md +826 -0
- package/conf/distros/archlinux/calamares/modules/bootloader.yml +86 -0
- package/conf/distros/archlinux/calamares/modules/partition.yml +8 -386
- package/conf/distros/archlinux/calamares/settings.yml +0 -4
- package/conf/distros/fedora/calamares/modules/README.md +4 -0
- package/conf/distros/fedora/calamares/modules/bootloader.yml +2 -1
- package/conf/distros/fedora/calamares/modules/mount.yml +6 -1
- package/conf/distros/fedora/calamares/settings.yml +6 -1
- package/conf/distros/focal/calamares/modules/mount.yml +23 -5
- package/conf/distros/noble/calamares/libexec/calamares-l10n-helper.sh +3 -0
- package/conf/distros/opensuse/calamares/calamares-modules/bootloaderspecification/bootloaderspecification.sh +1 -1
- package/conf/distros/opensuse/calamares/modules/dracut.mustache +7 -0
- package/conf/distros/opensuse/calamares/modules/packages.mustache +1 -0
- package/conf/distros/opensuse/calamares/modules/removeuser.mustache +2 -1
- package/conf/distros/opensuse/calamares/modules/unpackfs.mustache +2 -1
- package/conf/distros/opensuse/calamares/settings.yml +1 -1
- package/dist/classes/bleach.d.ts +37 -0
- package/dist/classes/bleach.js +148 -0
- package/dist/classes/cli-autologin.d.ts +52 -0
- package/dist/classes/cli-autologin.js +252 -0
- package/dist/classes/compressors.d.ts +54 -0
- package/dist/classes/compressors.js +109 -0
- package/dist/classes/daddy.d.ts +26 -0
- package/dist/classes/daddy.js +175 -0
- package/dist/classes/distro.d.ts +32 -0
- package/dist/classes/distro.js +356 -0
- package/dist/classes/diversions.d.ts +53 -0
- package/dist/classes/diversions.js +133 -0
- package/dist/classes/incubation/branding.d.ts +17 -0
- package/dist/classes/incubation/branding.js +85 -0
- package/dist/classes/incubation/customize/customize-partitions.d.ts +4 -0
- package/dist/classes/incubation/customize/customize-partitions.js +29 -0
- package/dist/classes/incubation/fisherman-helper/initcpio.d.ts +1 -0
- package/dist/classes/incubation/fisherman-helper/initcpio.js +69 -0
- package/dist/classes/incubation/fisherman-helper/packages.d.ts +20 -0
- package/dist/classes/incubation/fisherman-helper/packages.js +72 -0
- package/dist/classes/incubation/fisherman-helper/settings.d.ts +15 -0
- package/dist/classes/incubation/fisherman-helper/settings.js +116 -0
- package/dist/classes/incubation/fisherman.d.ts +71 -0
- package/dist/classes/incubation/fisherman.js +281 -0
- package/dist/classes/incubation/incubator.d/alpine.d.ts +32 -0
- package/dist/classes/incubation/incubator.d/alpine.js +78 -0
- package/dist/classes/incubation/incubator.d/archlinux.d.ts +32 -0
- package/dist/classes/incubation/incubator.d/archlinux.js +81 -0
- package/dist/classes/incubation/incubator.d/bionic.d.ts +32 -0
- package/dist/classes/incubation/incubator.d/bionic.js +83 -0
- package/dist/classes/incubation/incubator.d/buster.d.ts +32 -0
- package/dist/classes/incubation/incubator.d/buster.js +101 -0
- package/dist/classes/incubation/incubator.d/fedora.d.ts +32 -0
- package/dist/classes/incubation/incubator.d/fedora.js +81 -0
- package/dist/classes/incubation/incubator.d/focal.d.ts +32 -0
- package/dist/classes/incubation/incubator.d/focal.js +85 -0
- package/dist/classes/incubation/incubator.d/manjaro.d.ts +32 -0
- package/dist/classes/incubation/incubator.d/manjaro.js +82 -0
- package/dist/classes/incubation/incubator.d/noble.d.ts +32 -0
- package/dist/classes/incubation/incubator.d/noble.js +102 -0
- package/dist/classes/incubation/incubator.d/openmamba.d.ts +32 -0
- package/dist/classes/incubation/incubator.d/openmamba.js +81 -0
- package/dist/classes/incubation/incubator.d/opensuse.d.ts +32 -0
- package/dist/classes/incubation/incubator.d/opensuse.js +81 -0
- package/dist/classes/incubation/incubator.d/trixie.d.ts +32 -0
- package/dist/classes/incubation/incubator.d/trixie.js +101 -0
- package/dist/classes/incubation/incubator.d.ts +48 -0
- package/dist/classes/incubation/incubator.js +378 -0
- package/dist/classes/incubation/installer.d.ts +13 -0
- package/dist/classes/incubation/installer.js +52 -0
- package/dist/classes/keyboards.d.ts +50 -0
- package/dist/classes/keyboards.js +287 -0
- package/dist/classes/locales.d.ts +21 -0
- package/dist/classes/locales.js +77 -0
- package/dist/classes/network.d.ts +37 -0
- package/dist/classes/network.js +98 -0
- package/dist/classes/ovary.d/bind-live-fs.d.ts +18 -0
- package/dist/classes/ovary.d/bind-live-fs.js +185 -0
- package/dist/classes/ovary.d/bind-vfs.d.ts +17 -0
- package/dist/classes/ovary.d/bind-vfs.js +37 -0
- package/dist/classes/ovary.d/create-xdg-autostart.d.ts +13 -0
- package/dist/classes/ovary.d/create-xdg-autostart.js +194 -0
- package/dist/classes/ovary.d/edit-live-fs.d.ts +20 -0
- package/dist/classes/ovary.d/edit-live-fs.js +245 -0
- package/dist/classes/ovary.d/fertilization.d.ts +12 -0
- package/dist/classes/ovary.d/fertilization.js +52 -0
- package/dist/classes/ovary.d/finished.d.ts +13 -0
- package/dist/classes/ovary.d/finished.js +44 -0
- package/dist/classes/ovary.d/initrd.d.ts +21 -0
- package/dist/classes/ovary.d/initrd.js +97 -0
- package/dist/classes/ovary.d/kernel-copy.d.ts +12 -0
- package/dist/classes/ovary.d/kernel-copy.js +22 -0
- package/dist/classes/ovary.d/live-create-structure.d.ts +12 -0
- package/dist/classes/ovary.d/live-create-structure.js +73 -0
- package/dist/classes/ovary.d/make-dot-disk.d.ts +12 -0
- package/dist/classes/ovary.d/make-dot-disk.js +62 -0
- package/dist/classes/ovary.d/make-efi.d.ts +14 -0
- package/dist/classes/ovary.d/make-efi.js +274 -0
- package/dist/classes/ovary.d/make-iso.d.ts +13 -0
- package/dist/classes/ovary.d/make-iso.js +45 -0
- package/dist/classes/ovary.d/make-squashfs.d.ts +18 -0
- package/dist/classes/ovary.d/make-squashfs.js +110 -0
- package/dist/classes/ovary.d/merged.d.ts +27 -0
- package/dist/classes/ovary.d/merged.js +78 -0
- package/dist/classes/ovary.d/produce.d.ts +23 -0
- package/dist/classes/ovary.d/produce.js +319 -0
- package/dist/classes/ovary.d/rexec.d.ts +13 -0
- package/dist/classes/ovary.d/rexec.js +34 -0
- package/dist/classes/ovary.d/syslinux.d.ts +12 -0
- package/dist/classes/ovary.d/syslinux.js +82 -0
- package/dist/classes/ovary.d/user-create-live.d.ts +14 -0
- package/dist/classes/ovary.d/user-create-live.js +97 -0
- package/dist/classes/ovary.d/users-remove.d.ts +9 -0
- package/dist/classes/ovary.d/users-remove.js +38 -0
- package/dist/classes/ovary.d/xorriso-command.d.ts +14 -0
- package/dist/classes/ovary.d/xorriso-command.js +123 -0
- package/dist/classes/ovary.d.ts +87 -0
- package/dist/classes/ovary.js +90 -0
- package/dist/classes/pacman.d/alpine.d.ts +56 -0
- package/dist/classes/pacman.d/alpine.js +167 -0
- package/dist/classes/pacman.d/archlinux.d.ts +62 -0
- package/dist/classes/pacman.d/archlinux.js +128 -0
- package/dist/classes/pacman.d/debian.d.ts +65 -0
- package/dist/classes/pacman.d/debian.js +143 -0
- package/dist/classes/pacman.d/fedora.d.ts +53 -0
- package/dist/classes/pacman.d/fedora.js +107 -0
- package/dist/classes/pacman.d/openmamba.d.ts +52 -0
- package/dist/classes/pacman.d/openmamba.js +106 -0
- package/dist/classes/pacman.d/opensuse.d.ts +53 -0
- package/dist/classes/pacman.d/opensuse.js +109 -0
- package/dist/classes/pacman.d.ts +139 -0
- package/dist/classes/pacman.js +683 -0
- package/dist/classes/pve-live.d.ts +17 -0
- package/dist/classes/pve-live.js +52 -0
- package/dist/classes/pxe.d.ts +76 -0
- package/dist/classes/pxe.js +353 -0
- package/dist/classes/settings.d.ts +52 -0
- package/dist/classes/settings.js +185 -0
- package/dist/classes/sources_list.d.ts +28 -0
- package/dist/classes/sources_list.js +89 -0
- package/dist/classes/systemctl.d.ts +47 -0
- package/dist/classes/systemctl.js +86 -0
- package/dist/classes/tailor.d.ts +50 -0
- package/dist/classes/tailor.js +563 -0
- package/dist/classes/tools.d.ts +26 -0
- package/dist/classes/tools.js +50 -0
- package/dist/classes/users.d.ts +28 -0
- package/dist/classes/users.js +143 -0
- package/dist/classes/utils.d/kernel.d.ts +39 -0
- package/dist/classes/utils.d/kernel.js +206 -0
- package/dist/classes/utils.d.ts +327 -0
- package/dist/classes/utils.js +955 -0
- package/dist/classes/xdg.d.ts +45 -0
- package/dist/classes/xdg.js +337 -0
- package/dist/classes/yolk.d.ts +33 -0
- package/dist/classes/yolk.js +114 -0
- package/dist/commands/adapt.d.ts +17 -0
- package/dist/commands/adapt.js +33 -0
- package/dist/commands/analyze.d.ts +26 -0
- package/dist/commands/analyze.js +95 -0
- package/dist/commands/calamares.d.ts +29 -0
- package/dist/commands/calamares.js +112 -0
- package/dist/commands/config.d.ts +35 -0
- package/dist/commands/config.js +120 -0
- package/dist/commands/cuckoo.d.ts +17 -0
- package/dist/commands/cuckoo.js +61 -0
- package/dist/commands/dad.d.ts +21 -0
- package/dist/commands/dad.js +47 -0
- package/dist/commands/export/iso.d.ts +19 -0
- package/dist/commands/export/iso.js +55 -0
- package/dist/commands/export/pkg.d.ts +29 -0
- package/dist/commands/export/pkg.js +173 -0
- package/dist/commands/export/tarballs.d.ts +27 -0
- package/dist/commands/export/tarballs.js +79 -0
- package/dist/commands/install.d.ts +39 -0
- package/dist/commands/install.js +113 -0
- package/dist/commands/kill.d.ts +24 -0
- package/dist/commands/kill.js +50 -0
- package/dist/commands/love.d.ts +21 -0
- package/dist/commands/love.js +73 -0
- package/dist/commands/mom.d.ts +16 -0
- package/dist/commands/mom.js +30 -0
- package/dist/commands/pods.d.ts +22 -0
- package/dist/commands/pods.js +92 -0
- package/dist/commands/produce.d.ts +35 -0
- package/dist/commands/produce.js +221 -0
- package/dist/commands/status.d.ts +23 -0
- package/dist/commands/status.js +31 -0
- package/dist/commands/syncfrom.d.ts +45 -0
- package/dist/commands/syncfrom.js +152 -0
- package/dist/commands/syncto.d.ts +40 -0
- package/dist/commands/syncto.js +175 -0
- package/dist/commands/tools/clean.d.ts +18 -0
- package/dist/commands/tools/clean.js +37 -0
- package/dist/commands/tools/ppa.d.ts +31 -0
- package/dist/commands/tools/ppa.js +244 -0
- package/dist/commands/tools/skel.d.ts +18 -0
- package/dist/commands/tools/skel.js +44 -0
- package/dist/commands/tools/stat.d.ts +31 -0
- package/dist/commands/tools/stat.js +70 -0
- package/dist/commands/tools/yolk.d.ts +24 -0
- package/dist/commands/tools/yolk.js +45 -0
- package/dist/commands/update.d.ts +46 -0
- package/dist/commands/update.js +238 -0
- package/dist/commands/wardrobe/get.d.ts +23 -0
- package/dist/commands/wardrobe/get.js +52 -0
- package/dist/commands/wardrobe/list.d.ts +24 -0
- package/dist/commands/wardrobe/list.js +125 -0
- package/dist/commands/wardrobe/show.d.ts +25 -0
- package/dist/commands/wardrobe/show.js +97 -0
- package/dist/commands/wardrobe/wear.d.ts +26 -0
- package/dist/commands/wardrobe/wear.js +84 -0
- package/dist/dhcpd-proxy/classes/packet.d.ts +36 -0
- package/dist/dhcpd-proxy/classes/packet.js +124 -0
- package/dist/dhcpd-proxy/index.d.ts +4 -0
- package/dist/dhcpd-proxy/index.js +4 -0
- package/dist/dhcpd-proxy/interfaces/i-pxe.d.ts +45 -0
- package/dist/dhcpd-proxy/interfaces/i-pxe.js +1 -0
- package/dist/dhcpd-proxy/lib/packet/converters.d.ts +11 -0
- package/dist/dhcpd-proxy/lib/packet/converters.js +395 -0
- package/dist/dhcpd-proxy/lib/packet/message-types.d.ts +10 -0
- package/dist/dhcpd-proxy/lib/packet/message-types.js +12 -0
- package/dist/dhcpd-proxy/lib/packet/options.d.ts +8 -0
- package/dist/dhcpd-proxy/lib/packet/options.js +264 -0
- package/dist/dhcpd-proxy/lib/sprintf.d.ts +6 -0
- package/dist/dhcpd-proxy/lib/sprintf.js +130 -0
- package/dist/dhcpd-proxy/lib/utils.d.ts +126 -0
- package/dist/dhcpd-proxy/lib/utils.js +255 -0
- package/dist/dhcpd-proxy/simple-proxy.d.ts +11 -0
- package/dist/dhcpd-proxy/simple-proxy.js +118 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/interfaces/calamares/i-calamares-bootloader.d.ts +23 -0
- package/dist/interfaces/calamares/i-calamares-bootloader.js +7 -0
- package/dist/interfaces/calamares/i-calamares-branding.d.ts +46 -0
- package/dist/interfaces/calamares/i-calamares-branding.js +1 -0
- package/dist/interfaces/calamares/i-calamares-displaymanager.d.ts +34 -0
- package/dist/interfaces/calamares/i-calamares-displaymanager.js +1 -0
- package/dist/interfaces/calamares/i-calamares-finished.d.ts +14 -0
- package/dist/interfaces/calamares/i-calamares-finished.js +1 -0
- package/dist/interfaces/calamares/i-calamares-packages.d.ts +26 -0
- package/dist/interfaces/calamares/i-calamares-packages.js +1 -0
- package/dist/interfaces/calamares/i-calamares-partitions.d.ts +39 -0
- package/dist/interfaces/calamares/i-calamares-partitions.js +1 -0
- package/dist/interfaces/calamares/i-calamares-settings.d.ts +36 -0
- package/dist/interfaces/calamares/i-calamares-settings.js +1 -0
- package/dist/interfaces/i-addons.d.ts +12 -0
- package/dist/interfaces/i-addons.js +8 -0
- package/dist/interfaces/i-analyze.d.ts +17 -0
- package/dist/interfaces/i-analyze.js +17 -0
- package/dist/interfaces/i-app.d.ts +14 -0
- package/dist/interfaces/i-app.js +8 -0
- package/dist/interfaces/i-config-tools.d.ts +15 -0
- package/dist/interfaces/i-config-tools.js +8 -0
- package/dist/interfaces/i-devices.d.ts +20 -0
- package/dist/interfaces/i-devices.js +8 -0
- package/dist/interfaces/i-distro.d.ts +23 -0
- package/dist/interfaces/i-distro.js +8 -0
- package/dist/interfaces/i-drive-list.d.ts +33 -0
- package/dist/interfaces/i-drive-list.js +8 -0
- package/dist/interfaces/i-eggs-config.d.ts +32 -0
- package/dist/interfaces/i-eggs-config.js +8 -0
- package/dist/interfaces/i-excludes.d.ts +14 -0
- package/dist/interfaces/i-excludes.js +8 -0
- package/dist/interfaces/i-exec.d.ts +11 -0
- package/dist/interfaces/i-exec.js +8 -0
- package/dist/interfaces/i-initrd.d.ts +13 -0
- package/dist/interfaces/i-initrd.js +8 -0
- package/dist/interfaces/i-install.d.ts +16 -0
- package/dist/interfaces/i-install.js +8 -0
- package/dist/interfaces/i-installer.d.ts +17 -0
- package/dist/interfaces/i-installer.js +8 -0
- package/dist/interfaces/i-luks-passphrase.d.ts +11 -0
- package/dist/interfaces/i-luks-passphrase.js +8 -0
- package/dist/interfaces/i-materia.d.ts +36 -0
- package/dist/interfaces/i-materia.js +8 -0
- package/dist/interfaces/i-net.d.ts +16 -0
- package/dist/interfaces/i-net.js +8 -0
- package/dist/interfaces/i-os-release.d.ts +5 -0
- package/dist/interfaces/i-os-release.js +1 -0
- package/dist/interfaces/i-packages.d.ts +16 -0
- package/dist/interfaces/i-packages.js +8 -0
- package/dist/interfaces/i-partitions.d.ts +16 -0
- package/dist/interfaces/i-partitions.js +8 -0
- package/dist/interfaces/i-pxe.d.ts +45 -0
- package/dist/interfaces/i-pxe.js +1 -0
- package/dist/interfaces/i-remix.d.ts +21 -0
- package/dist/interfaces/i-remix.js +8 -0
- package/dist/interfaces/i-settings.d.ts +33 -0
- package/dist/interfaces/i-settings.js +8 -0
- package/dist/interfaces/i-user.d.ts +14 -0
- package/dist/interfaces/i-user.js +8 -0
- package/dist/interfaces/i-workdir.d.ts +14 -0
- package/dist/interfaces/i-workdir.js +8 -0
- package/dist/interfaces/i-xkb-model.d.ts +24 -0
- package/dist/interfaces/i-xkb-model.js +8 -0
- package/dist/interfaces/index.d.ts +26 -0
- package/dist/interfaces/index.js +8 -0
- package/dist/krill/classes/cfs.d.ts +17 -0
- package/dist/krill/classes/cfs.js +39 -0
- package/dist/krill/classes/krill_enums.d.ts +37 -0
- package/dist/krill/classes/krill_enums.js +41 -0
- package/dist/krill/classes/prepare.d/confirm.d.ts +5 -0
- package/dist/krill/classes/prepare.d/confirm.js +30 -0
- package/dist/krill/classes/prepare.d/keyboard.d.ts +14 -0
- package/dist/krill/classes/prepare.d/keyboard.js +62 -0
- package/dist/krill/classes/prepare.d/location.d.ts +17 -0
- package/dist/krill/classes/prepare.d/location.js +59 -0
- package/dist/krill/classes/prepare.d/network.d.ts +14 -0
- package/dist/krill/classes/prepare.d/network.js +68 -0
- package/dist/krill/classes/prepare.d/partitions.d.ts +14 -0
- package/dist/krill/classes/prepare.d/partitions.js +86 -0
- package/dist/krill/classes/prepare.d/summary.d.ts +15 -0
- package/dist/krill/classes/prepare.d/summary.js +72 -0
- package/dist/krill/classes/prepare.d/users.d.ts +6 -0
- package/dist/krill/classes/prepare.d/users.js +63 -0
- package/dist/krill/classes/prepare.d/welcome.d.ts +6 -0
- package/dist/krill/classes/prepare.d/welcome.js +30 -0
- package/dist/krill/classes/prepare.d.ts +89 -0
- package/dist/krill/classes/prepare.js +319 -0
- package/dist/krill/classes/sequence.d/add_user.d.ts +20 -0
- package/dist/krill/classes/sequence.d/add_user.js +77 -0
- package/dist/krill/classes/sequence.d/bootloader.d.ts +14 -0
- package/dist/krill/classes/sequence.d/bootloader.js +117 -0
- package/dist/krill/classes/sequence.d/bootloader_config.d.ts +14 -0
- package/dist/krill/classes/sequence.d/bootloader_config.js +192 -0
- package/dist/krill/classes/sequence.d/change_password.d.ts +15 -0
- package/dist/krill/classes/sequence.d/change_password.js +18 -0
- package/dist/krill/classes/sequence.d/del_live_user.d.ts +14 -0
- package/dist/krill/classes/sequence.d/del_live_user.js +39 -0
- package/dist/krill/classes/sequence.d/fstab.d.ts +14 -0
- package/dist/krill/classes/sequence.d/fstab.js +177 -0
- package/dist/krill/classes/sequence.d/grubcfg.d.ts +17 -0
- package/dist/krill/classes/sequence.d/grubcfg.js +35 -0
- package/dist/krill/classes/sequence.d/hostname.d.ts +13 -0
- package/dist/krill/classes/sequence.d/hostname.js +50 -0
- package/dist/krill/classes/sequence.d/initramfs.d.ts +13 -0
- package/dist/krill/classes/sequence.d/initramfs.js +54 -0
- package/dist/krill/classes/sequence.d/initramfs_cfg.d.ts +14 -0
- package/dist/krill/classes/sequence.d/initramfs_cfg.js +35 -0
- package/dist/krill/classes/sequence.d/locale.d.ts +13 -0
- package/dist/krill/classes/sequence.d/locale.js +91 -0
- package/dist/krill/classes/sequence.d/locale_cfg.d.ts +10 -0
- package/dist/krill/classes/sequence.d/locale_cfg.js +58 -0
- package/dist/krill/classes/sequence.d/m_keyboard.d.ts +14 -0
- package/dist/krill/classes/sequence.d/m_keyboard.js +58 -0
- package/dist/krill/classes/sequence.d/machine_id.d.ts +15 -0
- package/dist/krill/classes/sequence.d/machine_id.js +33 -0
- package/dist/krill/classes/sequence.d/mkfs.d.ts +15 -0
- package/dist/krill/classes/sequence.d/mkfs.js +88 -0
- package/dist/krill/classes/sequence.d/mount_fs.d.ts +17 -0
- package/dist/krill/classes/sequence.d/mount_fs.js +68 -0
- package/dist/krill/classes/sequence.d/mount_vfs.d.ts +17 -0
- package/dist/krill/classes/sequence.d/mount_vfs.js +59 -0
- package/dist/krill/classes/sequence.d/network_cfg.d.ts +19 -0
- package/dist/krill/classes/sequence.d/network_cfg.js +73 -0
- package/dist/krill/classes/sequence.d/packages.d.ts +14 -0
- package/dist/krill/classes/sequence.d/packages.js +111 -0
- package/dist/krill/classes/sequence.d/partition.d/bios_luks.d.ts +17 -0
- package/dist/krill/classes/sequence.d/partition.d/bios_luks.js +73 -0
- package/dist/krill/classes/sequence.d/partition.d/bios_standard.d.ts +16 -0
- package/dist/krill/classes/sequence.d/partition.d/bios_standard.js +51 -0
- package/dist/krill/classes/sequence.d/partition.d/uefi_luks.d.ts +17 -0
- package/dist/krill/classes/sequence.d/partition.d/uefi_luks.js +77 -0
- package/dist/krill/classes/sequence.d/partition.d/uefi_standard.d.ts +10 -0
- package/dist/krill/classes/sequence.d/partition.d/uefi_standard.js +33 -0
- package/dist/krill/classes/sequence.d/partition.d.ts +14 -0
- package/dist/krill/classes/sequence.d/partition.js +84 -0
- package/dist/krill/classes/sequence.d/remove_installer_link.d.ts +13 -0
- package/dist/krill/classes/sequence.d/remove_installer_link.js +35 -0
- package/dist/krill/classes/sequence.d/umount.d.ts +14 -0
- package/dist/krill/classes/sequence.d/umount.js +28 -0
- package/dist/krill/classes/sequence.d/unpackfs.d.ts +13 -0
- package/dist/krill/classes/sequence.d/unpackfs.js +20 -0
- package/dist/krill/classes/sequence.d.ts +134 -0
- package/dist/krill/classes/sequence.js +400 -0
- package/dist/krill/components/finished.d.ts +16 -0
- package/dist/krill/components/finished.js +56 -0
- package/dist/krill/components/information.d.ts +8 -0
- package/dist/krill/components/information.js +162 -0
- package/dist/krill/components/install.d.ts +15 -0
- package/dist/krill/components/install.js +60 -0
- package/dist/krill/components/keyboard.d.ts +16 -0
- package/dist/krill/components/keyboard.js +54 -0
- package/dist/krill/components/location.d.ts +16 -0
- package/dist/krill/components/location.js +59 -0
- package/dist/krill/components/network.d.ts +19 -0
- package/dist/krill/components/network.js +65 -0
- package/dist/krill/components/partitions.d.ts +18 -0
- package/dist/krill/components/partitions.js +89 -0
- package/dist/krill/components/steps.d.ts +13 -0
- package/dist/krill/components/steps.js +148 -0
- package/dist/krill/components/summary.d.ts +25 -0
- package/dist/krill/components/summary.js +77 -0
- package/dist/krill/components/title.d.ts +11 -0
- package/dist/krill/components/title.js +35 -0
- package/dist/krill/components/users.d.ts +24 -0
- package/dist/krill/components/users.js +80 -0
- package/dist/krill/components/welcome.d.ts +13 -0
- package/dist/krill/components/welcome.js +63 -0
- package/dist/krill/interfaces/i_krill.d.ts +44 -0
- package/dist/krill/interfaces/i_krill.js +8 -0
- package/dist/krill/interfaces/i_krill_config.d.ts +35 -0
- package/dist/krill/interfaces/i_krill_config.js +8 -0
- package/dist/krill/lib/get_address.d.ts +8 -0
- package/dist/krill/lib/get_address.js +23 -0
- package/dist/krill/lib/get_dns.d.ts +8 -0
- package/dist/krill/lib/get_dns.js +23 -0
- package/dist/krill/lib/get_domain.d.ts +8 -0
- package/dist/krill/lib/get_domain.js +23 -0
- package/dist/krill/lib/get_gateway.d.ts +8 -0
- package/dist/krill/lib/get_gateway.js +23 -0
- package/dist/krill/lib/get_hostname.d.ts +8 -0
- package/dist/krill/lib/get_hostname.js +23 -0
- package/dist/krill/lib/get_luks_passphrase.d.ts +8 -0
- package/dist/krill/lib/get_luks_passphrase.js +32 -0
- package/dist/krill/lib/get_netmask.d.ts +8 -0
- package/dist/krill/lib/get_netmask.js +23 -0
- package/dist/krill/lib/get_password.d.ts +8 -0
- package/dist/krill/lib/get_password.js +36 -0
- package/dist/krill/lib/get_userfullname.d.ts +8 -0
- package/dist/krill/lib/get_userfullname.js +23 -0
- package/dist/krill/lib/get_username.d.ts +8 -0
- package/dist/krill/lib/get_username.js +23 -0
- package/dist/krill/lib/select_address_type.d.ts +8 -0
- package/dist/krill/lib/select_address_type.js +24 -0
- package/dist/krill/lib/select_filesystem_type.d.ts +8 -0
- package/dist/krill/lib/select_filesystem_type.js +40 -0
- package/dist/krill/lib/select_installation_device.d.ts +8 -0
- package/dist/krill/lib/select_installation_device.js +40 -0
- package/dist/krill/lib/select_installation_mode.d.ts +9 -0
- package/dist/krill/lib/select_installation_mode.js +25 -0
- package/dist/krill/lib/select_interface.d.ts +8 -0
- package/dist/krill/lib/select_interface.js +24 -0
- package/dist/krill/lib/select_keyboard_layout.d.ts +11 -0
- package/dist/krill/lib/select_keyboard_layout.js +36 -0
- package/dist/krill/lib/select_keyboard_model.d.ts +11 -0
- package/dist/krill/lib/select_keyboard_model.js +34 -0
- package/dist/krill/lib/select_keyboard_option.d.ts +11 -0
- package/dist/krill/lib/select_keyboard_option.js +34 -0
- package/dist/krill/lib/select_keyboard_variant.d.ts +11 -0
- package/dist/krill/lib/select_keyboard_variant.js +35 -0
- package/dist/krill/lib/select_languages.d.ts +8 -0
- package/dist/krill/lib/select_languages.js +28 -0
- package/dist/krill/lib/select_regions.d.ts +8 -0
- package/dist/krill/lib/select_regions.js +24 -0
- package/dist/krill/lib/select_replaced_partition.d.ts +8 -0
- package/dist/krill/lib/select_replaced_partition.js +31 -0
- package/dist/krill/lib/select_user_swap_choice.d.ts +9 -0
- package/dist/krill/lib/select_user_swap_choice.js +35 -0
- package/dist/krill/lib/select_zones.d.ts +8 -0
- package/dist/krill/lib/select_zones.js +518 -0
- package/dist/lib/kill_me_softly.d.ts +11 -0
- package/dist/lib/kill_me_softly.js +61 -0
- package/dist/lib/utils.d.ts +19 -0
- package/dist/lib/utils.js +65 -0
- package/package.json +5 -5
- package/conf/distros/archlinux/calamares/modules/shellprocess@sync.yml +0 -5
- package/conf/distros/opensuse/calamares/modules/dracut.yml +0 -14
|
@@ -0,0 +1,955 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ./src/classes/utils.ts
|
|
3
|
+
* penguins-eggs v.25.7.x / ecmascript 2020
|
|
4
|
+
* author: Piero Proietti
|
|
5
|
+
* email: piero.proietti@gmail.com
|
|
6
|
+
* license: MIT
|
|
7
|
+
*
|
|
8
|
+
* Refactored Utils class - imports from modular utilities
|
|
9
|
+
*/
|
|
10
|
+
import shx from 'shelljs';
|
|
11
|
+
import fs from 'fs';
|
|
12
|
+
import dns from 'dns';
|
|
13
|
+
import path from 'path';
|
|
14
|
+
import os from 'os';
|
|
15
|
+
import inquirer from 'inquirer';
|
|
16
|
+
import { execSync, spawnSync } from 'child_process';
|
|
17
|
+
import chalk from 'chalk';
|
|
18
|
+
import { Netmask } from 'netmask';
|
|
19
|
+
import Kernel from './utils.d/kernel.js';
|
|
20
|
+
import Distro from './distro.js';
|
|
21
|
+
// pjson
|
|
22
|
+
import { createRequire } from 'module';
|
|
23
|
+
const require = createRequire(import.meta.url);
|
|
24
|
+
const pjson = require('../../package.json');
|
|
25
|
+
// __dirname
|
|
26
|
+
const __dirname = path.dirname(new URL(import.meta.url).pathname);
|
|
27
|
+
/**
|
|
28
|
+
* Utils: general porpourse utils
|
|
29
|
+
* @remarks all the utilities
|
|
30
|
+
*/
|
|
31
|
+
export default class Utils {
|
|
32
|
+
static vmlinuz(kernel = '') {
|
|
33
|
+
return Kernel.vmlinuz(kernel);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @deprecated Use Kernel.initramfs() instead
|
|
37
|
+
*/
|
|
38
|
+
static initrdImg(kernel = '') {
|
|
39
|
+
return Kernel.initramfs(kernel);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Custom function to sort object keys
|
|
43
|
+
* @param obj
|
|
44
|
+
* @returns
|
|
45
|
+
*/
|
|
46
|
+
static sortObjectKeys(obj) {
|
|
47
|
+
const sorted = {};
|
|
48
|
+
Object.keys(obj)
|
|
49
|
+
.sort()
|
|
50
|
+
.forEach(key => {
|
|
51
|
+
sorted[key] = obj[key];
|
|
52
|
+
});
|
|
53
|
+
return sorted;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
*
|
|
57
|
+
* @param file
|
|
58
|
+
* @param search
|
|
59
|
+
* @returns value
|
|
60
|
+
*/
|
|
61
|
+
static searchOnFile(file = '', search = '') {
|
|
62
|
+
const lines = fs.readFileSync(file, 'utf8').split("\n");
|
|
63
|
+
let value = '';
|
|
64
|
+
lines.forEach(line => {
|
|
65
|
+
line = line.replace(/\s+/g, ' '); // Remove multiple spaces with single space
|
|
66
|
+
if (line.includes(search)) {
|
|
67
|
+
value = line.substring(line.indexOf('=') + 1);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
value = value.replaceAll('"', ''); // Remove "
|
|
71
|
+
return value.trim();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Restituisce il prefisso della iso
|
|
75
|
+
* @param distroId
|
|
76
|
+
* @param codenameId
|
|
77
|
+
*/
|
|
78
|
+
static snapshotPrefix(distroId, codenameId) {
|
|
79
|
+
let result = `egg-of_${distroId.toLowerCase()}-`;
|
|
80
|
+
if (codenameId === 'rolling' || codenameId === '') {
|
|
81
|
+
const releaseId = Utils.getOsRelease().VERSION_ID.trim();
|
|
82
|
+
if (releaseId !== '') {
|
|
83
|
+
result += releaseId;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
result += `${codenameId.toLowerCase()}`;
|
|
88
|
+
}
|
|
89
|
+
if (!result.endsWith('-')) {
|
|
90
|
+
result += '-';
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Detect if running inside a container (Docker or LXC)
|
|
96
|
+
*/
|
|
97
|
+
static isContainer() {
|
|
98
|
+
// Check for Docker's specific file
|
|
99
|
+
if (fs.existsSync('/.dockerenv')) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
// Check the cgroup file, which works for Docker, Podman, LXC, etc.
|
|
103
|
+
try {
|
|
104
|
+
const cgroupContent = fs.readFileSync('/proc/1/cgroup', 'utf8');
|
|
105
|
+
return cgroupContent.includes('/docker/') || cgroupContent.includes('/kubepods/');
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if the system uses Systemd
|
|
113
|
+
*/
|
|
114
|
+
static isSystemd() {
|
|
115
|
+
let isSystemd = false;
|
|
116
|
+
if (!this.isContainer()) {
|
|
117
|
+
isSystemd = fs.readFileSync("/proc/1/comm").includes('systemd');
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
isSystemd = true;
|
|
121
|
+
let distro = new Distro();
|
|
122
|
+
if (distro.distroId === "Devuan") {
|
|
123
|
+
isSystemd = false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return isSystemd;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Check if the system uses SysVinit
|
|
130
|
+
*/
|
|
131
|
+
static isSysvinit() {
|
|
132
|
+
let isSysvinit = false;
|
|
133
|
+
if (!this.isContainer()) {
|
|
134
|
+
isSysvinit = fs.readFileSync("/proc/1/comm").includes('init');
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
let distro = new Distro();
|
|
138
|
+
if (distro.distroId === "Devuan") {
|
|
139
|
+
isSysvinit = true;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return isSysvinit;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Check if the system uses OpenRC
|
|
146
|
+
*/
|
|
147
|
+
static isOpenRc() {
|
|
148
|
+
let isOpenRc = false;
|
|
149
|
+
if (!this.isContainer()) {
|
|
150
|
+
try {
|
|
151
|
+
execSync('command -v openrc');
|
|
152
|
+
isOpenRc = true;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
isOpenRc = false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return isOpenRc;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Occore vedere un modo per creare machine-id dove non esiste
|
|
162
|
+
*/
|
|
163
|
+
static machineId() {
|
|
164
|
+
let result = '';
|
|
165
|
+
if (fs.existsSync('/etc/machine-id')) {
|
|
166
|
+
result = fs.readFileSync('/etc/machine-id', 'utf-8').trim();
|
|
167
|
+
}
|
|
168
|
+
else if (fs.existsSync('/var/lib/dbus/machine-id')) {
|
|
169
|
+
result = fs.readFileSync('/var/lib/dbus/machine-id', 'utf-8').trim();
|
|
170
|
+
}
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
*
|
|
175
|
+
* @param msg
|
|
176
|
+
*/
|
|
177
|
+
static warning(msg = '') {
|
|
178
|
+
console.log(pjson.shortName + ' >>> ' + chalk.cyanBright(msg) + '.');
|
|
179
|
+
}
|
|
180
|
+
static error(msg = '') {
|
|
181
|
+
console.error(pjson.shortName + ' >>> ' + chalk.bgMagentaBright(chalk.whiteBright(msg)) + '.');
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Return the primary user's name
|
|
185
|
+
*/
|
|
186
|
+
static async getPrimaryUser() {
|
|
187
|
+
const { execSync } = require('child_process');
|
|
188
|
+
let primaryUser = '';
|
|
189
|
+
try {
|
|
190
|
+
// Attempt to get the user from logname
|
|
191
|
+
primaryUser = execSync('/usr/bin/logname 2>/dev/null', { encoding: 'utf-8' }).trim();
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
// console.log("logname failed, so we continue with other methods")
|
|
195
|
+
}
|
|
196
|
+
if (primaryUser === 'root') {
|
|
197
|
+
primaryUser = '';
|
|
198
|
+
}
|
|
199
|
+
if (primaryUser === '') {
|
|
200
|
+
try {
|
|
201
|
+
// Check if doas is installed and get the DOAS_USER
|
|
202
|
+
execSync('command -v doas', { stdio: 'ignore' });
|
|
203
|
+
primaryUser = execSync('echo $DOAS_USER', { encoding: 'utf-8' }).trim();
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
// console.log("doas is not installed or DOAS_USER is not set, continue with the next method")
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (primaryUser === '') {
|
|
210
|
+
try {
|
|
211
|
+
// Check for the SUDO_USER
|
|
212
|
+
primaryUser = execSync('echo $SUDO_USER', { encoding: 'utf-8' }).trim();
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
// console.log("SUDO_USER is not set, continue with the next method")
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (primaryUser === '') {
|
|
219
|
+
// console.log("Fallback to the USER environment variable")
|
|
220
|
+
primaryUser = process.env.USER || '';
|
|
221
|
+
}
|
|
222
|
+
if (primaryUser === '') {
|
|
223
|
+
primaryUser = 'dummy';
|
|
224
|
+
// console.error('Cannot determine the primary user.');
|
|
225
|
+
// process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
return primaryUser;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* restituisce uuid
|
|
231
|
+
* @param device
|
|
232
|
+
*/
|
|
233
|
+
static uuid(device) {
|
|
234
|
+
const uuid = shx.exec(`blkid -s UUID -o value ${device}`).stdout.trim();
|
|
235
|
+
return uuid;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
*
|
|
239
|
+
* @param device
|
|
240
|
+
* @returns
|
|
241
|
+
*/
|
|
242
|
+
static uuidGen() {
|
|
243
|
+
const uuid = shx.exec(`uuidgen`, { silent: true }).stdout.trim();
|
|
244
|
+
return uuid;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
*
|
|
248
|
+
* @param date
|
|
249
|
+
*/
|
|
250
|
+
static formatDate(date) {
|
|
251
|
+
const d = new Date(date);
|
|
252
|
+
let month = String(d.getMonth() + 1);
|
|
253
|
+
let day = String(d.getDate());
|
|
254
|
+
const year = d.getFullYear();
|
|
255
|
+
let hh = String(d.getHours());
|
|
256
|
+
let mm = String(d.getMinutes());
|
|
257
|
+
if (month.length < 2) {
|
|
258
|
+
month = '0' + month;
|
|
259
|
+
}
|
|
260
|
+
if (day.length < 2) {
|
|
261
|
+
day = '0' + day;
|
|
262
|
+
}
|
|
263
|
+
if (hh.length < 2) {
|
|
264
|
+
hh = '0' + hh;
|
|
265
|
+
}
|
|
266
|
+
if (mm.length < 2) {
|
|
267
|
+
mm = '0' + mm;
|
|
268
|
+
}
|
|
269
|
+
return [year, month, day].join('-') + '_' + hh + mm;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* return the name of the package: penguins-eggs
|
|
273
|
+
* @returns penguins-eggs
|
|
274
|
+
*/
|
|
275
|
+
static getPackageName() {
|
|
276
|
+
return pjson.shortName;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Count the eggs present in the nest
|
|
280
|
+
* @returns {number} Numero degli snapshot presenti
|
|
281
|
+
*/
|
|
282
|
+
static getSnapshotCount(snapshot_dir = '/') {
|
|
283
|
+
if (fs.existsSync(snapshot_dir)) {
|
|
284
|
+
const files = fs.readdirSync(snapshot_dir);
|
|
285
|
+
let nIsos = 0;
|
|
286
|
+
for (const f of files) {
|
|
287
|
+
if (f.endsWith('.iso')) {
|
|
288
|
+
nIsos++;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return nIsos;
|
|
292
|
+
}
|
|
293
|
+
return 0;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Get the syze of the snapshot
|
|
297
|
+
* @returns {string} grandezza dello snapshot in Byte
|
|
298
|
+
*/
|
|
299
|
+
static getSnapshotSize(snapshot_dir = '/') {
|
|
300
|
+
let fileSizeInBytes = 0;
|
|
301
|
+
const size = shx.exec(`/usr/bin/find ${snapshot_dir} -maxdepth 1 -type f -name '*.iso' -exec du -sc {} + | tail -1 | awk '{print $1}'`, { silent: true }).stdout.trim();
|
|
302
|
+
if (size === '') {
|
|
303
|
+
fileSizeInBytes = 0;
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
fileSizeInBytes = Number(size);
|
|
307
|
+
}
|
|
308
|
+
return fileSizeInBytes;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* uefiArch
|
|
312
|
+
* @returns arch
|
|
313
|
+
*/
|
|
314
|
+
static uefiArch() {
|
|
315
|
+
let arch = '';
|
|
316
|
+
if (process.arch === 'ia32') {
|
|
317
|
+
arch = 'i386';
|
|
318
|
+
//
|
|
319
|
+
if (shx.exec('uname -m', { silent: true }).stdout.trim() === 'x86_64') {
|
|
320
|
+
arch = 'amd64';
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
else if (process.arch === 'x64') {
|
|
324
|
+
arch = 'amd64';
|
|
325
|
+
}
|
|
326
|
+
else if (process.arch === 'arm64') {
|
|
327
|
+
arch = 'arm64';
|
|
328
|
+
}
|
|
329
|
+
return arch;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* i386-pc,
|
|
333
|
+
* i386-efi,
|
|
334
|
+
* x86_64-efi,
|
|
335
|
+
* arm64-efi,
|
|
336
|
+
*
|
|
337
|
+
* ATTEMZIONE: install efibootmgr
|
|
338
|
+
*
|
|
339
|
+
* Fedora/RHEL have i386-pc
|
|
340
|
+
*/
|
|
341
|
+
static uefiFormat() {
|
|
342
|
+
let format = '';
|
|
343
|
+
if (process.arch === 'ia32') {
|
|
344
|
+
format = 'i386-efi';
|
|
345
|
+
if (shx.exec('uname -m', { silent: true }).stdout.trim() === 'x86_64') {
|
|
346
|
+
format = 'x86_64-efi';
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
else if (process.arch === 'x64') {
|
|
350
|
+
format = 'x86_64-efi';
|
|
351
|
+
}
|
|
352
|
+
else if (process.arch === 'arm64') {
|
|
353
|
+
format = 'arm64-efi';
|
|
354
|
+
}
|
|
355
|
+
return format;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
*
|
|
359
|
+
* @returns
|
|
360
|
+
*/
|
|
361
|
+
static usrLibPath() {
|
|
362
|
+
let path = '';
|
|
363
|
+
if (process.arch === 'x64') {
|
|
364
|
+
path = 'x86_64-linux-gnu';
|
|
365
|
+
}
|
|
366
|
+
else if (process.arch === 'arm64') {
|
|
367
|
+
path = 'aarch64-linux-gnu';
|
|
368
|
+
}
|
|
369
|
+
return path;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
*
|
|
373
|
+
* @param prefix
|
|
374
|
+
* @param backup
|
|
375
|
+
* @returns
|
|
376
|
+
*/
|
|
377
|
+
static getPrefix(prefix, backup = false) {
|
|
378
|
+
if (backup) {
|
|
379
|
+
if (prefix.substring(0, 7) === 'egg-of_') {
|
|
380
|
+
prefix = 'egg-bk_' + prefix.substring(7);
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
prefix = 'egg-bk_' + prefix;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return prefix;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
*
|
|
390
|
+
* @param volid
|
|
391
|
+
*/
|
|
392
|
+
static getVolid(volid = 'unknown') {
|
|
393
|
+
// // 28 + 4 .iso = 32 lunghezza max di volid
|
|
394
|
+
if (volid.length >= 32) {
|
|
395
|
+
volid = volid.substring(0, 32);
|
|
396
|
+
}
|
|
397
|
+
return volid;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Return postfix
|
|
401
|
+
* @param basename
|
|
402
|
+
* @returns eggName
|
|
403
|
+
*/
|
|
404
|
+
static getPostfix() {
|
|
405
|
+
let postfix = '_' + Utils.formatDate(new Date()) + '.iso';
|
|
406
|
+
return postfix;
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Calculate the space used on the disk
|
|
410
|
+
* @return {void}
|
|
411
|
+
*/
|
|
412
|
+
static getUsedSpace() {
|
|
413
|
+
let fileSizeInBytes = 0;
|
|
414
|
+
if (this.isLive()) {
|
|
415
|
+
fileSizeInBytes = 0; // this.getLiveRootSpace()
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
fileSizeInBytes = Number(shx.exec(`df /home | /usr/bin/awk 'NR==2 {print $3}'`, {
|
|
419
|
+
silent: true
|
|
420
|
+
}).stdout);
|
|
421
|
+
}
|
|
422
|
+
return fileSizeInBytes;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Extimate the linuxfs dimension
|
|
426
|
+
* probably is better to rename it as
|
|
427
|
+
* getLiveSpaceRootNeed
|
|
428
|
+
* @returns {number} Byte
|
|
429
|
+
*/
|
|
430
|
+
static getLiveRootSpace(type = 'debian-live') {
|
|
431
|
+
let squashFs = '/run/live/medium/live/filesystem.squashfs';
|
|
432
|
+
if (type === 'mx') {
|
|
433
|
+
squashFs = '/live/boot-dev/antiX/linuxfs';
|
|
434
|
+
}
|
|
435
|
+
// Ottengo la dimensione del file compresso
|
|
436
|
+
const compressedFs = fs.statSync(squashFs).size;
|
|
437
|
+
// get compression factor by reading the linuxfs squasfs file, if available
|
|
438
|
+
const compressedFs_compression_type = shx.exec(`dd if=${compressedFs} bs=1 skip=20 count=2 status=none 2>/dev/null| /usr/bin/od -An -tdI`);
|
|
439
|
+
let compression_factor = 0;
|
|
440
|
+
if (compressedFs_compression_type === '1') {
|
|
441
|
+
compression_factor = 37; // gzip
|
|
442
|
+
}
|
|
443
|
+
else if (compressedFs_compression_type === '2') {
|
|
444
|
+
compression_factor = 52; // lzo, not used by antiX
|
|
445
|
+
}
|
|
446
|
+
else if (compressedFs_compression_type === '3') {
|
|
447
|
+
compression_factor = 52; // lzma, not used by antiX
|
|
448
|
+
}
|
|
449
|
+
else if (compressedFs_compression_type === '4') {
|
|
450
|
+
compression_factor = 31; // xz
|
|
451
|
+
}
|
|
452
|
+
else if (compressedFs_compression_type === '5') {
|
|
453
|
+
compression_factor = 52; // lz4
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
compression_factor = 30; // anything else or linuxfs not reachable (toram), should be pretty conservative
|
|
457
|
+
}
|
|
458
|
+
let rootfs_file_size = 0;
|
|
459
|
+
const linuxfs_file_size = (Number(shx.exec('df /live/linux --output=used --total | /usr/bin/tail -n1').stdout.trim()) * 1024 * 100) / compression_factor;
|
|
460
|
+
if (fs.existsSync('/live/persist-root')) {
|
|
461
|
+
rootfs_file_size = Number(shx.exec('df /live/persist-root --output=used --total | /usr/bin/tail -n1').stdout.trim()) * 1024;
|
|
462
|
+
}
|
|
463
|
+
let rootSpaceNeeded;
|
|
464
|
+
if (type === 'mx') {
|
|
465
|
+
/**
|
|
466
|
+
* add rootfs file size to the calculated linuxfs file size. Probaby conservative, as rootfs will likely have some overlap with linuxfs
|
|
467
|
+
*/
|
|
468
|
+
rootSpaceNeeded = linuxfs_file_size + rootfs_file_size;
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
rootSpaceNeeded = linuxfs_file_size;
|
|
472
|
+
}
|
|
473
|
+
return rootSpaceNeeded / 1073741824.0; // Converte in GB
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Return true if i686 architecture
|
|
477
|
+
* @remarks to move in Utils
|
|
478
|
+
* @returns {boolean} true se l'architettura è i686
|
|
479
|
+
*/
|
|
480
|
+
static isi686() {
|
|
481
|
+
return process.arch === 'ia32';
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Controlla se è un pacchetto deb
|
|
485
|
+
* /usr/lib/penguins-eggs/bin/node
|
|
486
|
+
*/
|
|
487
|
+
static isPackage() {
|
|
488
|
+
let ret = false;
|
|
489
|
+
//if (process.execPath !== '/usr/bin/node') {
|
|
490
|
+
if (process.execPath === '/usr/lib/penguins-eggs/bin/node') {
|
|
491
|
+
ret = true;
|
|
492
|
+
}
|
|
493
|
+
return ret;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Controlla se è un pacchetto sorgente
|
|
497
|
+
*/
|
|
498
|
+
static isSources() {
|
|
499
|
+
let ret = false;
|
|
500
|
+
if (__dirname.substring(0, 6) === '/home/') {
|
|
501
|
+
ret = true;
|
|
502
|
+
}
|
|
503
|
+
return ret;
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Controlla se è un pacchetto npm
|
|
507
|
+
*/
|
|
508
|
+
static isNpmPackage() {
|
|
509
|
+
return !(this.isPackage() || this.isSources());
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
*
|
|
513
|
+
*/
|
|
514
|
+
static rootPenguin() {
|
|
515
|
+
return path.resolve(__dirname, '../../');
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* return the short name of the package: eggs
|
|
519
|
+
* @returns eggs
|
|
520
|
+
*/
|
|
521
|
+
static getFriendName() {
|
|
522
|
+
return pjson.shortName;
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* return the version of the package
|
|
526
|
+
* @returns version example 8.0.0
|
|
527
|
+
*/
|
|
528
|
+
static getPackageVersion() {
|
|
529
|
+
return pjson.version;
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Get author name
|
|
533
|
+
*/
|
|
534
|
+
static getAuthorName() {
|
|
535
|
+
return 'Piero Proietti piero.proietti@gmail.com';
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Return the Debian version
|
|
539
|
+
* @returns {number} Versione di Debian
|
|
540
|
+
*/
|
|
541
|
+
static getDebianVersion() {
|
|
542
|
+
const cmd = "cat /etc/debian_version | /usr/bin/cut -f1 -d'.'";
|
|
543
|
+
const version = Number(shx.exec(cmd, { silent: true }).stdout);
|
|
544
|
+
return version;
|
|
545
|
+
}
|
|
546
|
+
/**
|
|
547
|
+
* Return true if live system
|
|
548
|
+
* @returns {boolean} isLive
|
|
549
|
+
*/
|
|
550
|
+
static isLive() {
|
|
551
|
+
let retVal = false;
|
|
552
|
+
const paths = [
|
|
553
|
+
'/lib/live/mount', // debian-live
|
|
554
|
+
'/run/live/rootfs/filesystem.squashfs', // debian trixie
|
|
555
|
+
'/lib/live/mount/rootfs/filesystem.squashfs', // ubuntu bionic
|
|
556
|
+
'/live/aufs', // mx-linux
|
|
557
|
+
'/media/root-rw', // AlpineLinux
|
|
558
|
+
'/run/archiso/airootfs', // Arch
|
|
559
|
+
'/run/miso/sfs/livefs', // Manjarolinux
|
|
560
|
+
'/run/rootfsbase' // Fedora
|
|
561
|
+
];
|
|
562
|
+
for (let i = 0; i < paths.length; i++) {
|
|
563
|
+
if (Utils.isMountpoint(paths[i])) {
|
|
564
|
+
retVal = true;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
return retVal;
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Ritorna vero se path è un mountpoint
|
|
571
|
+
* @param path
|
|
572
|
+
*/
|
|
573
|
+
static isMountpoint(path = '') {
|
|
574
|
+
const cmd = `mountpoint -q ${path}`;
|
|
575
|
+
// return 0 if the directory is a mountpoint, non-zero if not.
|
|
576
|
+
const result = shx.exec(cmd, { silent: true }).code;
|
|
577
|
+
return result === 0;
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
*
|
|
581
|
+
* @param device
|
|
582
|
+
* @returns
|
|
583
|
+
*/
|
|
584
|
+
static isBlockDevice(device = '') {
|
|
585
|
+
const cmd = `lsblk -d -o name | grep ${device}`;
|
|
586
|
+
const result = shx.exec(cmd, { silent: true }).code;
|
|
587
|
+
return result === 0;
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* return true if eggs run as root
|
|
591
|
+
* @returns isRoot
|
|
592
|
+
*/
|
|
593
|
+
static isRoot(command = '') {
|
|
594
|
+
if (process.getuid && process.getuid() === 0) {
|
|
595
|
+
return true;
|
|
596
|
+
}
|
|
597
|
+
return false;
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
*
|
|
601
|
+
* @param command
|
|
602
|
+
*/
|
|
603
|
+
static useRoot(command = '') {
|
|
604
|
+
Utils.titles(pjson.shortName + ' ' + command + ` need to run with root privileges. Please, prefix it with sudo`);
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* get the kernel version
|
|
608
|
+
*/
|
|
609
|
+
static kernelVersion() {
|
|
610
|
+
return os.release();
|
|
611
|
+
}
|
|
612
|
+
/**
|
|
613
|
+
* return the name of network device
|
|
614
|
+
*/
|
|
615
|
+
static async iface() {
|
|
616
|
+
// return shx.exec(`ifconfig | awk 'FNR==1 { print $1 }' | tr --d :`, { silent: true }).stdout.trim()
|
|
617
|
+
const interfaces = Object.keys(os.networkInterfaces());
|
|
618
|
+
let netDeviceName = '';
|
|
619
|
+
for (const k in interfaces) {
|
|
620
|
+
if (interfaces[k] != 'lo') {
|
|
621
|
+
netDeviceName = interfaces[k];
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
return netDeviceName;
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* address
|
|
628
|
+
*/
|
|
629
|
+
static address() {
|
|
630
|
+
const interfaces = os.networkInterfaces();
|
|
631
|
+
let address = '';
|
|
632
|
+
if (interfaces !== undefined) {
|
|
633
|
+
for (const devName in interfaces) {
|
|
634
|
+
const iface = interfaces[devName];
|
|
635
|
+
if (iface !== undefined) {
|
|
636
|
+
for (const alias of iface) {
|
|
637
|
+
if (alias.family === 'IPv4' &&
|
|
638
|
+
alias.address !== '127.0.0.1' &&
|
|
639
|
+
!alias.internal) {
|
|
640
|
+
// take just the first!
|
|
641
|
+
if (address === '') {
|
|
642
|
+
address = alias.address;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
return address;
|
|
650
|
+
}
|
|
651
|
+
/**
|
|
652
|
+
* netmask
|
|
653
|
+
*/
|
|
654
|
+
static netmask() {
|
|
655
|
+
const interfaces = os.networkInterfaces();
|
|
656
|
+
let netmask = '';
|
|
657
|
+
if (interfaces !== undefined) {
|
|
658
|
+
for (const devName in interfaces) {
|
|
659
|
+
const iface = interfaces[devName];
|
|
660
|
+
if (iface !== undefined) {
|
|
661
|
+
for (const alias of iface) {
|
|
662
|
+
if (alias.family === 'IPv4' &&
|
|
663
|
+
alias.address !== '127.0.0.1' &&
|
|
664
|
+
!alias.internal) {
|
|
665
|
+
// take just the first!
|
|
666
|
+
if (netmask === '') {
|
|
667
|
+
netmask = alias.netmask;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
return netmask;
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* cidr
|
|
678
|
+
*/
|
|
679
|
+
static cidr() {
|
|
680
|
+
const interfaces = os.networkInterfaces();
|
|
681
|
+
let cidr = '';
|
|
682
|
+
if (interfaces !== undefined) {
|
|
683
|
+
for (const devName in interfaces) {
|
|
684
|
+
const iface = interfaces[devName];
|
|
685
|
+
if (iface !== undefined) {
|
|
686
|
+
for (const alias of iface) {
|
|
687
|
+
if (alias.family === 'IPv4' &&
|
|
688
|
+
alias.address !== '127.0.0.1' &&
|
|
689
|
+
!alias.internal) {
|
|
690
|
+
// take just the first!
|
|
691
|
+
if (cidr === '') {
|
|
692
|
+
if (alias.cidr !== null) {
|
|
693
|
+
cidr = alias.cidr;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
return cidr;
|
|
702
|
+
}
|
|
703
|
+
/**
|
|
704
|
+
*
|
|
705
|
+
* broadcast
|
|
706
|
+
*/
|
|
707
|
+
static broadcast() {
|
|
708
|
+
let n = new Netmask(Utils.cidr());
|
|
709
|
+
return n.broadcast;
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* dns
|
|
713
|
+
*/
|
|
714
|
+
static getDns() {
|
|
715
|
+
return dns.getServers();
|
|
716
|
+
}
|
|
717
|
+
/**
|
|
718
|
+
* getDomain
|
|
719
|
+
*/
|
|
720
|
+
static getDomain() {
|
|
721
|
+
return shx.exec('domainname', { silent: true }).stdout.trim();
|
|
722
|
+
// return shx.exec(`route -n | grep 'UG[ \t]' | awk '{print $2}'`, { silent: true }).stdout.trim()
|
|
723
|
+
}
|
|
724
|
+
/**
|
|
725
|
+
* @returns gateway
|
|
726
|
+
*/
|
|
727
|
+
static gateway() {
|
|
728
|
+
return shx.exec(`ip r | grep 'default' | awk '{print $3}'`, { silent: true }).stdout.trim();
|
|
729
|
+
//return shx.exec(`route -n | grep 'UG[ \t]' | awk '{print $2}'`, { silent: true }).stdout.trim()
|
|
730
|
+
}
|
|
731
|
+
/**
|
|
732
|
+
* write a file
|
|
733
|
+
* @param file
|
|
734
|
+
* @param text
|
|
735
|
+
*/
|
|
736
|
+
static write(file, text) {
|
|
737
|
+
text = text.trim() + '\n';
|
|
738
|
+
file = file.trim();
|
|
739
|
+
fs.writeFileSync(file, text);
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
*
|
|
743
|
+
* @param file
|
|
744
|
+
* @param cmd
|
|
745
|
+
*/
|
|
746
|
+
static writeX(file, cmd) {
|
|
747
|
+
let text = `#!/bin/sh\n\n`;
|
|
748
|
+
text += `# Created at: ${Utils.formatDate(new Date())}\n`;
|
|
749
|
+
text += `# By: penguins_eggs v. ${Utils.getPackageVersion()}\n`;
|
|
750
|
+
text += `# ==> Perri\'s Brewery edition <== \n\n`;
|
|
751
|
+
text += cmd;
|
|
752
|
+
Utils.write(file, text);
|
|
753
|
+
shx.chmod('+x', file);
|
|
754
|
+
}
|
|
755
|
+
/**
|
|
756
|
+
*
|
|
757
|
+
* @param file
|
|
758
|
+
* @param cmd
|
|
759
|
+
*/
|
|
760
|
+
static writeXs(file, cmds) {
|
|
761
|
+
let cmd = '';
|
|
762
|
+
for (const elem of cmds) {
|
|
763
|
+
cmd += elem + '\n';
|
|
764
|
+
}
|
|
765
|
+
Utils.writeX(file, cmd);
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
*
|
|
769
|
+
* @param msg
|
|
770
|
+
*/
|
|
771
|
+
static async customConfirm(msg = 'Select yes to continue... ') {
|
|
772
|
+
const varResult = await Utils.customConfirmCompanion(msg);
|
|
773
|
+
const result = JSON.parse(varResult);
|
|
774
|
+
if (result.confirm === 'Yes') {
|
|
775
|
+
return true;
|
|
776
|
+
}
|
|
777
|
+
else {
|
|
778
|
+
return false;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
/**
|
|
782
|
+
*
|
|
783
|
+
* @param msg
|
|
784
|
+
*/
|
|
785
|
+
static async customConfirmCompanion(msg = 'Select yes to continue... ') {
|
|
786
|
+
return new Promise(function (resolve) {
|
|
787
|
+
const questions = [
|
|
788
|
+
{
|
|
789
|
+
type: 'list',
|
|
790
|
+
name: 'confirm',
|
|
791
|
+
message: msg,
|
|
792
|
+
choices: ['No', 'Yes'],
|
|
793
|
+
default: 'No'
|
|
794
|
+
}
|
|
795
|
+
];
|
|
796
|
+
inquirer.prompt(questions).then(function (options) {
|
|
797
|
+
resolve(JSON.stringify(options));
|
|
798
|
+
});
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
802
|
+
*
|
|
803
|
+
* @param msg
|
|
804
|
+
*/
|
|
805
|
+
static async customConfirmAbort(msg = 'Confirm') {
|
|
806
|
+
return new Promise(function (resolve) {
|
|
807
|
+
const questions = [
|
|
808
|
+
{
|
|
809
|
+
type: 'list',
|
|
810
|
+
name: 'confirm',
|
|
811
|
+
message: msg,
|
|
812
|
+
choices: ['No', 'Yes', 'Abort'],
|
|
813
|
+
default: 'Yes'
|
|
814
|
+
}
|
|
815
|
+
];
|
|
816
|
+
inquirer.prompt(questions).then(function (options) {
|
|
817
|
+
resolve(JSON.stringify(options));
|
|
818
|
+
});
|
|
819
|
+
});
|
|
820
|
+
}
|
|
821
|
+
/**
|
|
822
|
+
*
|
|
823
|
+
*/
|
|
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');
|
|
838
|
+
let msg = 'Press a key to exit...';
|
|
839
|
+
if (procContinue) {
|
|
840
|
+
msg = 'Press a key to continue...';
|
|
841
|
+
}
|
|
842
|
+
console.log(msg);
|
|
843
|
+
const pressKeyToExit = spawnSync('read _ ', { shell: true, stdio: [0, 1, 2] });
|
|
844
|
+
if (!procContinue) {
|
|
845
|
+
process.exit(0);
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
/**
|
|
849
|
+
* titles
|
|
850
|
+
* Penguin's are gettings alive!
|
|
851
|
+
*/
|
|
852
|
+
static titles(command = '') {
|
|
853
|
+
console.clear();
|
|
854
|
+
console.log('');
|
|
855
|
+
console.log(' E G G S: the reproductive system of penguins');
|
|
856
|
+
console.log('');
|
|
857
|
+
console.log(Utils.flag());
|
|
858
|
+
console.log('command: ' + chalk.bgBlack.white(command) + '\n');
|
|
859
|
+
}
|
|
860
|
+
/**
|
|
861
|
+
*
|
|
862
|
+
* @returns flag
|
|
863
|
+
*/
|
|
864
|
+
static flag() {
|
|
865
|
+
return chalk.bgGreen.whiteBright(' ' + pjson.name + ' ') +
|
|
866
|
+
chalk.bgWhite.blue(" Perri's Brewery edition ") +
|
|
867
|
+
chalk.bgRed.whiteBright(' ver. ' + pjson.version + ' ');
|
|
868
|
+
}
|
|
869
|
+
/**
|
|
870
|
+
*
|
|
871
|
+
* @param verbose
|
|
872
|
+
*/
|
|
873
|
+
static setEcho(verbose = false) {
|
|
874
|
+
let echo = { echo: false, ignore: true };
|
|
875
|
+
if (verbose) {
|
|
876
|
+
echo = { echo: true, ignore: false };
|
|
877
|
+
}
|
|
878
|
+
return echo;
|
|
879
|
+
}
|
|
880
|
+
/**
|
|
881
|
+
*
|
|
882
|
+
* @param bytes
|
|
883
|
+
* @param decimals
|
|
884
|
+
* @returns
|
|
885
|
+
*/
|
|
886
|
+
static formatBytes(bytes, decimals = 2) {
|
|
887
|
+
if (bytes === 0)
|
|
888
|
+
return '0 Bytes';
|
|
889
|
+
const k = 1024;
|
|
890
|
+
const dm = decimals < 0 ? 0 : decimals;
|
|
891
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
892
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
893
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];
|
|
894
|
+
}
|
|
895
|
+
/**
|
|
896
|
+
*
|
|
897
|
+
* @returns wardrobe
|
|
898
|
+
*/
|
|
899
|
+
static async wardrobe() {
|
|
900
|
+
let wardrobe = `${os.homedir()}/.wardrobe`;
|
|
901
|
+
if (Utils.isRoot()) {
|
|
902
|
+
wardrobe = `/home/${await Utils.getPrimaryUser()}/.wardrobe`;
|
|
903
|
+
}
|
|
904
|
+
return wardrobe;
|
|
905
|
+
}
|
|
906
|
+
// Se il metodo fa parte di una classe, usa `static`. Altrimenti, rimuovilo.
|
|
907
|
+
static getOsRelease() {
|
|
908
|
+
const osReleasePath = path.join('/etc', 'os-release');
|
|
909
|
+
// Inizializza l'oggetto con valori predefiniti
|
|
910
|
+
const osInfo = {
|
|
911
|
+
ID: '',
|
|
912
|
+
VERSION_ID: '',
|
|
913
|
+
VERSION_CODENAME: 'n/a'
|
|
914
|
+
};
|
|
915
|
+
// Verifica se il file esiste
|
|
916
|
+
if (!fs.existsSync(osReleasePath)) {
|
|
917
|
+
console.error('/etc/os-release file does not exist.');
|
|
918
|
+
return osInfo;
|
|
919
|
+
}
|
|
920
|
+
// Leggi il contenuto del file
|
|
921
|
+
let fileContent;
|
|
922
|
+
try {
|
|
923
|
+
fileContent = fs.readFileSync(osReleasePath, 'utf8');
|
|
924
|
+
}
|
|
925
|
+
catch (error) {
|
|
926
|
+
console.error('Error reading /etc/os-release:', error);
|
|
927
|
+
return osInfo;
|
|
928
|
+
}
|
|
929
|
+
// Analizza ogni linea
|
|
930
|
+
const lines = fileContent.split('\n');
|
|
931
|
+
lines.forEach(line => {
|
|
932
|
+
if (line.startsWith('#') || line.trim() === '')
|
|
933
|
+
return;
|
|
934
|
+
const [key, value] = line.split('=');
|
|
935
|
+
if (key && value) {
|
|
936
|
+
const trimmedKey = key.trim();
|
|
937
|
+
const trimmedValue = value.trim().replace(/"/g, '');
|
|
938
|
+
// Popola solo le chiavi desiderate
|
|
939
|
+
if (trimmedKey === 'ID') {
|
|
940
|
+
osInfo.ID = trimmedValue;
|
|
941
|
+
}
|
|
942
|
+
else if (trimmedKey === 'VERSION_ID') {
|
|
943
|
+
osInfo.VERSION_ID = trimmedValue;
|
|
944
|
+
}
|
|
945
|
+
else if (trimmedKey === 'VERSION_CODENAME') {
|
|
946
|
+
osInfo.VERSION_CODENAME = trimmedValue;
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
});
|
|
950
|
+
// capitalize distroId
|
|
951
|
+
osInfo.ID = osInfo.ID[0].toUpperCase() + osInfo.ID.slice(1).toLowerCase();
|
|
952
|
+
osInfo.VERSION_CODENAME = osInfo.VERSION_CODENAME.toLowerCase();
|
|
953
|
+
return osInfo;
|
|
954
|
+
}
|
|
955
|
+
}
|