penguins-eggs 9.6.34 → 10.0.0
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 +1458 -1
- package/README.md +823 -8
- package/addons/eggs/theme/livecd/grub.main.cfg +4 -4
- package/addons/eggs/theme/livecd/isolinux.main.cfg +5 -5
- package/bin/dev.cmd +1 -1
- package/bin/dev.js +6 -0
- package/bin/run.js +5 -0
- package/conf/derivatives.yaml +2 -0
- package/conf/distros/buster/calamares/calamares-modules/bootloader-config/bootloader-config.sh +3 -3
- package/conf/distros/buster/calamares/calamares-modules/sources-yolk/sources-yolk.sh +1 -1
- package/conf/distros/buster/calamares/modules/fstab.yml +1 -1
- package/conf/distros/focal/calamares/modules/fstab.yml +1 -1
- package/conf/{exclude.list.homes → exclude.list.d/home.list} +6 -1
- package/conf/{exclude.list.template → exclude.list.d/master.list} +15 -24
- package/conf/exclude.list.d/var.list +21 -0
- package/conf/tools.yaml +1 -3
- package/dist/classes/bleach.d.ts +37 -0
- package/dist/classes/bleach.js +43 -91
- package/dist/classes/cfs.d.ts +17 -0
- package/dist/classes/cfs.js +15 -12
- package/dist/classes/compressors.d.ts +53 -0
- package/dist/classes/compressors.js +51 -58
- package/dist/classes/daddy.d.ts +18 -0
- package/dist/classes/daddy.js +93 -101
- package/dist/classes/distro.d.ts +26 -0
- package/dist/classes/distro.js +45 -27
- package/dist/classes/families/archlinux.d.ts +61 -0
- package/dist/classes/families/archlinux.js +56 -113
- package/dist/classes/families/debian.d.ts +65 -0
- package/dist/classes/families/debian.js +68 -143
- package/dist/classes/families/fedora.d.ts +52 -0
- package/dist/classes/families/fedora.js +43 -99
- package/dist/classes/families/mockup.d.ts +60 -0
- package/dist/classes/families/mockup.js +27 -46
- package/dist/classes/families/suse.d.ts +52 -0
- package/dist/classes/families/suse.js +45 -97
- package/dist/classes/incubation/branding.d.ts +17 -0
- package/dist/classes/incubation/branding.js +33 -32
- package/dist/classes/incubation/distros/bionic.d.ts +32 -0
- package/dist/classes/incubation/distros/bionic.js +15 -15
- package/dist/classes/incubation/distros/buster.d.ts +32 -0
- package/dist/classes/incubation/distros/buster.js +15 -15
- package/dist/classes/incubation/distros/focal.d.ts +32 -0
- package/dist/classes/incubation/distros/focal.js +15 -15
- package/dist/classes/incubation/distros/jessie.d.ts +31 -0
- package/dist/classes/incubation/distros/jessie.js +11 -13
- package/dist/classes/incubation/distros/rolling.d.ts +32 -0
- package/dist/classes/incubation/distros/rolling.js +15 -16
- package/dist/classes/incubation/fisherman-helper/displaymanager.d.ts +11 -0
- package/dist/classes/incubation/fisherman-helper/displaymanager.js +8 -9
- package/dist/classes/incubation/fisherman-helper/packages.d.ts +20 -0
- package/dist/classes/incubation/fisherman-helper/packages.js +17 -17
- package/dist/classes/incubation/fisherman-helper/settings.d.ts +15 -0
- package/dist/classes/incubation/fisherman-helper/settings.js +30 -28
- package/dist/classes/incubation/fisherman.d.ts +77 -0
- package/dist/classes/incubation/fisherman.js +137 -132
- package/dist/classes/incubation/incubator.d.ts +40 -0
- package/dist/classes/incubation/incubator.js +93 -87
- package/dist/classes/incubation/installer.d.ts +13 -0
- package/dist/classes/incubation/installer.js +27 -12
- package/dist/classes/initrd.d.ts +41 -0
- package/dist/classes/initrd.js +42 -44
- package/dist/classes/keyboards.d.ts +50 -0
- package/dist/classes/keyboards.js +110 -107
- package/dist/classes/locales.d.ts +21 -0
- package/dist/classes/locales.js +30 -34
- package/dist/classes/n8.d.ts +17 -0
- package/dist/classes/n8.js +16 -22
- package/dist/classes/network.d.ts +37 -0
- package/dist/classes/network.js +21 -25
- package/dist/classes/ovary.d.ts +205 -0
- package/dist/classes/ovary.js +1262 -1334
- package/dist/classes/pacman.d.ts +149 -0
- package/dist/classes/pacman.js +347 -426
- package/dist/classes/pve-live.d.ts +17 -0
- package/dist/classes/pve-live.js +23 -25
- package/dist/classes/pxe.d.ts +65 -0
- package/dist/classes/pxe.js +206 -210
- package/dist/classes/settings.d.ts +53 -0
- package/dist/classes/settings.js +99 -102
- package/dist/classes/sources_list.d.ts +28 -0
- package/dist/classes/sources_list.js +35 -39
- package/dist/classes/systemctl.d.ts +47 -0
- package/dist/classes/systemctl.js +35 -39
- package/dist/classes/tailor.d.ts +46 -0
- package/dist/classes/tailor.js +225 -241
- package/dist/classes/tools.d.ts +30 -0
- package/dist/classes/tools.js +20 -26
- package/dist/classes/users.d.ts +28 -0
- package/dist/classes/users.js +22 -16
- package/dist/classes/utils.d.ts +318 -0
- package/dist/classes/utils.js +91 -76
- package/dist/classes/xdg.d.ts +45 -0
- package/dist/classes/xdg.js +129 -133
- package/dist/classes/yolk.d.ts +33 -0
- package/dist/classes/yolk.js +54 -60
- package/dist/commands/adapt.d.ts +17 -0
- package/dist/commands/adapt.js +21 -25
- package/dist/commands/analyze.d.ts +26 -0
- package/dist/commands/analyze.js +60 -74
- package/dist/commands/calamares.d.ts +29 -0
- package/dist/commands/calamares.js +53 -60
- package/dist/commands/config.d.ts +36 -0
- package/dist/commands/config.js +120 -142
- package/dist/commands/cuckoo.d.ts +16 -0
- package/dist/commands/cuckoo.js +24 -28
- package/dist/commands/dad.d.ts +19 -0
- package/dist/commands/dad.js +26 -30
- package/dist/commands/export/deb.d.ts +19 -0
- package/dist/commands/export/deb.js +33 -42
- package/dist/commands/export/iso.d.ts +19 -0
- package/dist/commands/export/iso.js +24 -28
- package/dist/commands/install.d.ts +37 -0
- package/dist/commands/install.js +68 -68
- package/dist/commands/kill.d.ts +24 -0
- package/dist/commands/kill.js +31 -38
- package/dist/commands/mom.d.ts +16 -0
- package/dist/commands/mom.js +20 -22
- package/dist/commands/produce.d.ts +33 -0
- package/dist/commands/produce.js +100 -92
- package/dist/commands/status.d.ts +23 -0
- package/dist/commands/status.js +14 -20
- package/dist/commands/syncfrom.d.ts +45 -0
- package/dist/commands/syncfrom.js +99 -109
- package/dist/commands/syncto.d.ts +40 -0
- package/dist/commands/syncto.js +152 -216
- package/dist/commands/tools/clean.d.ts +18 -0
- package/dist/commands/tools/clean.js +21 -25
- package/dist/commands/tools/ppa.d.ts +26 -0
- package/dist/commands/tools/ppa.js +46 -50
- package/dist/commands/tools/skel.d.ts +18 -0
- package/dist/commands/tools/skel.js +27 -31
- package/dist/commands/tools/stat.d.ts +31 -0
- package/dist/commands/tools/stat.js +21 -25
- package/dist/commands/tools/yolk.d.ts +24 -0
- package/dist/commands/tools/yolk.js +23 -27
- package/dist/commands/update.d.ts +47 -0
- package/dist/commands/update.js +66 -70
- package/dist/commands/wardrobe/get.d.ts +23 -0
- package/dist/commands/wardrobe/get.js +26 -28
- package/dist/commands/wardrobe/list.d.ts +24 -0
- package/dist/commands/wardrobe/list.js +69 -67
- package/dist/commands/wardrobe/show.d.ts +25 -0
- package/dist/commands/wardrobe/show.js +57 -52
- package/dist/commands/wardrobe/wear.d.ts +26 -0
- package/dist/commands/wardrobe/wear.js +39 -41
- package/dist/components/finished.d.ts +15 -0
- package/dist/components/finished.js +37 -42
- package/dist/components/information.d.ts +8 -0
- package/dist/components/information.js +155 -0
- package/dist/components/install.d.ts +15 -0
- package/dist/components/install.js +31 -35
- package/dist/components/keyboard.d.ts +16 -0
- package/dist/components/keyboard.js +37 -40
- package/dist/components/location.d.ts +16 -0
- package/dist/components/location.js +38 -38
- package/dist/components/network.d.ts +19 -0
- package/dist/components/network.js +47 -48
- package/dist/components/partitions.d.ts +16 -0
- package/dist/components/partitions.js +47 -51
- package/dist/components/steps.d.ts +13 -0
- package/dist/components/steps.js +148 -0
- package/dist/components/summary.d.ts +24 -0
- package/dist/components/summary.js +53 -54
- package/dist/components/title.d.ts +12 -0
- package/dist/components/title.js +35 -0
- package/dist/components/users.d.ts +24 -0
- package/dist/components/users.js +43 -43
- package/dist/components/welcome.d.ts +13 -0
- package/dist/components/welcome.js +37 -38
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -5
- package/dist/interfaces/i-addons.d.ts +13 -0
- package/dist/interfaces/i-addons.js +8 -3
- package/dist/interfaces/i-analyze.d.ts +17 -0
- package/dist/interfaces/i-analyze.js +11 -16
- package/dist/interfaces/i-app.d.ts +14 -0
- package/dist/interfaces/i-app.js +8 -2
- package/dist/interfaces/i-branding.d.ts +36 -0
- package/dist/interfaces/i-branding.js +8 -2
- package/dist/interfaces/i-calamares-partition.d.ts +18 -0
- package/dist/interfaces/i-calamares-partition.js +3 -4
- package/dist/interfaces/i-config-tools.d.ts +18 -0
- package/dist/interfaces/i-config-tools.js +8 -2
- package/dist/interfaces/i-devices.d.ts +20 -0
- package/dist/interfaces/i-devices.js +8 -2
- package/dist/interfaces/i-distro.d.ts +27 -0
- package/dist/interfaces/i-distro.js +3 -4
- package/dist/interfaces/i-drive-list.d.ts +33 -0
- package/dist/interfaces/i-drive-list.js +3 -4
- package/dist/interfaces/i-eggs-config.d.ts +32 -0
- package/dist/interfaces/i-eggs-config.js +3 -4
- 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 +3 -4
- package/dist/interfaces/i-initrd.d.ts +13 -0
- package/dist/interfaces/i-initrd.js +8 -2
- package/dist/interfaces/i-install.d.ts +16 -0
- package/dist/interfaces/i-install.js +8 -2
- package/dist/interfaces/i-installer.d.ts +17 -0
- package/dist/interfaces/i-installer.js +8 -2
- package/dist/interfaces/i-krill-config.d.ts +33 -0
- package/dist/interfaces/i-krill-config.js +3 -4
- package/dist/interfaces/i-krill.d.ts +42 -0
- package/dist/interfaces/i-krill.js +8 -2
- package/dist/interfaces/i-materia.d.ts +41 -0
- package/dist/interfaces/i-materia.js +8 -2
- package/dist/interfaces/i-net.d.ts +16 -0
- package/dist/interfaces/i-net.js +8 -2
- package/dist/interfaces/i-packages.d.ts +29 -0
- package/dist/interfaces/i-packages.js +3 -4
- package/dist/interfaces/i-partitions.d.ts +16 -0
- package/dist/interfaces/i-partitions.js +8 -2
- package/dist/interfaces/i-pxe.d.ts +21 -0
- package/dist/interfaces/i-pxe.js +8 -39
- package/dist/interfaces/i-remix.d.ts +21 -0
- package/dist/interfaces/i-remix.js +3 -4
- package/dist/interfaces/i-settings.d.ts +39 -0
- package/dist/interfaces/i-settings.js +8 -2
- package/dist/interfaces/i-user.d.ts +14 -0
- package/dist/interfaces/i-user.js +8 -2
- package/dist/interfaces/i-workdir.d.ts +14 -0
- package/dist/interfaces/i-workdir.js +8 -2
- package/dist/interfaces/i-xkb-model.d.ts +24 -0
- package/dist/interfaces/i-xkb-model.js +8 -2
- package/dist/interfaces/index.d.ts +25 -0
- package/dist/interfaces/index.js +3 -4
- package/dist/krill/modules/add-user.d.ts +20 -0
- package/dist/krill/modules/add-user.js +11 -15
- package/dist/krill/modules/bootloader-config-arch.d.ts +14 -0
- package/dist/krill/modules/bootloader-config-arch.js +15 -11
- package/dist/krill/modules/bootloader-config-debian.d.ts +10 -0
- package/dist/krill/modules/bootloader-config-debian.js +20 -16
- package/dist/krill/modules/bootloader-config.d.ts +10 -0
- package/dist/krill/modules/bootloader-config.js +3 -6
- package/dist/krill/modules/bootloader.d.ts +14 -0
- package/dist/krill/modules/bootloader.js +9 -13
- package/dist/krill/modules/change-password.d.ts +15 -0
- package/dist/krill/modules/change-password.js +5 -8
- package/dist/krill/modules/del-live-user.d.ts +14 -0
- package/dist/krill/modules/del-live-user.js +8 -12
- package/dist/krill/modules/fstab.d.ts +14 -0
- package/dist/krill/modules/fstab.js +69 -46
- package/dist/krill/modules/grubcfg.d.ts +17 -0
- package/dist/krill/modules/grubcfg.js +8 -17
- package/dist/krill/modules/hostname.d.ts +13 -0
- package/dist/krill/modules/hostname.js +11 -17
- package/dist/krill/modules/initramfs-cfg.d.ts +14 -0
- package/dist/krill/modules/initramfs-cfg.js +6 -15
- package/dist/krill/modules/initramfs.d.ts +13 -0
- package/dist/krill/modules/initramfs.js +17 -19
- package/dist/krill/modules/locale-cfg.d.ts +10 -0
- package/dist/krill/modules/locale-cfg.js +8 -12
- package/dist/krill/modules/locale.d.ts +13 -0
- package/dist/krill/modules/locale.js +7 -11
- package/dist/krill/modules/m-keyboard.d.ts +14 -0
- package/dist/krill/modules/m-keyboard.js +14 -18
- package/dist/krill/modules/m-timezone.d.ts +14 -0
- package/dist/krill/modules/m-timezone.js +8 -12
- package/dist/krill/modules/machine-id.d.ts +15 -0
- package/dist/krill/modules/machine-id.js +6 -10
- package/dist/krill/modules/mkfs.d.ts +13 -0
- package/dist/krill/modules/mkfs.js +33 -23
- package/dist/krill/modules/mount-fs.d.ts +17 -0
- package/dist/krill/modules/mount-fs.js +20 -26
- package/dist/krill/modules/mount-vfs.d.ts +17 -0
- package/dist/krill/modules/mount-vfs.js +16 -21
- package/dist/krill/modules/network-cfg.d.ts +19 -0
- package/dist/krill/modules/network-cfg.js +28 -31
- package/dist/krill/modules/packages.d.ts +14 -0
- package/dist/krill/modules/packages.js +17 -21
- package/dist/krill/modules/partition.d.ts +20 -0
- package/dist/krill/modules/partition.js +80 -86
- package/dist/krill/modules/remove-installer-link.d.ts +13 -0
- package/dist/krill/modules/remove-installer-link.js +7 -11
- package/dist/krill/modules/umount.d.ts +14 -0
- package/dist/krill/modules/umount.js +9 -13
- package/dist/krill/modules/unpackfs.d.ts +13 -0
- package/dist/krill/modules/unpackfs.js +7 -11
- package/dist/krill/prepare.d.ts +77 -0
- package/dist/krill/{krill-prepare.js → prepare.js} +136 -130
- package/dist/krill/sequence.d.ts +156 -0
- package/dist/krill/sequence.js +640 -0
- package/dist/lib/cli-autologin.d.ts +43 -0
- package/dist/lib/cli-autologin.js +88 -92
- package/dist/lib/get_address.d.ts +8 -0
- package/dist/lib/get_address.js +9 -11
- package/dist/lib/get_dns.d.ts +8 -0
- package/dist/lib/get_dns.js +9 -11
- package/dist/lib/get_domain.d.ts +8 -0
- package/dist/lib/get_domain.js +9 -11
- package/dist/lib/get_gateway.d.ts +8 -0
- package/dist/lib/get_gateway.js +9 -11
- package/dist/lib/get_hostname.d.ts +8 -0
- package/dist/lib/get_hostname.js +9 -11
- package/dist/lib/get_netmask.d.ts +8 -0
- package/dist/lib/get_netmask.js +9 -11
- package/dist/lib/get_password.d.ts +8 -0
- package/dist/lib/get_password.js +10 -13
- package/dist/lib/get_userfullname.d.ts +8 -0
- package/dist/lib/get_userfullname.js +9 -11
- package/dist/lib/get_username.d.ts +8 -0
- package/dist/lib/get_username.js +9 -12
- package/dist/lib/kill_me_softly.d.ts +11 -0
- package/dist/lib/kill_me_softly.js +19 -24
- package/dist/lib/select_address_type.d.ts +8 -0
- package/dist/lib/select_address_type.js +9 -12
- package/dist/lib/select_filesystem_type.d.ts +8 -0
- package/dist/lib/select_filesystem_type.js +19 -17
- package/dist/lib/select_installation_device.d.ts +8 -0
- package/dist/lib/select_installation_device.js +11 -15
- package/dist/lib/select_installation_mode.d.ts +8 -0
- package/dist/lib/select_installation_mode.js +9 -11
- package/dist/lib/select_interface.d.ts +8 -0
- package/dist/lib/select_interface.js +9 -12
- package/dist/lib/select_keyboard_layout.d.ts +11 -0
- package/dist/lib/select_keyboard_layout.js +11 -15
- package/dist/lib/select_keyboard_model.d.ts +11 -0
- package/dist/lib/select_keyboard_model.js +11 -15
- package/dist/lib/select_keyboard_option.d.ts +11 -0
- package/dist/lib/select_keyboard_option.js +11 -15
- package/dist/lib/select_keyboard_variant.d.ts +11 -0
- package/dist/lib/select_keyboard_variant.js +11 -15
- package/dist/lib/select_languages.d.ts +8 -0
- package/dist/lib/select_languages.js +11 -15
- package/dist/lib/select_regions.d.ts +8 -0
- package/dist/lib/select_regions.js +9 -11
- package/dist/lib/select_user_swap_choice.d.ts +8 -0
- package/dist/lib/select_user_swap_choice.js +13 -17
- package/dist/lib/select_zones.d.ts +8 -0
- package/dist/lib/select_zones.js +9 -11
- package/dist/lib/utils.d.ts +34 -0
- package/dist/lib/utils.js +24 -14
- package/manpages/doc/man/eggs.1.gz +0 -0
- package/manpages/doc/man/eggs.html +130 -76
- package/package.json +55 -74
- package/scripts/_eggs +9 -7
- package/scripts/eggs.bash +4 -4
- package/LICENSE +0 -339
- package/bin/dev +0 -17
- package/bin/run +0 -5
- package/conf/exclude.list.custom +0 -3
- package/dist/components/elements/information.js +0 -194
- package/dist/components/elements/steps.js +0 -152
- package/dist/components/elements/title.js +0 -36
- package/dist/interfaces/i-filters.js +0 -3
- package/dist/krill/krill-sequence.js +0 -645
- package/dist/lib/dependencies.js +0 -120
- package/manpages/doc/man/README.md +0 -0
- /package/conf/{exclude.list.usr → exclude.list.d/usr.list} +0 -0
package/dist/commands/syncto.js
CHANGED
|
@@ -1,243 +1,179 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* ./src/commands/syncto.ts
|
|
3
|
+
* penguins-eggs v.10.0.0 / ecmascript 2020
|
|
5
4
|
* author: Piero Proietti
|
|
6
5
|
* email: piero.proietti@gmail.com
|
|
7
6
|
* license: MIT
|
|
8
7
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
// https://gist.github.com/ansemjo/6f1cf9d9b8f7ce8f70813f52c63b74a6
|
|
9
|
+
import { Command, Flags } from '@oclif/core';
|
|
10
|
+
import fs from 'node:fs';
|
|
11
|
+
import Compressors from '../classes/compressors.js';
|
|
12
|
+
import Settings from '../classes/settings.js';
|
|
13
|
+
import Utils from '../classes/utils.js';
|
|
14
|
+
import { exec } from '../lib/utils.js';
|
|
11
15
|
/**
|
|
12
16
|
*
|
|
13
|
-
* syncfrom (restore)
|
|
14
|
-
* --include-from file.list // if only include is provided everything from the list if used to update the system.
|
|
15
|
-
* --exclude-from file-list // it just updates the system
|
|
16
|
-
* --delete
|
|
17
|
-
*
|
|
18
|
-
* If both options are provided then it works as a combination as provided in the link above.
|
|
19
|
-
* https://stackoverflow.com/questions/19296190/rsync-include-from-vs-exclude-from-what-is-the-actual-difference
|
|
20
|
-
*
|
|
21
|
-
* The same logic is applied for the syncto also.
|
|
22
|
-
*
|
|
23
|
-
* On top of all of this the --delete option
|
|
24
|
-
* if needed to be passed so that everything else is removed, but this
|
|
25
|
-
* this should not be available by default
|
|
26
17
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
18
|
+
export default class Syncto extends Command {
|
|
19
|
+
static description = 'Save users and users\' data ENCRYPTED';
|
|
20
|
+
static examples = [
|
|
21
|
+
'sudo eggs syncto',
|
|
22
|
+
'sudo eggs syncto --file /path/to/luks-volume',
|
|
23
|
+
'sudo eggs syncto --excludes'
|
|
24
|
+
];
|
|
25
|
+
static flags = {
|
|
26
|
+
excludes: Flags.boolean({ char: 'e', description: 'use: exclude.list.d/home.list' }),
|
|
27
|
+
file: Flags.string({ char: 'f', description: 'file luks-volume encrypted' }),
|
|
28
|
+
help: Flags.help({ char: 'h' }),
|
|
29
|
+
verbose: Flags.boolean({ char: 'v', description: 'verbose' }),
|
|
30
|
+
};
|
|
31
|
+
echo = {};
|
|
32
|
+
exclude = false;
|
|
33
|
+
excludeHome = '/etc/penguins-eggs.d/exclude.list.d/home.list';
|
|
34
|
+
luksName = 'luks-volume';
|
|
35
|
+
luksDevice = `/dev/mapper/${this.luksName}`;
|
|
36
|
+
luksFile = `/tmp/${this.luksName}`;
|
|
37
|
+
luksMountpoint = `/tmp/mnt/${this.luksName}`;
|
|
38
|
+
privateSquashfs = `private.squashfs`;
|
|
39
|
+
settings = {};
|
|
40
|
+
verbose = false;
|
|
49
41
|
/**
|
|
50
42
|
*
|
|
51
43
|
*/
|
|
52
|
-
async
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* restore con file
|
|
69
|
-
*/
|
|
70
|
-
if (fileVolume === '') {
|
|
71
|
-
fileVolume = '/tmp/luks-eggs-data';
|
|
72
|
-
}
|
|
73
|
-
this.luksName = path_1.default.basename(fileVolume);
|
|
74
|
-
this.luksFile = fileVolume;
|
|
75
|
-
this.luksDevice = `/dev/mapper/${this.luksName}`;
|
|
76
|
-
this.luksMountpoint = '/tmp/eggs-data';
|
|
77
|
-
if (!fs_1.default.existsSync(fileVolume)) {
|
|
78
|
-
await this.luksCreate();
|
|
44
|
+
async luksCreate() {
|
|
45
|
+
await exec(`rm -rf ${this.luksFile}`);
|
|
46
|
+
// ==========================================================================
|
|
47
|
+
// Create squashfs
|
|
48
|
+
// ==========================================================================
|
|
49
|
+
Utils.warning(`Creating private.squashfs`);
|
|
50
|
+
const compressors = new Compressors();
|
|
51
|
+
await compressors.populate();
|
|
52
|
+
// comp
|
|
53
|
+
let comp = '';
|
|
54
|
+
this.settings = new Settings();
|
|
55
|
+
if (await this.settings.load()) {
|
|
56
|
+
let compression = compressors.fast();
|
|
57
|
+
if (this.settings.config.compression == `max`) {
|
|
58
|
+
compression = compressors.max();
|
|
79
59
|
}
|
|
80
|
-
else {
|
|
81
|
-
|
|
60
|
+
else if (this.settings.config.compression == `standard`) {
|
|
61
|
+
compression = compressors.standard();
|
|
82
62
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
63
|
+
comp = `-comp ${compression}`;
|
|
64
|
+
}
|
|
65
|
+
// exclude /home/eggs
|
|
66
|
+
let exclude_nest = '';
|
|
67
|
+
if (fs.existsSync(this.settings.work_dir.workdir)) {
|
|
68
|
+
exclude_nest = `-e ${this.settings.config.snapshot_dir}`;
|
|
69
|
+
}
|
|
70
|
+
// exclude file
|
|
71
|
+
let exclude_home = '';
|
|
72
|
+
if (this.exclude) {
|
|
73
|
+
exclude_home = `-ef ${this.excludeHome}`;
|
|
74
|
+
}
|
|
75
|
+
// creato dummyfs per /etc/
|
|
76
|
+
await exec(`mkdir -p /tmp/dummyfs/etc`, this.echo);
|
|
77
|
+
await exec(`cp -a /etc/passwd /tmp/dummyfs/etc`, this.echo);
|
|
78
|
+
await exec(`cp -a /etc/group /tmp/dummyfs/etc`, this.echo);
|
|
79
|
+
await exec(`cp -a /etc/shadow /tmp/dummyfs/etc`, this.echo);
|
|
80
|
+
await exec(`mkdir -p /tmp/dummyfs/etc/lightdm`, this.echo); // lightdm
|
|
81
|
+
await exec(`cp -a /etc/lightdm/lightdm.conf /tmp/dummyfs/etc/lightdm/`, this.echo); // lightdm
|
|
82
|
+
let mkPrivateSquashfs = `mksquashfs \
|
|
83
|
+
/tmp/dummyfs/etc \
|
|
84
|
+
/home \
|
|
85
|
+
/tmp/${this.privateSquashfs} \
|
|
86
|
+
${comp} \
|
|
87
|
+
${exclude_nest} \
|
|
88
|
+
${exclude_home} \
|
|
89
|
+
-keep-as-directory \
|
|
90
|
+
-noappend`;
|
|
91
|
+
mkPrivateSquashfs = mkPrivateSquashfs.replaceAll(/\s\s+/g, ` `);
|
|
92
|
+
await exec(mkPrivateSquashfs, Utils.setEcho(true));
|
|
93
|
+
// remove dummyfs
|
|
94
|
+
await exec(`rm /tmp/dummyfs/ -rf`, this.echo);
|
|
95
|
+
// ==========================================================================
|
|
96
|
+
// Create LUKS volume
|
|
97
|
+
// ==========================================================================
|
|
98
|
+
Utils.titles("Creating LUKS Volume");
|
|
99
|
+
// calcolo size
|
|
100
|
+
const sizeString = (await exec(`unsquashfs -s /tmp/${this.privateSquashfs} | grep "Filesystem size" | sed -e 's/.*size //' -e 's/ .*//'`, { capture: true, echo: false })).data;
|
|
101
|
+
let size = Number.parseInt(sizeString) + 2048;
|
|
102
|
+
console.log("size private.squashfs:", bytesToGB(size), size);
|
|
103
|
+
const luksBlockSize = 512;
|
|
104
|
+
const luksBlocks = Math.ceil(size / luksBlockSize);
|
|
105
|
+
size = luksBlockSize * luksBlocks;
|
|
106
|
+
// Aggiungo un 20% in più per ottenere luksSize
|
|
107
|
+
const luksSize = Math.ceil((size) * 1.2);
|
|
108
|
+
console.log("luksSize:", bytesToGB(luksSize), luksSize);
|
|
109
|
+
// truncate * 2048 è cruciale
|
|
110
|
+
const truncateAt = luksSize * 2048;
|
|
111
|
+
Utils.warning(`Preparing file ${this.luksFile} for ${this.luksDevice}, size ${truncateAt}`);
|
|
112
|
+
await exec(`truncate --size ${luksSize} ${this.luksFile}`, this.echo);
|
|
113
|
+
Utils.warning(`Creating LUKS Volume on ${this.luksFile}`);
|
|
114
|
+
await exec(`cryptsetup --batch-mode luksFormat ${this.luksFile}`, Utils.setEcho(true));
|
|
115
|
+
console.log('');
|
|
116
|
+
// open LUKS volume temp
|
|
117
|
+
Utils.warning(`Opening LUKS Volume on ${this.luksFile}`);
|
|
118
|
+
const { code } = await exec(`cryptsetup luksOpen ${this.luksFile} ${this.luksName}`, Utils.setEcho(true));
|
|
119
|
+
if (code != 0) {
|
|
120
|
+
Utils.error(`cryptsetup luksOpen ${this.luksFile} ${this.luksName} failed`);
|
|
121
|
+
process.exit(code);
|
|
122
|
+
}
|
|
123
|
+
await exec('udevadm settle', this.echo);
|
|
124
|
+
// formatta ext4 il volume
|
|
125
|
+
await exec(`mkfs.ext4 ${this.luksDevice}`, this.echo);
|
|
126
|
+
console.log('');
|
|
127
|
+
// mount LUKS volume
|
|
128
|
+
if (!fs.existsSync(`this.luksMountpoint)`)) {
|
|
129
|
+
Utils.warning(`creating mountpoint ${this.luksMountpoint}`);
|
|
130
|
+
await exec(`mkdir -p ${this.luksMountpoint}`, this.echo);
|
|
131
|
+
}
|
|
132
|
+
if (!Utils.isMountpoint(`${this.luksMountpoint}`)) {
|
|
133
|
+
Utils.warning(`mounting volume: ${this.luksDevice} on ${this.luksMountpoint}`);
|
|
134
|
+
const { code } = await exec(`mount ${this.luksDevice} ${this.luksMountpoint}`, Utils.setEcho(true));
|
|
135
|
+
if (code != 0) {
|
|
136
|
+
Utils.error(`mount ${this.luksDevice} ${this.luksMountpoint} failed`);
|
|
137
|
+
process.exit(code);
|
|
87
138
|
}
|
|
88
139
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
140
|
+
// copy private.squashfs
|
|
141
|
+
Utils.warning(`moving /tmp/${this.privateSquashfs} to ${this.luksMountpoint}`);
|
|
142
|
+
await exec(`mv /tmp/${this.privateSquashfs} ${this.luksMountpoint}`, this.echo);
|
|
143
|
+
Utils.warning(`Umounting ${this.luksMountpoint}`);
|
|
144
|
+
await exec(`umount ${this.luksMountpoint}`, this.echo);
|
|
145
|
+
Utils.warning(`Vlosing ${this.luksMountpoint}`);
|
|
146
|
+
await exec(`cryptsetup luksClose ${this.luksName}`, this.echo);
|
|
92
147
|
}
|
|
93
148
|
/**
|
|
94
149
|
*
|
|
95
150
|
*/
|
|
96
|
-
async
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const usersArray = await this.usersFill();
|
|
102
|
-
for (const element of usersArray) {
|
|
103
|
-
if (element.saveIt && fs_1.default.existsSync(element.home)) {
|
|
104
|
-
await (0, utils_2.exec)(`mkdir -p ${this.luksMountpoint}/ROOT${element.home}`, this.echo);
|
|
105
|
-
const source = element.home;
|
|
106
|
-
let dest = this.luksMountpoint + '/ROOT' + element.home;
|
|
107
|
-
dest = dest.slice(0, Math.max(0, dest.lastIndexOf('/')));
|
|
108
|
-
let cmd = `rsync --archive ${source} ${dest}`;
|
|
109
|
-
if (destDelete) {
|
|
110
|
-
cmd = `rsync --archive --delete ${source} ${dest}`;
|
|
111
|
-
}
|
|
112
|
-
await (0, utils_2.exec)(cmd, this.echo);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
utils_1.default.warning(`Saving users' accounts on ${this.luksFile}`);
|
|
116
|
-
await (0, utils_2.exec)(`mkdir -p ${this.luksMountpoint}/etc`, this.echo);
|
|
117
|
-
await (0, utils_2.exec)(`cp /etc/passwd ${this.luksMountpoint}/etc`, this.echo);
|
|
118
|
-
await (0, utils_2.exec)(`cp /etc/shadow ${this.luksMountpoint}/etc`, this.echo);
|
|
119
|
-
await (0, utils_2.exec)(`cp /etc/group ${this.luksMountpoint}/etc`, this.echo);
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* usersFill
|
|
123
|
-
*/
|
|
124
|
-
async usersFill() {
|
|
125
|
-
const usersArray = [];
|
|
126
|
-
await (0, promises_1.access)('/etc/passwd', fs_2.constants.R_OK | fs_2.constants.W_OK);
|
|
127
|
-
const passwd = fs_1.default.readFileSync('/etc/passwd', 'utf-8').split('\n');
|
|
128
|
-
for (const element of passwd) {
|
|
129
|
-
const line = element.split(':');
|
|
130
|
-
const users = new users_1.default(line[0], line[1], line[2], line[3], line[4], line[5], line[6]);
|
|
131
|
-
await users.getValues();
|
|
132
|
-
if (users.password !== undefined) {
|
|
133
|
-
usersArray.push(users);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
return usersArray;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
*
|
|
140
|
-
*/
|
|
141
|
-
async luksCreate() {
|
|
142
|
-
utils_1.default.warning(`Creating LUKS Volume on ${this.luksFile}`);
|
|
143
|
-
let totalSize = 0;
|
|
144
|
-
console.log('I will extimate volume size from your private data:');
|
|
145
|
-
const users = await this.usersFill();
|
|
146
|
-
for (const user of users) {
|
|
147
|
-
if (user.login !== 'root' && user.saveIt) {
|
|
148
|
-
let utype = 'user ';
|
|
149
|
-
if (Number.parseInt(user.uid) < 1000) {
|
|
150
|
-
utype = 'service';
|
|
151
|
-
}
|
|
152
|
-
console.log(`- ${utype}: ${user.login.padEnd(16)} \thome: ${user.home} \tsize: ${utils_1.default.formatBytes(user.size)} \tBytes: ${user.size} `);
|
|
153
|
-
totalSize += user.size;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
console.log(`Total\t\t\t\t\t\t\tsize: ${utils_1.default.formatBytes(totalSize)} \tBytes: ${totalSize}`);
|
|
157
|
-
/**
|
|
158
|
-
* after we get size, we can start building luks-volume
|
|
159
|
-
*/
|
|
160
|
-
const binaryHeaderSize = 4194304;
|
|
161
|
-
const volumeSize = totalSize * 1.5 + binaryHeaderSize;
|
|
162
|
-
// Deciding blockSize and blocks
|
|
163
|
-
const blockSize = 512;
|
|
164
|
-
let blocks = Math.ceil(volumeSize / blockSize);
|
|
165
|
-
// We need a minimum size of 32 MB
|
|
166
|
-
const minimunSize = 134217728; // 128 * 1024 *1024
|
|
167
|
-
if (totalSize < minimunSize) { }
|
|
168
|
-
if (blocks * blockSize < minimunSize) {
|
|
169
|
-
blocks = Math.ceil(minimunSize / blockSize);
|
|
170
|
-
}
|
|
171
|
-
utils_1.default.warning(`Creating an encrypted file ${this.luksFile} blocks=${blocks}, block size: ${blockSize}, size: ${utils_1.default.formatBytes(blocks * blockSize)}`);
|
|
172
|
-
await (0, utils_2.exec)(`dd if=/dev/zero of=${this.luksFile} bs=${blockSize} count=${blocks}`, this.echo);
|
|
173
|
-
// find first unused device
|
|
174
|
-
const findFirstUnusedDevice = await (0, utils_2.exec)('losetup -f', { echo: this.verbose, ignore: false, capture: true });
|
|
175
|
-
let firstUnusedDevice = '';
|
|
176
|
-
if (findFirstUnusedDevice.code !== 0) {
|
|
177
|
-
utils_1.default.pressKeyToExit(`Error: ${findFirstUnusedDevice.code} ${findFirstUnusedDevice.data}`);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
firstUnusedDevice = findFirstUnusedDevice.data.trim();
|
|
181
|
-
}
|
|
182
|
-
await (0, utils_2.exec)(`losetup ${firstUnusedDevice} ${this.luksFile}`, this.echo);
|
|
183
|
-
// Utils.warning('Enter a large string of random text below to setup the pre-encryption')
|
|
184
|
-
await (0, utils_2.exec)(`cryptsetup -y -v --type luks2 luksFormat ${this.luksFile}`, utils_1.default.setEcho(true));
|
|
185
|
-
// Utils.warning(`Enter the desired passphrase for the encrypted ${this.luksName} below`)
|
|
186
|
-
const crytoSetup = await (0, utils_2.exec)(`cryptsetup luksOpen --type luks2 ${this.luksFile} ${this.luksName}`, utils_1.default.setEcho(true));
|
|
187
|
-
if (crytoSetup.code !== 0) {
|
|
188
|
-
utils_1.default.pressKeyToExit(`Error: ${crytoSetup.code} ${crytoSetup.data}`);
|
|
189
|
-
}
|
|
190
|
-
utils_1.default.warning(`Formatting ${this.luksDevice} to ext2`);
|
|
191
|
-
const formatting = await (0, utils_2.exec)(`sudo mkfs.ext2 ${this.luksDevice}`, this.echo);
|
|
192
|
-
if (formatting.code !== 0) {
|
|
193
|
-
utils_1.default.pressKeyToExit(`Error: ${formatting.code} ${formatting.data}`);
|
|
194
|
-
}
|
|
195
|
-
// this.luksClose()
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
*
|
|
199
|
-
*/
|
|
200
|
-
async luksOpen() {
|
|
201
|
-
if (!fs_1.default.existsSync(this.luksDevice)) {
|
|
202
|
-
// Utils.warning(`LUKS open volume: ${this.luksName}`)
|
|
203
|
-
await (0, utils_2.exec)(`cryptsetup luksOpen --type luks2 ${this.luksFile} ${this.luksName}`, utils_1.default.setEcho(true));
|
|
151
|
+
async run() {
|
|
152
|
+
Utils.titles(this.id + ' ' + this.argv);
|
|
153
|
+
const { flags } = await this.parse(Syncto);
|
|
154
|
+
if (flags.verbose) {
|
|
155
|
+
this.verbose = true;
|
|
204
156
|
}
|
|
205
|
-
|
|
206
|
-
|
|
157
|
+
this.echo = Utils.setEcho(this.verbose);
|
|
158
|
+
let fileLuks = '';
|
|
159
|
+
if (flags.file) {
|
|
160
|
+
fileLuks = flags.file;
|
|
207
161
|
}
|
|
208
|
-
if (
|
|
209
|
-
|
|
162
|
+
if (flags.excludes) {
|
|
163
|
+
this.exclude = true;
|
|
210
164
|
}
|
|
211
|
-
if (
|
|
212
|
-
|
|
213
|
-
await (0, utils_2.exec)(`mount ${this.luksDevice} ${this.luksMountpoint}`, this.echo);
|
|
165
|
+
if (Utils.isRoot()) {
|
|
166
|
+
await this.luksCreate();
|
|
214
167
|
}
|
|
215
168
|
else {
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
*
|
|
221
|
-
*/
|
|
222
|
-
async luksClose() {
|
|
223
|
-
if (utils_1.default.isMountpoint(this.luksMountpoint)) {
|
|
224
|
-
await (0, utils_2.exec)(`umount ${this.luksMountpoint}`, this.echo);
|
|
225
|
-
}
|
|
226
|
-
if (fs_1.default.existsSync(this.luksDevice)) {
|
|
227
|
-
utils_1.default.warning(`LUKS close volume: ${this.luksName}`);
|
|
228
|
-
await (0, utils_2.exec)(`cryptsetup luksClose ${this.luksName}`, this.echo);
|
|
169
|
+
Utils.useRoot(this.id);
|
|
229
170
|
}
|
|
230
171
|
}
|
|
231
172
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
Syncto.examples = [
|
|
240
|
-
'sudo eggs syncto',
|
|
241
|
-
'sudo eggs syncto --file /path/to/fileLUKS',
|
|
242
|
-
];
|
|
243
|
-
exports.default = Syncto;
|
|
173
|
+
/**
|
|
174
|
+
* Convert bytes to gigabytes
|
|
175
|
+
*/
|
|
176
|
+
function bytesToGB(bytes) {
|
|
177
|
+
const gigabytes = bytes / 1_073_741_824;
|
|
178
|
+
return gigabytes.toFixed(2) + ' GB';
|
|
179
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ./src/commands/tools/clean.ts
|
|
3
|
+
* penguins-eggs v.10.0.0 / ecmascript 2020
|
|
4
|
+
* author: Piero Proietti
|
|
5
|
+
* email: piero.proietti@gmail.com
|
|
6
|
+
* license: MIT
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from '@oclif/core';
|
|
9
|
+
export default class Clean extends Command {
|
|
10
|
+
static description: string;
|
|
11
|
+
static examples: string[];
|
|
12
|
+
static flags: {
|
|
13
|
+
help: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<void>;
|
|
14
|
+
nointeractive: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
15
|
+
verbose: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
16
|
+
};
|
|
17
|
+
run(): Promise<void>;
|
|
18
|
+
}
|
|
@@ -1,43 +1,39 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
1
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* ./src/commands/tools/clean.ts
|
|
3
|
+
* penguins-eggs v.10.0.0 / ecmascript 2020
|
|
7
4
|
* author: Piero Proietti
|
|
8
5
|
* email: piero.proietti@gmail.com
|
|
9
6
|
* license: MIT
|
|
10
7
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Clean extends
|
|
8
|
+
import { Command, Flags } from '@oclif/core';
|
|
9
|
+
import Bleach from '../../classes/bleach.js';
|
|
10
|
+
import Utils from '../../classes/utils.js';
|
|
11
|
+
export default class Clean extends Command {
|
|
12
|
+
static description = 'clean system log, apt, etc';
|
|
13
|
+
static examples = [
|
|
14
|
+
'sudo eggs tools clean',
|
|
15
|
+
];
|
|
16
|
+
static flags = {
|
|
17
|
+
help: Flags.help({ char: 'h' }),
|
|
18
|
+
nointeractive: Flags.boolean({ char: 'n', description: 'no user interaction' }),
|
|
19
|
+
verbose: Flags.boolean({ char: 'v', description: 'verbose' }),
|
|
20
|
+
};
|
|
15
21
|
async run() {
|
|
16
22
|
const { flags } = await this.parse(Clean);
|
|
17
|
-
|
|
23
|
+
Utils.titles(this.id + ' ' + this.argv);
|
|
18
24
|
let verbose = false;
|
|
19
25
|
if (flags.verbose) {
|
|
20
26
|
verbose = true;
|
|
21
27
|
}
|
|
22
|
-
const nointeractive = flags
|
|
23
|
-
if (
|
|
24
|
-
if (nointeractive || await
|
|
25
|
-
const bleach = new
|
|
28
|
+
const { nointeractive } = flags;
|
|
29
|
+
if (Utils.isRoot()) {
|
|
30
|
+
if (nointeractive || await Utils.customConfirm('Select yes to continue...')) {
|
|
31
|
+
const bleach = new Bleach();
|
|
26
32
|
bleach.clean(verbose);
|
|
27
33
|
}
|
|
28
34
|
}
|
|
29
35
|
else {
|
|
30
|
-
|
|
36
|
+
Utils.useRoot(this.id);
|
|
31
37
|
}
|
|
32
38
|
}
|
|
33
39
|
}
|
|
34
|
-
Clean.flags = {
|
|
35
|
-
help: core_1.Flags.help({ char: 'h' }),
|
|
36
|
-
nointeractive: core_1.Flags.boolean({ char: 'n', description: 'no user interaction' }),
|
|
37
|
-
verbose: core_1.Flags.boolean({ char: 'v', description: 'verbose' }),
|
|
38
|
-
};
|
|
39
|
-
Clean.description = 'clean system log, apt, etc';
|
|
40
|
-
Clean.examples = [
|
|
41
|
-
'sudo eggs tools clean',
|
|
42
|
-
];
|
|
43
|
-
exports.default = Clean;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ./src/commands/tools/ppa.ts
|
|
3
|
+
* penguins-eggs v.10.0.0 / ecmascript 2020
|
|
4
|
+
* author: Piero Proietti
|
|
5
|
+
* email: piero.proietti@gmail.com
|
|
6
|
+
* license: MIT
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from '@oclif/core';
|
|
9
|
+
/**
|
|
10
|
+
*
|
|
11
|
+
*/
|
|
12
|
+
export default class Ppa extends Command {
|
|
13
|
+
static description: string;
|
|
14
|
+
static examples: string[];
|
|
15
|
+
static flags: {
|
|
16
|
+
add: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
17
|
+
help: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<void>;
|
|
18
|
+
nointeractive: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
19
|
+
remove: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
20
|
+
verbose: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
*/
|
|
25
|
+
run(): Promise<void>;
|
|
26
|
+
}
|