penguins-eggs 25.10.6 → 25.10.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/.oclif.manifest.json +51 -145
  2. package/README.md +3 -829
  3. package/addons/eggs/theme/livecd/isolinux.main.simple.cfg +3 -3
  4. package/conf/distros/trixie/calamares/modules/shellprocess@boot_deploy.yml +3 -4
  5. package/conf/love.yaml +1 -1
  6. package/dist/classes/distro.js +9 -2
  7. package/dist/classes/diversions.d.ts +1 -1
  8. package/dist/classes/diversions.js +27 -8
  9. package/dist/classes/incubation/incubator.d/archlinux.js +1 -0
  10. package/dist/classes/incubation/incubator.d/trixie.js +7 -10
  11. package/dist/classes/ovary.d/edit-live-fs.d.ts +1 -1
  12. package/dist/classes/ovary.d/edit-live-fs.js +1 -7
  13. package/dist/classes/ovary.d/fertilization.js +1 -0
  14. package/dist/classes/ovary.d/finished.js +1 -5
  15. package/dist/classes/ovary.d/initrd.d.ts +1 -1
  16. package/dist/classes/ovary.d/initrd.js +17 -19
  17. package/dist/classes/ovary.d/live-create-structure.js +1 -4
  18. package/dist/classes/ovary.d/luks-get-password.d.ts +12 -0
  19. package/dist/classes/ovary.d/luks-get-password.js +57 -0
  20. package/dist/classes/ovary.d/luks-home-support.d.ts +12 -0
  21. package/dist/classes/ovary.d/luks-home-support.js +75 -0
  22. package/dist/classes/ovary.d/luks-home.d.ts +15 -0
  23. package/dist/classes/ovary.d/luks-home.js +140 -0
  24. package/dist/classes/ovary.d/luks-root-bootstrap-builder.d.ts +11 -0
  25. package/dist/classes/ovary.d/luks-root-bootstrap-builder.js +45 -0
  26. package/dist/classes/ovary.d/luks-root.d.ts +15 -0
  27. package/dist/classes/ovary.d/luks-root.js +126 -0
  28. package/dist/classes/ovary.d/make-efi.js +1 -1
  29. package/dist/classes/ovary.d/make-squashfs.d.ts +1 -1
  30. package/dist/classes/ovary.d/make-squashfs.js +7 -3
  31. package/dist/classes/ovary.d/produce.d.ts +3 -3
  32. package/dist/classes/ovary.d/produce.js +76 -48
  33. package/dist/classes/ovary.d/syslinux.js +1 -1
  34. package/dist/classes/ovary.d/xorriso-command.d.ts +2 -2
  35. package/dist/classes/ovary.d/xorriso-command.js +27 -29
  36. package/dist/classes/ovary.d.ts +35 -16
  37. package/dist/classes/ovary.js +42 -16
  38. package/dist/classes/utils.d.ts +1 -0
  39. package/dist/classes/utils.js +3 -0
  40. package/dist/commands/config.d.ts +1 -1
  41. package/dist/commands/config.js +2 -2
  42. package/dist/commands/love.d.ts +3 -0
  43. package/dist/commands/love.js +40 -2
  44. package/dist/commands/produce.d.ts +3 -2
  45. package/dist/commands/produce.js +14 -17
  46. package/dist/commands/tools/{ppa.d.ts → repo.d.ts} +2 -2
  47. package/dist/commands/tools/{ppa.js → repo.js} +69 -67
  48. package/dracut/create-symlink +71 -0
  49. package/dracut/dracut-log.txt +3 -0
  50. package/dracut/dracut.conf.d/50-live.conf +24 -6
  51. package/dracut/dracut.conf.d/README.md +10 -0
  52. package/dracut/export +4 -0
  53. package/dracut/export-dracut-analysis +51 -0
  54. package/dracut/export-dracut-log +2 -0
  55. package/dracut/mkisofs +10 -0
  56. package/dracut/modules.d/00debug-shell/debug-hook.sh +13 -0
  57. package/dracut/modules.d/00debug-shell/module-setup.sh +20 -0
  58. package/dracut/modules.d/90block/README.md +7 -0
  59. package/dracut/modules.d/90block/block-cmdline.sh +3 -0
  60. package/dracut/modules.d/90block/module-setup.sh +15 -0
  61. package/dracut/modules.d/95iso-scan/README.md +3 -0
  62. package/dracut/modules.d/95iso-scan/iso-scan-fallback.sh +12 -0
  63. package/dracut/modules.d/95iso-scan/iso-scan.sh +92 -0
  64. package/dracut/modules.d/95iso-scan/module-setup.sh +18 -0
  65. package/dracut/modules.d/95luks-loop/README.md +9 -0
  66. package/dracut/modules.d/95luks-loop/luks-loop.sh +90 -0
  67. package/dracut/modules.d/95luks-loop/module-setup.sh +17 -0
  68. package/dracut/renew-initramfs +17 -0
  69. package/dracut/sbin2bin +10 -0
  70. package/dracut/update-dracut-conf-d +2 -0
  71. package/dracut/update-dracut-modules +62 -0
  72. package/manpages/doc/man/eggs.1.gz +0 -0
  73. package/manpages/doc/man/eggs.html +7 -661
  74. package/package.json +9 -8
  75. package/perrisbrewery/template/dependencies.yaml +6 -5
  76. package/scripts/_eggs +16 -31
  77. package/scripts/eggs.bash +4 -6
  78. package/scripts/luks-root-bootstrap-create.sh +235 -0
  79. package/scripts/luks-root-unlock.sh +172 -0
  80. package/scripts/mount-encrypted-home.sh +223 -0
  81. package/dist/commands/syncfrom.d.ts +0 -45
  82. package/dist/commands/syncfrom.js +0 -152
  83. package/dist/commands/syncto.d.ts +0 -40
  84. package/dist/commands/syncto.js +0 -175
package/package.json CHANGED
@@ -2,17 +2,17 @@
2
2
  "name": "penguins-eggs",
3
3
  "shortName": "eggs",
4
4
  "description": "A remaster system tool, compatible with Arch, Debian, Devuan, Ubuntu and others",
5
- "version": "25.10.6",
5
+ "version": "25.10.19",
6
6
  "author": "Piero Proietti",
7
7
  "bin": {
8
8
  "eggs": "./bin/run.js"
9
9
  },
10
10
  "bugs": "https://github.com/pieroproietti/penguins-eggs/issues",
11
11
  "dependencies": {
12
- "@oclif/core": "^4.5.3",
13
- "@oclif/plugin-autocomplete": "^3.2.34",
12
+ "@oclif/core": "^4.5.6",
13
+ "@oclif/plugin-autocomplete": "^3.2.37",
14
14
  "@oclif/plugin-help": "^6.2.33",
15
- "@oclif/plugin-version": "^2.2.33",
15
+ "@oclif/plugin-version": "^2.2.34",
16
16
  "@types/express": "^5.0.3",
17
17
  "ansis": "^4.2.0",
18
18
  "axios": "^1.12.2",
@@ -23,7 +23,7 @@
23
23
  "ink": "^5",
24
24
  "ink-progress-bar": "^3.0.0",
25
25
  "ink-spinner": "^5.0.0",
26
- "inquirer": "^12.9.6",
26
+ "inquirer": "^12.10.0",
27
27
  "js-yaml": "^4.1.0",
28
28
  "mustache": "^4.2.0",
29
29
  "netmask": "^2.0.2",
@@ -51,12 +51,12 @@
51
51
  "@types/shelljs": "^0.8.17",
52
52
  "@types/ws": "^8.18.1",
53
53
  "chai": "^6.2.0",
54
- "eslint": "^9.37.0",
55
- "eslint-config-oclif": "^6.0.108",
54
+ "eslint": "^9.38.0",
55
+ "eslint-config-oclif": "^6.0.110",
56
56
  "eslint-config-prettier": "^10.1.8",
57
57
  "glob": "^11.0.3",
58
58
  "mocha": "^11.7.4",
59
- "oclif": "^4.22.29",
59
+ "oclif": "^4.22.32",
60
60
  "perrisbrewery": "^25.9.16",
61
61
  "prettier": "^3.6.2",
62
62
  "shx": "^0.4.0",
@@ -76,6 +76,7 @@
76
76
  "/dist",
77
77
  "/dracut",
78
78
  "/eui",
79
+ "/initramfs-tools",
79
80
  "/manpages",
80
81
  "/mkinitcpio",
81
82
  "/mkinitfs",
@@ -5,6 +5,7 @@
5
5
  common:
6
6
  - coreutils
7
7
  - cryptsetup
8
+ - cryptsetup-bin
8
9
  - cryptsetup-initramfs
9
10
  - curl # wardrobe
10
11
  - dbus-bin | uuidgen-runtime # uuid-runtime per devuan
@@ -13,11 +14,11 @@ common:
13
14
  - git # wardrobe
14
15
  - gpg # eggs
15
16
  - jq # mom
16
- - live-boot # eggs
17
- - live-boot-doc # eggs
18
- - live-boot-initramfs-tools # eggs
19
- - live-config-systemd | live-config-sysvinit
20
- - live-tools # eggs
17
+ - live-boot | dracut
18
+ - live-boot-doc | dracut
19
+ - live-boot-initramfs-tools | dracut
20
+ - live-config-systemd | live-config-sysvinit | dracut
21
+ - live-tools | dracut-live
21
22
  - lvm2 # pvdisplay in krill
22
23
  - nodejs (>= 18)
23
24
  - parted
package/scripts/_eggs CHANGED
@@ -59,7 +59,7 @@ _eggs_tools() {
59
59
  cmds)
60
60
  _values "completions" \
61
61
  "clean[clean system log, apt, etc]" \
62
- "ppa[add/remove repo]" \
62
+ "repo[add/remove penguins-eggs-repo]" \
63
63
  "skel[update skel from home configuration]" \
64
64
  "stat[get statistics from sourceforge]" \
65
65
  "yolk[configure eggs to install without internet]" \
@@ -75,12 +75,12 @@ _values "completions" \
75
75
  --help"[Show help for command]" \
76
76
  "*: :_files"
77
77
  ;;
78
- "ppa")
78
+ "repo")
79
79
  _arguments -S \
80
- "(-a --add)"{-a,--add}"[add penguins-eggs PPA repository]" \
80
+ "(-a --add)"{-a,--add}"[add penguins-eggs-repo]" \
81
81
  "(-h --help)"{-h,--help}"[Show CLI help.]" \
82
82
  "(-n --nointeractive)"{-n,--nointeractive}"[no user interaction]" \
83
- "(-r --remove)"{-r,--remove}"[remove penguins-eggs PPA repository]" \
83
+ "(-r --remove)"{-r,--remove}"[remove penguins-eggs-repo]" \
84
84
  "(-v --verbose)"{-v,--verbose}"[verbose]" \
85
85
  --help"[Show help for command]" \
86
86
  "*: :_files"
@@ -198,11 +198,9 @@ _eggs() {
198
198
  "pods[eggs pods: build ISOs from containers]" \
199
199
  "produce[produce a live image from your system whithout your data]" \
200
200
  "status[informations about eggs status]" \
201
- "syncfrom[restore users and user data from a LUKS volumes]" \
202
- "syncto[Save users and users' data ENCRYPTED]" \
203
201
  "update[update the Penguins' eggs tool]" \
204
- "help[Display help for eggs.]" \
205
202
  "autocomplete[Display autocomplete installation instructions.]" \
203
+ "help[Display help for eggs.]" \
206
204
  "version[]" \
207
205
 
208
206
  ;;
@@ -320,6 +318,9 @@ _arguments -S \
320
318
  "(-h --help)"{-h,--help}"[Show CLI help.]" \
321
319
  "(-v --verbose)"{-v,--verbose}"[]" \
322
320
  "(-n --nointeractive)"{-n,--nointeractive}"[no user interaction]" \
321
+ "(-c --clone)"{-c,--clone}"[clone (uncrypted)]" \
322
+ "(-k --homecrypt)"{-k,--homecrypt}"[clone crypted home]" \
323
+ "(-f --fullcrypt)"{-f,--fullcrypt}"[clone crypted full]" \
323
324
  --help"[Show help for command]" \
324
325
  "*: :_files" ;;
325
326
  mom)
@@ -336,11 +337,12 @@ produce)
336
337
  _arguments -S \
337
338
  "*"--addons"[addons to be used: adapt, pve, rsupport]:file:_files" \
338
339
  --basename"[basename]:file:_files" \
339
- "(-c --clone)"{-c,--clone}"[clone]" \
340
- "(-C --cryptedclone)"{-C,--cryptedclone}"[crypted clone]" \
340
+ "(-c --clone)"{-c,--clone}"[clone (uncrypted)]" \
341
+ "(-k --homecrypt)"{-k,--homecrypt}"[clone crypted home]" \
342
+ "(-f --fullcrypt)"{-f,--fullcrypt}"[clone crypted full]" \
341
343
  "*"--excludes"[use: static, homes, home]:file:_files" \
342
344
  "(-h --help)"{-h,--help}"[Show CLI help.]" \
343
- "(-k --kernel)"{-k,--kernel}"[kernel version]:file:_files" \
345
+ "(-K --kernel)"{-K,--kernel}"[kernel version]:file:_files" \
344
346
  "*"--links"[desktop links]:file:_files" \
345
347
  "(-m --max)"{-m,--max}"[max compression: xz -Xbcj ...]" \
346
348
  "(-N --noicon)"{-N,--noicon}"[no icon eggs on desktop]" \
@@ -351,7 +353,7 @@ _arguments -S \
351
353
  "(-s --script)"{-s,--script}"[script mode. Generate scripts to manage iso build]" \
352
354
  "(-S --standard)"{-S,--standard}"[standard compression: xz -b 1M]" \
353
355
  --theme"[theme for livecd, calamares branding and partitions]:file:_files" \
354
- "(-u --unsecure)"{-u,--unsecure}"[/root contents are included on live]" \
356
+ "(-i --includeRoot)"{-i,--includeRoot}"[folder /root is included on live]" \
355
357
  "(-v --verbose)"{-v,--verbose}"[verbose]" \
356
358
  "(-y --yolk)"{-y,--yolk}"[force yolk renew]" \
357
359
  --help"[Show help for command]" \
@@ -362,27 +364,15 @@ _arguments -S \
362
364
  "(-v --verbose)"{-v,--verbose}"[]" \
363
365
  --help"[Show help for command]" \
364
366
  "*: :_files" ;;
365
- syncfrom)
366
- _arguments -S \
367
- --delete"[rsync --delete delete extraneous files from dest dirs]:file:_files" \
368
- "(-f --file)"{-f,--file}"[file containing luks-volume encrypted]:file:_files" \
369
- "(-h --help)"{-h,--help}"[Show CLI help.]" \
370
- "(-r --rootdir)"{-r,--rootdir}"[rootdir of the installed system, when used from live]:file:_files" \
371
- "(-v --verbose)"{-v,--verbose}"[verbose]" \
372
- --help"[Show help for command]" \
373
- "*: :_files" ;;
374
- syncto)
367
+ update)
375
368
  _arguments -S \
376
- "(-e --excludes)"{-e,--excludes}"[use: exclude.list.d/home.list]" \
377
- "(-f --file)"{-f,--file}"[file luks-volume encrypted]:file:_files" \
378
369
  "(-h --help)"{-h,--help}"[Show CLI help.]" \
379
370
  "(-v --verbose)"{-v,--verbose}"[verbose]" \
380
371
  --help"[Show help for command]" \
381
372
  "*: :_files" ;;
382
- update)
373
+ autocomplete)
383
374
  _arguments -S \
384
- "(-h --help)"{-h,--help}"[Show CLI help.]" \
385
- "(-v --verbose)"{-v,--verbose}"[verbose]" \
375
+ "(-r --refresh-cache)"{-r,--refresh-cache}"[Refresh cache (ignores displaying instructions)]" \
386
376
  --help"[Show help for command]" \
387
377
  "*: :_files" ;;
388
378
  help)
@@ -390,11 +380,6 @@ _arguments -S \
390
380
  "(-n --nested-commands)"{-n,--nested-commands}"[Include all nested commands in the output.]" \
391
381
  --help"[Show help for command]" \
392
382
  "*: :_files" ;;
393
- autocomplete)
394
- _arguments -S \
395
- "(-r --refresh-cache)"{-r,--refresh-cache}"[Refresh cache (ignores displaying instructions)]" \
396
- --help"[Show help for command]" \
397
- "*: :_files" ;;
398
383
  version)
399
384
  _arguments -S \
400
385
  --json"[Format output as json.]" \
package/scripts/eggs.bash CHANGED
@@ -23,15 +23,13 @@ export:tarballs --clean --help --verbose
23
23
  install --btrfs --chroot --crypted --domain --halt --help --ip --nointeractive --none --pve --random --replace --small --suspend --testing --unattended --verbose
24
24
  krill --btrfs --chroot --crypted --domain --halt --help --ip --nointeractive --none --pve --random --replace --small --suspend --testing --unattended --verbose
25
25
  kill --help --isos --nointeractive --verbose
26
- love --help --verbose --nointeractive
26
+ love --help --verbose --nointeractive --clone --homecrypt --fullcrypt
27
27
  mom --help
28
28
  pods --help
29
- produce --addons --basename --clone --cryptedclone --excludes --help --kernel --links --max --noicon --nointeractive --pendrive --prefix --release --script --standard --theme --unsecure --verbose --yolk
29
+ produce --addons --basename --clone --homecrypt --fullcrypt --excludes --help --kernel --links --max --noicon --nointeractive --pendrive --prefix --release --script --standard --theme --includeRoot --verbose --yolk
30
30
  status --help --verbose
31
- syncfrom --delete --file --help --rootdir --verbose
32
- syncto --excludes --file --help --verbose
33
31
  tools:clean --help --nointeractive --verbose
34
- tools:ppa --add --help --nointeractive --remove --verbose
32
+ tools:repo --add --help --nointeractive --remove --verbose
35
33
  tools:skel --help --user --verbose
36
34
  tools:stat --help --month --year
37
35
  tools:yolk --help --verbose
@@ -40,8 +38,8 @@ wardrobe:get --help --verbose
40
38
  wardrobe:list --distro --help --verbose
41
39
  wardrobe:show --help --json --verbose --wardrobe
42
40
  wardrobe:wear --help --no_accessories --no_firmwares --verbose --wardrobe
43
- help --nested-commands
44
41
  autocomplete --refresh-cache
42
+ help --nested-commands
45
43
  version --json --verbose
46
44
  "
47
45
 
@@ -0,0 +1,235 @@
1
+ #!/bin/bash
2
+ # luks-root-bootstrap-create.sh
3
+ # Crea un filesystem.squashfs Debian completo per bootstrap
4
+ set -e
5
+
6
+ OUTPUT_SQUASHFS="$1"
7
+ UNLOCK_SCRIPT="$2"
8
+
9
+ # Usa /root per avere sicuramente spazio
10
+ WORK_DIR="/root/bootstrap-filesystem-$$"
11
+
12
+ if [ -z "$OUTPUT_SQUASHFS" ] || [ -z "$UNLOCK_SCRIPT" ]; then
13
+ echo "Usage: $0 <output.squashfs> <unlock-script.sh>"
14
+ exit 1
15
+ fi
16
+
17
+ if [ ! -f "$UNLOCK_SCRIPT" ]; then
18
+ echo "Error: Unlock script not found: $UNLOCK_SCRIPT"
19
+ exit 1
20
+ fi
21
+
22
+ BUILD_SUCCESS=0
23
+
24
+
25
+ echo "=========================================="
26
+ echo " Creating Bootstrap Filesystem"
27
+ echo "=========================================="
28
+ echo ""
29
+ echo "Output: $OUTPUT_SQUASHFS"
30
+ echo "Work dir: $WORK_DIR"
31
+ echo ""
32
+
33
+ # Cleanup function
34
+ cleanup() {
35
+ if [ -d "$WORK_DIR" ]; then
36
+ echo "Cleaning up work directory..."
37
+ umount "$WORK_DIR/proc" 2>/dev/null || true
38
+ umount "$WORK_DIR/sys" 2>/dev/null || true
39
+ umount "$WORK_DIR/dev/pts" 2>/dev/null || true
40
+ umount "$WORK_DIR/dev" 2>/dev/null || true
41
+
42
+ if [ $BUILD_SUCCESS -eq 1 ]; then
43
+ rm -rf "$WORK_DIR"
44
+ echo "Work directory cleaned"
45
+ else
46
+ echo "Work directory preserved for debugging: $WORK_DIR"
47
+ fi
48
+ fi
49
+ }
50
+ trap cleanup EXIT
51
+
52
+ # Crea directory di lavoro
53
+ mkdir -p "$WORK_DIR"
54
+
55
+ # 1. Debootstrap - CON kmod e bash-completion
56
+ echo "Step 1/6: Running debootstrap (this takes 5-10 minutes)..."
57
+ debootstrap \
58
+ --variant=minbase \
59
+ --include=systemd,systemd-sysv,cryptsetup,kmod,bash-completion,nano,less,vim-tiny \
60
+ trixie \
61
+ "$WORK_DIR" \
62
+ http://deb.debian.org/debian
63
+
64
+ echo "✓ Debootstrap completed"
65
+
66
+ # 1.5. Copia moduli kernel
67
+ echo ""
68
+ echo "Step 1.5/6: Copying kernel modules..."
69
+
70
+ KERNEL_VERSION=$(uname -r)
71
+
72
+ if [ -d "/lib/modules/$KERNEL_VERSION" ]; then
73
+ echo "Copying kernel modules for $KERNEL_VERSION..."
74
+
75
+ # Assicurati che la directory esista
76
+ mkdir -p "$WORK_DIR/lib/modules"
77
+
78
+ # Copia TUTTO il kernel
79
+ cp -a "/lib/modules/$KERNEL_VERSION" "$WORK_DIR/lib/modules/"
80
+
81
+ # Verifica che sia stato copiato
82
+ if [ -d "$WORK_DIR/lib/modules/$KERNEL_VERSION" ]; then
83
+ echo "✓ Kernel modules copied for $KERNEL_VERSION"
84
+ echo " Module directory size: $(du -sh "$WORK_DIR/lib/modules/$KERNEL_VERSION" | cut -f1)"
85
+ else
86
+ echo "ERROR: Failed to copy kernel modules!"
87
+ exit 1
88
+ fi
89
+ else
90
+ echo "ERROR: Kernel modules not found at /lib/modules/$KERNEL_VERSION"
91
+ exit 1
92
+ fi
93
+
94
+ # 2. Configura sistema base
95
+ echo ""
96
+ echo "Step 2/6: Configuring base system..."
97
+
98
+ echo "bootstrap" > "$WORK_DIR/etc/hostname"
99
+
100
+ cat > "$WORK_DIR/etc/hosts" <<EOF
101
+ 127.0.0.1 localhost
102
+ 127.0.1.1 bootstrap
103
+
104
+ ::1 localhost ip6-localhost ip6-loopback
105
+ ff02::1 ip6-allnodes
106
+ ff02::2 ip6-allrouters
107
+ EOF
108
+
109
+ cat > "$WORK_DIR/etc/fstab" <<EOF
110
+ # Bootstrap filesystem - no persistent mounts
111
+ EOF
112
+
113
+ echo "root:evolution" | chroot "$WORK_DIR" chpasswd
114
+
115
+ # Abilita bash-completion per root
116
+ cat >> "$WORK_DIR/root/.bashrc" <<'EOF'
117
+
118
+ # Enable bash completion
119
+ if [ -f /usr/share/bash-completion/bash_completion ]; then
120
+ . /usr/share/bash-completion/bash_completion
121
+ elif [ -f /etc/bash_completion ]; then
122
+ . /etc/bash_completion
123
+ fi
124
+
125
+ # Useful aliases
126
+ alias ll='ls -lah'
127
+ alias l='ls -lh'
128
+ EOF
129
+
130
+ cat > "$WORK_DIR/etc/motd" <<EOF
131
+
132
+ ╔════════════════════════════════════════╗
133
+ ║ Bootstrap System - Debug Shell ║
134
+ ╚════════════════════════════════════════╝
135
+
136
+ This is the bootstrap environment for unlocking
137
+ the encrypted root filesystem.
138
+
139
+ Root credentials:
140
+ Username: root
141
+ Password: evolution
142
+
143
+ Manual unlock command:
144
+ unlock-encrypted-root
145
+
146
+ EOF
147
+
148
+ echo "✓ Base system configured (root password: evolution)"
149
+
150
+ # 3. Copia script di unlock
151
+ echo ""
152
+ echo "Step 3/6: Installing unlock script..."
153
+ mkdir -p "$WORK_DIR/usr/local/bin"
154
+ cp "$UNLOCK_SCRIPT" "$WORK_DIR/usr/local/bin/unlock-encrypted-root"
155
+ chmod 755 "$WORK_DIR/usr/local/bin/unlock-encrypted-root"
156
+ echo "✓ Unlock script installed at /usr/local/bin/unlock-encrypted-root"
157
+
158
+ # 4. Fix console getty per stabilità
159
+ echo ""
160
+ echo "Step 4/6: Configuring stable console..."
161
+
162
+ mkdir -p "$WORK_DIR/etc/systemd/system/getty@tty1.service.d"
163
+ cat > "$WORK_DIR/etc/systemd/system/getty@tty1.service.d/noclear.conf" <<EOF
164
+ [Service]
165
+ # Mantieni la console pulita e stabile
166
+ TTYVTDisallocate=no
167
+ EOF
168
+
169
+ echo "✓ Console configuration applied"
170
+
171
+ # 5. Cleanup per ridurre dimensioni (ma NON i moduli kernel!)
172
+ echo ""
173
+ echo "Step 5/6: Cleaning up to reduce size..."
174
+ rm -rf "$WORK_DIR/var/cache/apt/archives/"*
175
+ rm -rf "$WORK_DIR/var/lib/apt/lists/"*
176
+ rm -rf "$WORK_DIR/tmp/"*
177
+ rm -rf "$WORK_DIR/var/tmp/"*
178
+ rm -rf "$WORK_DIR/usr/share/doc/"*
179
+ rm -rf "$WORK_DIR/usr/share/man/"*
180
+ rm -rf "$WORK_DIR/usr/share/info/"*
181
+
182
+ # NON cancellare tutte le locale, lascia en_US per bash-completion
183
+ rm -rf "$WORK_DIR/usr/share/locale/"[!e]*
184
+ rm -rf "$WORK_DIR/usr/share/locale/en_"[!U]*
185
+
186
+ echo "✓ Cleanup completed"
187
+
188
+ # 6. Crea squashfs
189
+ echo ""
190
+ echo "Step 6/6: Creating squashfs (this takes 2-3 minutes)..."
191
+
192
+ if [ ! -d "$WORK_DIR" ]; then
193
+ echo "ERROR: Work directory disappeared!"
194
+ exit 1
195
+ fi
196
+
197
+ if [ -f "$OUTPUT_SQUASHFS" ]; then
198
+ rm -f "$OUTPUT_SQUASHFS"
199
+ fi
200
+
201
+ mksquashfs "$WORK_DIR" "$OUTPUT_SQUASHFS" \
202
+ -comp zstd \
203
+ -b 1M \
204
+ -noappend
205
+
206
+ if [ ! -f "$OUTPUT_SQUASHFS" ]; then
207
+ echo "ERROR: Failed to create squashfs file"
208
+ exit 1
209
+ fi
210
+
211
+ SIZE_MB=$(du -m "$OUTPUT_SQUASHFS" | cut -f1)
212
+
213
+ echo ""
214
+ echo "=========================================="
215
+ echo "✓ Bootstrap filesystem created!"
216
+ echo "=========================================="
217
+ echo ""
218
+ echo " File: $OUTPUT_SQUASHFS"
219
+ echo " Size: ${SIZE_MB} MB"
220
+ echo ""
221
+ echo "Features:"
222
+ echo " - Minimal Debian system with systemd"
223
+ echo " - Kernel modules included (dm_mod, dm_crypt)"
224
+ echo " - kmod (modprobe, lsmod, etc.)"
225
+ echo " - bash-completion enabled"
226
+ echo " - Stable console"
227
+ echo " - Manual unlock at /usr/local/bin/unlock-encrypted-root"
228
+ echo ""
229
+ echo "Usage:"
230
+ echo " 1. Boot the system"
231
+ echo " 2. Login as root (password: evolution)"
232
+ echo " 3. Run: unlock-encrypted-root"
233
+ echo ""
234
+
235
+ BUILD_SUCCESS=1
@@ -0,0 +1,172 @@
1
+ #!/bin/bash
2
+ # luks-root-unlock.sh
3
+ # Versione Chroot: Monta l'ISO (ro), l'ext4 (ro), lo squashfs (ro)
4
+ # e crea un overlay scrivibile in RAM.
5
+
6
+ set -e
7
+
8
+ echo ""
9
+ echo "=========================================="
10
+ echo " Encrypted Root Unlock (CHROOT MODE)"
11
+ echo "=========================================="
12
+ echo ""
13
+
14
+ # Crea mountpoint
15
+ mkdir -p /mnt/live-media
16
+ mkdir -p /mnt/root-img
17
+ mkdir -p /mnt/real-root
18
+ mkdir -p /newroot
19
+
20
+ # Trova live media
21
+ echo "Searching for live media..."
22
+ FOUND=0
23
+ for dev in /dev/sr* /dev/sd* /dev/vd* /dev/nvme*n*;
24
+ do
25
+ [ -b "$dev" ] || continue
26
+ echo " Trying $dev..."
27
+ if mount -o ro "$dev" /mnt/live-media 2>/dev/null;
28
+ then
29
+ if [ -f /mnt/live-media/live/root.img ];
30
+ then
31
+ echo " ✓ Found live media on $dev"
32
+ FOUND=1
33
+ break
34
+ fi
35
+ umount /mnt/live-media 2>/dev/null
36
+ fi
37
+ done
38
+
39
+ if [ $FOUND -eq 0 ]; then
40
+ echo ""
41
+ echo "✗ ERROR: Could not find live media"
42
+ lsblk
43
+ echo "Dropping to emergency shell..."
44
+ exec /bin/bash
45
+ fi
46
+
47
+ # Usa il root.img originale dall'ISO (read-only)
48
+ ROOT_IMG="/mnt/live-media/live/root.img"
49
+
50
+ # Verifica LUKS
51
+ if ! cryptsetup isLuks "$ROOT_IMG"; then
52
+ echo "✗ ERROR: root.img is not a LUKS volume"
53
+ file "$ROOT_IMG"
54
+ exec /bin/bash
55
+ fi
56
+
57
+ # Unlock
58
+ echo ""
59
+ echo "Found encrypted root.img"
60
+ MAX_ATTEMPTS=3
61
+ for attempt in $(seq 1 $MAX_ATTEMPTS);
62
+ do
63
+ echo "Enter passphrase to unlock (attempt $attempt of $MAX_ATTEMPTS):"
64
+ if cryptsetup open "$ROOT_IMG" live-root;
65
+ then
66
+ echo ""
67
+ echo "✓ Unlocked successfully!"
68
+ break
69
+ fi
70
+ if [ $attempt -eq $MAX_ATTEMPTS ];
71
+ then
72
+ echo ""
73
+ echo "✗ Failed after $MAX_ATTEMPTS attempts"
74
+ echo "Dropping to shell..."
75
+ exec /bin/bash
76
+ fi
77
+ echo "✗ Wrong passphrase, try again..."
78
+ echo ""
79
+ done
80
+
81
+ # Mount decrypted volume (RO)
82
+ # Il messaggio "skipping orphan cleanup" apparirà, ma è innocuo.
83
+ echo ""
84
+ echo "Mounting decrypted volume (ro)..."
85
+ if ! mount -t ext4 -o ro /dev/mapper/live-root /mnt/root-img; then
86
+ echo "✗ ERROR: Failed to mount decrypted volume (ro)"
87
+ cryptsetup close live-root
88
+ exec /bin/bash
89
+ fi
90
+
91
+ # Mount real filesystem
92
+ echo "Mounting real filesystem (ro)..."
93
+ if ! mount -t squashfs -o ro,loop /mnt/root-img/filesystem.squashfs /mnt/real-root; then
94
+ echo "✗ ERROR: Failed to mount real filesystem"
95
+ umount /mnt/root-img
96
+ cryptsetup close live-root
97
+ exec /bin/bash
98
+ fi
99
+
100
+ # Create overlay in RAM
101
+ echo "Creating writable overlay..."
102
+ mkdir -p /run/overlay-upper
103
+ mkdir -p /run/overlay-work
104
+ if ! mount -t overlay overlay \
105
+ -o lowerdir=/mnt/real-root,upperdir=/run/overlay-upper,workdir=/run/overlay-work \
106
+ /newroot;
107
+ then
108
+ echo "✗ ERROR: Failed to mount overlay"
109
+ umount /mnt/real-root
110
+ umount /mnt/root-img
111
+ cryptsetup close live-root
112
+ exec /bin/bash
113
+ fi
114
+ echo "✓ Overlay mounted successfully on /newroot"
115
+
116
+ # =================================================================
117
+ # BLOCCO CHROOT
118
+ # =================================================================
119
+ echo ""
120
+ echo "Preparing for chroot..."
121
+
122
+ # Crea i punti di montaggio per i filesystem speciali
123
+ mkdir -p /newroot/dev
124
+ mkdir -p /newroot/proc
125
+ mkdir -p /newroot/sys
126
+ mkdir -p /newroot/run
127
+
128
+ # Bind-mount dei filesystem speciali (FONDAMENTALE)
129
+ echo "Binding kernel filesystems..."
130
+ mount --bind /dev /newroot/dev
131
+ mount --bind /dev/pts /newroot/dev/pts
132
+ mount --bind /proc /newroot/proc
133
+ mount --bind /sys /newroot/sys
134
+ mount --bind /run /newroot/run
135
+
136
+ echo "✓ Bind mounts completed."
137
+ echo ""
138
+ echo "=========================================================="
139
+ echo " ENTERING CHROOT"
140
+ echo " Sei ora DENTRO il sistema sbloccato."
141
+ echo " Esegui 'exit' per uscire e tornare alla shell live."
142
+ echo "----------------------------------------------------------"
143
+ echo " Per avviare i servizi (XFCE), prova a eseguire:"
144
+ echo " # systemctl start lightdm.service"
145
+ echo " (o gdm.service, sddm.service, etc.)"
146
+ echo "=========================================================="
147
+ echo ""
148
+ sleep 2
149
+
150
+ # Entra nel chroot con una shell di root completa
151
+ chroot /newroot /bin/su - root
152
+
153
+ # --- ESECUZIONE SOSPESA FINO A 'exit' ---
154
+
155
+ # DOPO L'USCITA DALLO CHROOT
156
+ echo ""
157
+ echo "=========================================================="
158
+ echo " EXITED CHROOT"
159
+ echo " Pulizia dei mount..."
160
+ echo "=========================================================="
161
+
162
+ # Esegui la pulizia finale
163
+ umount -R /newroot/dev 2>/dev/null || true
164
+ umount -R /newroot/proc 2>/dev/null || true
165
+ umount -R /newroot/sys 2>/dev/null || true
166
+ umount -R /newroot/run 2>/dev/null || true
167
+ umount /newroot 2>/dev/null || true
168
+ umount /mnt/real-root 2>/dev/null || true
169
+ umount /mnt/root-img 2>/dev/null || true
170
+ cryptsetup close live-root 2>/dev/null || true
171
+
172
+ echo "✓ Cleanup completo. Ritorno alla shell live."