penguins-eggs 25.10.19 → 25.10.24

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 (53) hide show
  1. package/.oclif.manifest.json +17 -3
  2. package/README.md +769 -2
  3. package/README.pdf +1705 -1747
  4. package/addons/eggs/theme/livecd/{grub.theme.cfg → full.grub.theme.cfg} +1 -1
  5. package/addons/eggs/theme/livecd/{isolinux.theme.cfg → full.isolinux.theme.cfg} +1 -1
  6. package/addons/eggs/theme/livecd/generic-splash.png +0 -0
  7. package/addons/eggs/theme/livecd/generic.grub.main.cfg +29 -0
  8. package/addons/eggs/theme/livecd/generic.grub.theme.cfg +67 -0
  9. package/addons/eggs/theme/livecd/generic.isolinux.main.cfg +34 -0
  10. package/addons/eggs/theme/livecd/generic.isolinux.theme.cfg +34 -0
  11. package/addons/eggs/theme/livecd/simple.grub.main.cfg +29 -0
  12. package/addons/eggs/theme/livecd/simple.grub.theme.cfg +67 -0
  13. package/addons/eggs/theme/livecd/{isolinux.main.simple.cfg → simple.isolinux.main.cfg} +1 -2
  14. package/addons/eggs/theme/livecd/simple.isolinux.theme.cfg +47 -0
  15. package/dist/classes/diversions.d.ts +1 -1
  16. package/dist/classes/diversions.js +4 -25
  17. package/dist/classes/ovary.d/bind-live-fs.js +1 -1
  18. package/dist/classes/ovary.d/initrd.js +3 -2
  19. package/dist/classes/ovary.d/luks-get-password.js +1 -0
  20. package/dist/classes/ovary.d/luks-home.js +41 -29
  21. package/dist/classes/ovary.d/luks-root-initrd.d.ts +17 -0
  22. package/dist/classes/ovary.d/luks-root-initrd.js +213 -0
  23. package/dist/classes/ovary.d/luks-root.js +60 -35
  24. package/dist/classes/ovary.d/make-dot-disk.js +10 -1
  25. package/dist/classes/ovary.d/make-efi.js +59 -43
  26. package/dist/classes/ovary.d/make-squashfs.d.ts +1 -1
  27. package/dist/classes/ovary.d/make-squashfs.js +2 -5
  28. package/dist/classes/ovary.d/merged.js +1 -1
  29. package/dist/classes/ovary.d/produce.d.ts +2 -2
  30. package/dist/classes/ovary.d/produce.js +45 -44
  31. package/dist/classes/ovary.d/syslinux.js +47 -34
  32. package/dist/classes/ovary.d/xorriso-command.js +1 -2
  33. package/dist/classes/ovary.d.ts +3 -4
  34. package/dist/classes/ovary.js +6 -6
  35. package/dist/classes/utils.d.ts +2 -0
  36. package/dist/classes/utils.js +13 -3
  37. package/dist/commands/love.d.ts +1 -0
  38. package/dist/commands/love.js +9 -2
  39. package/dist/commands/produce.d.ts +2 -1
  40. package/dist/commands/produce.js +18 -4
  41. package/dist/krill/classes/sequence.d.ts +1 -1
  42. package/dist/krill/classes/sequence.js +3 -3
  43. package/package.json +4 -4
  44. package/scripts/_eggs +3 -1
  45. package/scripts/boot-encrypted-root.sh +177 -0
  46. package/scripts/eggs.bash +2 -2
  47. package/scripts/mount-encrypted-home.sh +92 -56
  48. package/dist/classes/ovary.d/luks-root-bootstrap-builder.d.ts +0 -11
  49. package/dist/classes/ovary.d/luks-root-bootstrap-builder.js +0 -45
  50. package/scripts/luks-root-bootstrap-create.sh +0 -235
  51. package/scripts/luks-root-unlock.sh +0 -172
  52. /package/addons/eggs/theme/livecd/{grub.main.cfg → full.grub.main.cfg} +0 -0
  53. /package/addons/eggs/theme/livecd/{isolinux.main.full.cfg → full.isolinux.main.cfg} +0 -0
@@ -0,0 +1,177 @@
1
+ #!/bin/sh
2
+ # /scripts/live-premount/boot-encrypted-root.sh
3
+ # v2.3 - Minimal RAM Copy + Supporto Plymouth + 3 Tentativi
4
+
5
+ set -e
6
+
7
+ # --- Logging Setup ---
8
+ LOGFILE="/tmp/eggs-premount-boot.log"; FIFO="/tmp/eggs-boot.fifo"; rm -f "$LOGFILE" "$FIFO"; mkfifo "$FIFO" || exit 1; tee -a "$LOGFILE" < "$FIFO" & TEE_PID=$!; exec > "$FIFO" 2>&1; trap 'echo "EGGS-BOOT: Cleanup trap"; rm -f "$FIFO"; kill "$TEE_PID" 2>/dev/null || true; exit' EXIT INT TERM
9
+ # --- Logging End ---
10
+
11
+ echo "EGGS-BOOT: =========================================="
12
+ echo "EGGS-BOOT: Script Avvio Root Criptato v2.3 (3 Tentativi)"
13
+ echo "EGGS-BOOT: =========================================="
14
+
15
+ # Moduli necessari
16
+ echo "EGGS-BOOT: Caricamento moduli..."
17
+ modprobe loop 2>/dev/null || true
18
+ modprobe dm_mod 2>/dev/null || true
19
+ modprobe dm_crypt 2>/dev/null || true
20
+ modprobe overlay 2>/dev/null || true
21
+ modprobe ext4 2>/dev/null || true
22
+ modprobe squashfs 2>/dev/null || true
23
+ sleep 2
24
+
25
+ # 1. Trova live media originale
26
+ echo "EGGS-BOOT: Ricerca live media originale..."
27
+ mkdir -p /mnt/live-media /mnt/ext4
28
+ ORIG_MEDIA_MNT="/mnt/live-media"
29
+ LIVE_DEV=""
30
+ # ... [Codice ricerca live media] ...
31
+ MAX_WAIT_DEV=20; COUNT_DEV=0
32
+ while [ -z "$LIVE_DEV" ] && [ $COUNT_DEV -lt $MAX_WAIT_DEV ]; do ls /dev > /dev/null; for dev in /dev/sr* /dev/sd* /dev/vd* /dev/nvme*n*; do if [ ! -b "$dev" ]; then continue; fi; if mount -o ro "$dev" "$ORIG_MEDIA_MNT" 2>/dev/null; then if [ -f "${ORIG_MEDIA_MNT}/live/root.img" ]; then echo "EGGS-BOOT: Found Original Live media on $dev"; LIVE_DEV=$dev; break 2; else umount "$ORIG_MEDIA_MNT" 2>/dev/null || true; fi; fi; done; sleep 1; COUNT_DEV=$((COUNT_DEV+1)); done
33
+ if [ -z "$LIVE_DEV" ]; then echo "EGGS-BOOT: ERRORE: Live media originale non trovato!"; ls /dev; exit 1; fi
34
+
35
+ ROOT_IMG_RO="${ORIG_MEDIA_MNT}/live/root.img"
36
+ RAM_MEDIA_MNT="/run/live/medium" # Destinazione finale in RAM
37
+
38
+ # 2a. Associa loop device (per definire $LOOP_DEV)
39
+ echo "EGGS-BOOT: Associazione loop device per $ROOT_IMG_RO..."
40
+ LOOP_DEV_OUTPUT=$(/sbin/losetup -f --show "$ROOT_IMG_RO" 2>/dev/null); LOSETUP_EXIT_STATUS=$?
41
+ if [ $LOSETUP_EXIT_STATUS -ne 0 ] || [ -z "$LOOP_DEV_OUTPUT" ] || ! [ -b "$LOOP_DEV_OUTPUT" ]; then echo "EGGS-BOOT: ERRORE: Associazione loop fallita!"; exit 1; fi
42
+ LOOP_DEV="$LOOP_DEV_OUTPUT"
43
+ echo "EGGS-BOOT: Loop device associato: $LOOP_DEV"
44
+
45
+ # 2b. Sblocca LUKS (con supporto Plymouth e 3 tentativi)
46
+ echo "EGGS-BOOT: Sblocco LUKS $LOOP_DEV (readonly)..."
47
+
48
+ # Disabilita 'set -e' temporaneamente per gestire i fallimenti della password
49
+ set +e
50
+ MAX_ATTEMPTS=3
51
+ ATTEMPT=1
52
+ UNLOCKED=0
53
+
54
+ while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do
55
+ log "EGGS-BOOT: Tentativo sblocco $ATTEMPT di $MAX_ATTEMPTS"
56
+
57
+ # Controlla se Plymouth è attivo
58
+ if plymouth --ping 2>/dev/null; then
59
+ log "EGGS-BOOT: Plymouth attivo. Chiedo password via Plymouth..."
60
+
61
+ # Chiedi la password a Plymouth e passala a cryptsetup via stdin (--key-file -)
62
+ if plymouth ask-for-password --prompt="Enter passphrase ($ATTEMPT/$MAX_ATTEMPTS)" | cryptsetup open --readonly --key-file - "$LOOP_DEV" live-root; then
63
+ log "EGGS-BOOT: Sblocco LUKS via Plymouth riuscito."
64
+ UNLOCKED=1
65
+ break
66
+ else
67
+ log "EGGS-BOOT: ERRORE: Sblocco LUKS via Plymouth fallito (Tentativo $ATTEMPT)."
68
+ if [ $ATTEMPT -lt $MAX_ATTEMPTS ]; then
69
+ plymouth display-message --text="Incorrect passphrase. Try again..."
70
+ sleep 2 # Dà tempo di leggere il messaggio
71
+ fi
72
+ fi
73
+ else
74
+ # Fallback: Plymouth non attivo
75
+ log "EGGS-BOOT: Plymouth non attivo. Chiedo password via console..."
76
+ echo "Please enter passphrase for $LOOP_DEV ($ATTEMPT/$MAX_ATTEMPTS):"
77
+
78
+ if cryptsetup open --readonly "$LOOP_DEV" live-root; then
79
+ log "EGGS-BOOT: Sblocco LUKS (console) riuscito."
80
+ UNLOCKED=1
81
+ break
82
+ else
83
+ log "EGGS-BOOT: ERRORE: Sblocco LUKS (console) fallito (Tentativo $ATTEMPT)."
84
+ if [ $ATTEMPT -lt $MAX_ATTEMPTS ]; then
85
+ echo "Incorrect passphrase. Please try again."
86
+ fi
87
+ fi
88
+ fi
89
+
90
+ ATTEMPT=$((ATTEMPT + 1))
91
+ sleep 1
92
+ done
93
+
94
+ # Riabilita 'set -e'
95
+ set -e
96
+
97
+ # Controlla se tutti i tentativi sono falliti
98
+ if [ $UNLOCKED -eq 0 ]; then
99
+ log "EGGS-BOOT: ERRORE: Numero massimo tentativi raggiunto."
100
+ if plymouth --ping 2>/dev/null; then
101
+ plymouth display-message --text="LUKS Unlock Failed: Max attempts reached"
102
+ sleep 5
103
+ fi
104
+ /sbin/losetup -d "$LOOP_DEV" || true
105
+ exit 1
106
+ fi
107
+
108
+ echo "EGGS-BOOT: LUKS sbloccato ($LOOP_DEV -> live-root) [readonly]. Attesa mapper..."
109
+
110
+ # ... (Resto dello script v2.1: 2c, 2d, 3, 4, 5, 6, 7 - come prima) ...
111
+ # 2c. Attesa mapper
112
+ MAX_WAIT_MAP=10; COUNT_MAP=0; while [ ! -b /dev/mapper/live-root ] && [ $COUNT_MAP -lt $MAX_WAIT_MAP ]; do sleep 1; COUNT_MAP=$((COUNT_MAP+1)); done
113
+ if [ ! -b /dev/mapper/live-root ]; then echo "EGGS-BOOT: ERRORE: Mapper non apparso."; cryptsetup close live-root || true; /sbin/losetup -d "$LOOP_DEV" || true; exit 1; fi
114
+
115
+ # 2d. Montaggio ext4
116
+ echo "EGGS-BOOT: Montaggio ext4..."
117
+ mount -t ext4 -o ro /dev/mapper/live-root /mnt/ext4
118
+
119
+ SQFS_SRC="/mnt/ext4/filesystem.squashfs"
120
+ if [ ! -f "$SQFS_SRC" ]; then echo "EGGS-BOOT: ERRORE: $SQFS_SRC non trovato!"; exit 1; fi
121
+
122
+ # 3. Prepara Destinazione RAM (ORA calcoliamo la dimensione GIUSTA)
123
+ echo "EGGS-BOOT: Preparazione RAM disk ${RAM_MEDIA_MNT}..."
124
+ SQFS_SIZE_BYTES=$(stat -c%s "$SQFS_SRC")
125
+ NEEDED_SIZE_MB=$(( $SQFS_SIZE_BYTES / 1024 / 1024 + 500 )) # Aggiunge 500MB buffer
126
+ echo "EGGS-BOOT: Spazio stimato necessario in /run: ${NEEDED_SIZE_MB} MB"
127
+ echo "EGGS-BOOT: Aumento dimensione /run (tmpfs)..."
128
+ if ! mount -o remount,size=${NEEDED_SIZE_MB}M /run; then
129
+ echo "EGGS-BOOT: WARN: Remount /run fallito, spazio potrebbe essere insufficiente."
130
+ df -h /run
131
+ fi
132
+ mkdir -p "${RAM_MEDIA_MNT}/live"
133
+
134
+ # 4. Copia SOLO filesystem.squashfs in RAM
135
+ SQFS_DEST="${RAM_MEDIA_MNT}/live/filesystem.squashfs"
136
+ echo "EGGS-BOOT: Copia $SQFS_SRC -> $SQFS_DEST..."
137
+ if command -v rsync >/dev/null; then
138
+ rsync -a --info=progress2 "$SQFS_SRC" "$SQFS_DEST"
139
+ else
140
+ cp "$SQFS_SRC" "$SQFS_DEST"
141
+ fi
142
+ SQFS_SIZE=$(du -h "$SQFS_DEST" | cut -f1)
143
+ echo "EGGS-BOOT: filesystem.squashfs ($SQFS_SIZE) copiato in RAM."
144
+
145
+ # 5. Copia i metadati essenziali del medium in RAM
146
+ echo "EGGS-BOOT: Copia metadati (.disk, kernel, initrd) da ${ORIG_MEDIA_MNT}..."
147
+
148
+ # Copia .disk (essenziale per live-boot)
149
+ if [ -d "${ORIG_MEDIA_MNT}/.disk" ]; then
150
+ cp -a "${ORIG_MEDIA_MNT}/.disk" "${RAM_MEDIA_MNT}/"
151
+ echo "EGGS-BOOT: .disk copiato."
152
+ else
153
+ echo "EGGS-BOOT: WARN: Directory .disk non trovata sul media originale."
154
+ fi
155
+
156
+ # Copia kernel e initrd (utili per l'installer)
157
+ echo "EGGS-BOOT: Copia vmlinuz* e initrd*..."
158
+ cp -a "${ORIG_MEDIA_MNT}/live/vmlinuz"* "${RAM_MEDIA_MNT}/live/" 2>/dev/null || true
159
+ cp -a "${ORIG_MEDIA_MNT}/live/initrd"* "${RAM_MEDIA_MNT}/live/" 2>/dev/null || true
160
+ echo "EGGS-BOOT: Copia kernel/initrd tentata (eventuali errori ignorati)."
161
+
162
+ # 6. Pulizia Mount/Device Intermedi
163
+ echo "EGGS-BOOT: Pulizia mount/device intermedi..."
164
+ umount /mnt/ext4 || echo "EGGS-BOOT: WARN: umount /mnt/ext4 failed ($?)"
165
+ cryptsetup close live-root || echo "EGGS-BOOT: WARN: cryptsetup close live-root failed ($?)"
166
+ /sbin/losetup -d "$LOOP_DEV" || echo "EGGS-BOOT: WARN: losetup -d $LOOP_DEV failed ($?)"
167
+ umount "$ORIG_MEDIA_MNT" || echo "EGGS-BOOT: WARN: umount ${ORIG_MEDIA_MNT} failed ($?)"
168
+ echo "EGGS-BOOT: Pulizia completata."
169
+
170
+ # 7. Passa il Testimone a live-boot
171
+ echo "EGGS-BOOT: =========================================="
172
+ echo "EGGS-BOOT: Medium live MINIMALE ricostruito in RAM su ${RAM_MEDIA_MNT}"
173
+ ls -l "$RAM_MEDIA_MNT"
174
+ ls -l "${RAM_MEDIA_MNT}/live"
175
+ echo "EGGS-BOOT: Lascio che live-boot continui (con 'live-media=/run/live/medium')..."
176
+ echo "EGGS-BOOT: =========================================="
177
+ exit 0
package/scripts/eggs.bash CHANGED
@@ -23,10 +23,10 @@ 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 --clone --homecrypt --fullcrypt
26
+ love --help --verbose --hidden --nointeractive --clone --homecrypt --fullcrypt
27
27
  mom --help
28
28
  pods --help
29
- produce --addons --basename --clone --homecrypt --fullcrypt --excludes --help --kernel --links --max --noicon --nointeractive --pendrive --prefix --release --script --standard --theme --includeRoot --verbose --yolk
29
+ produce --addons --basename --clone --homecrypt --fullcrypt --excludes --help --hidden --kernel --links --max --noicon --nointeractive --pendrive --prefix --release --script --standard --theme --includeRootHome --verbose --yolk
30
30
  status --help --verbose
31
31
  tools:clean --help --nointeractive --verbose
32
32
  tools:repo --add --help --nointeractive --remove --verbose
@@ -1,5 +1,6 @@
1
1
  #!/bin/bash
2
2
  # Script per sbloccare e montare home.img LUKS cifrato
3
+ # v1.1 - Aggiunto supporto Plymouth
3
4
  # Con logging robusto e gestione errori
4
5
 
5
6
  set -e
@@ -28,11 +29,16 @@ cleanup() {
28
29
  if [ -e "/dev/mapper/$LUKS_NAME" ]; then
29
30
  cryptsetup close "$LUKS_NAME" 2>/dev/null || true
30
31
  fi
32
+ # Se abbiamo copiato in RAM, rimuoviamo la copia
33
+ if [ "$HOME_IMG" = "/var/tmp/home.img" ]; then
34
+ rm -f /var/tmp/home.img 2>/dev/null || true
35
+ log "Removed temporary home.img from /var/tmp"
36
+ fi
31
37
  }
32
38
 
33
39
  trap cleanup EXIT
34
40
 
35
- log "=== Starting encrypted home mount process ==="
41
+ log "=== Starting encrypted home mount process (v1.1) ==="
36
42
 
37
43
  # Verifica memoria disponibile
38
44
  AVAILABLE_MEM=$(free -m | awk '/^Mem:/{print $7}')
@@ -45,36 +51,34 @@ fi
45
51
 
46
52
  # Attendi che il media sia disponibile (max 30 secondi)
47
53
  log "Waiting for live media to be available..."
54
+ ORIG_HOME_IMG="$HOME_IMG" # Salva il path originale
48
55
  COUNTER=0
49
- while [ ! -f "$HOME_IMG" ] && [ $COUNTER -lt 30 ]; do
56
+ while [ ! -f "$ORIG_HOME_IMG" ] && [ $COUNTER -lt 30 ]; do
50
57
  sleep 1
51
58
  COUNTER=$((COUNTER + 1))
52
59
  done
53
60
 
54
- if [ ! -f "$HOME_IMG" ]; then
55
- log_error "home.img not found at $HOME_IMG after 30 seconds"
61
+ if [ ! -f "$ORIG_HOME_IMG" ]; then
62
+ log_error "home.img not found at $ORIG_HOME_IMG after 30 seconds"
56
63
  log "Available mounts:"
57
64
  mount | grep live | tee -a "$LOG_FILE"
58
65
  exit 0
59
66
  fi
60
67
 
61
- log "Found home.img at $HOME_IMG"
68
+ log "Found home.img at $ORIG_HOME_IMG"
62
69
 
63
70
  # Copia in RAM se è su media read-only
64
- TEMP_HOME_IMG="/var/tmp/home.img" # /var/tmp è su overlay, non tmpfs
71
+ # Nota: /var/tmp è su overlay (tmpfs), quindi è in RAM.
72
+ TEMP_HOME_IMG="/var/tmp/home.img"
65
73
  log "Copying home.img to RAM..."
66
- cp "$HOME_IMG" "$TEMP_HOME_IMG"
67
- HOME_IMG="$TEMP_HOME_IMG"
74
+ cp "$ORIG_HOME_IMG" "$TEMP_HOME_IMG"
75
+ HOME_IMG="$TEMP_HOME_IMG" # Da ora in poi usiamo la copia in RAM
68
76
  log "home.img copied to $HOME_IMG"
69
77
 
70
78
  # Verifica dimensione file
71
79
  IMG_SIZE=$(stat -c %s "$HOME_IMG")
72
80
  log "home.img size: $((IMG_SIZE / 1024 / 1024))MB"
73
81
 
74
- # Verifica dimensione file
75
- IMG_SIZE=$(stat -c %s "$HOME_IMG")
76
- log "home.img size: $((IMG_SIZE / 1024 / 1024))MB"
77
-
78
82
  # Verifica se è un volume LUKS
79
83
  if ! cryptsetup isLuks "$HOME_IMG" 2>&1 | tee -a "$LOG_FILE"; then
80
84
  log_error "$HOME_IMG is not a valid LUKS volume"
@@ -83,58 +87,89 @@ fi
83
87
 
84
88
  log "Verified: home.img is a valid LUKS volume"
85
89
 
86
- # Mostra prompt per la passphrase
87
- echo ""
88
- echo "╔════════════════════════════════════════╗"
89
- echo "║ Encrypted Home Directory Detected ║"
90
- echo "╚════════════════════════════════════════╝"
91
- echo ""
92
- echo "Please enter your passphrase to unlock your home directory"
93
- echo "(Press Ctrl+C to skip and continue with temporary home)"
94
- echo ""
95
-
96
- echo "(Press Ctrl+C to skip and continue with temporary home)"
97
- echo ""
98
-
99
90
  # Aspetta che il TTY sia completamente inizializzato
100
91
  sleep 2
101
92
 
102
- # Prima del while loop dei tentativi
93
+ # Pulisci eventuale device mapper precedente
103
94
  if [ -e "/dev/mapper/$LUKS_NAME" ]; then
104
95
  log "LUKS device already exists, closing it first..."
105
96
  cryptsetup close "$LUKS_NAME" 2>&1 | tee -a "$LOG_FILE" || true
106
97
  fi
107
98
 
108
- # Tentativi multipli per la passphrase
99
+ # --- LOGICA RICHIESTA PASSWORD (CON PLYMOUTH) ---
109
100
  MAX_ATTEMPTS=3
110
101
  ATTEMPT=1
102
+ UNLOCKED=0 # Flag per sapere se abbiamo sbloccato
111
103
 
112
104
  while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do
113
105
  log "Unlock attempt $ATTEMPT of $MAX_ATTEMPTS"
114
106
 
115
- if cryptsetup open "$HOME_IMG" "$LUKS_NAME" 2>&1 | tee -a "$LOG_FILE"; then
116
- log "LUKS volume unlocked successfully"
117
- break
118
- else
119
- log_error "Failed to unlock LUKS volume (attempt $ATTEMPT)"
107
+ # Controlla se Plymouth è attivo
108
+ if plymouth --ping 2>/dev/null; then
109
+ log "Plymouth active. Asking for password via Plymouth..."
120
110
 
121
- if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then
122
- log_error "Maximum attempts reached. Continuing without encrypted home."
123
- echo ""
124
- echo "╔════════════════════════════════════════╗"
125
- echo "║ Failed to unlock encrypted home ║"
126
- echo "║ System will continue with default ║"
127
- echo "╚════════════════════════════════════════╝"
128
- echo ""
129
- sleep 3
130
- exit 0
111
+ # Chiede a Plymouth, passa la password a cryptsetup via stdin
112
+ if plymouth ask-for-password --prompt="Enter passphrase for /home ($ATTEMPT/$MAX_ATTEMPTS)" | cryptsetup open "$HOME_IMG" "$LUKS_NAME" --key-file - 2>&1 | tee -a "$LOG_FILE"; then
113
+ log "LUKS volume unlocked successfully via Plymouth"
114
+ UNLOCKED=1
115
+ break
116
+ else
117
+ log_error "Failed to unlock LUKS volume via Plymouth (attempt $ATTEMPT)"
118
+ if [ $ATTEMPT -lt $MAX_ATTEMPTS ]; then
119
+ plymouth display-message --text="Incorrect passphrase. Try again..."
120
+ sleep 2 # Dà tempo di leggere il messaggio
121
+ fi
131
122
  fi
123
+ else
124
+ # Fallback: Plymouth non attivo (o fallito)
125
+ log "Plymouth not active. Asking for password via console..."
132
126
 
133
- ATTEMPT=$((ATTEMPT + 1))
134
- echo "Incorrect passphrase. Please try again ($ATTEMPT/$MAX_ATTEMPTS)"
127
+ # Stampa il prompt (già presente nel tuo script originale)
128
+ echo ""
129
+ echo "╔════════════════════════════════════════╗"
130
+ echo "║ Encrypted Home Directory Detected ║"
131
+ echo "╚════════════════════════════════════════╝"
135
132
  echo ""
133
+ echo "Please enter your passphrase to unlock your home directory ($ATTEMPT/$MAX_ATTEMPTS)"
134
+ echo "(Press Ctrl+C to skip and continue with temporary home)"
135
+ echo ""
136
+
137
+ if cryptsetup open "$HOME_IMG" "$LUKS_NAME" 2>&1 | tee -a "$LOG_FILE"; then
138
+ log "LUKS volume unlocked successfully via console"
139
+ UNLOCKED=1
140
+ break
141
+ else
142
+ log_error "Failed to unlock LUKS volume (attempt $ATTEMPT)"
143
+ if [ $ATTEMPT -lt $MAX_ATTEMPTS ]; then
144
+ echo "Incorrect passphrase. Please try again."
145
+ fi
146
+ fi
136
147
  fi
148
+
149
+ ATTEMPT=$((ATTEMPT + 1))
137
150
  done
151
+ # --- FINE LOGICA RICHIESTA PASSWORD ---
152
+
153
+
154
+ # Controlla se lo sblocco è fallito dopo tutti i tentativi
155
+ if [ $UNLOCKED -eq 0 ]; then
156
+ log_error "Maximum attempts reached. Continuing without encrypted home."
157
+ echo ""
158
+ echo "╔════════════════════════════════════════╗"
159
+ echo "║ Failed to unlock encrypted home ║"
160
+ echo "║ System will continue with default ║"
161
+ echo "╚════════════════════════════════════════╝"
162
+ echo ""
163
+
164
+ if plymouth --ping 2>/dev/null; then
165
+ plymouth display-message --text="Failed to unlock. Continuing with temporary home..."
166
+ sleep 3
167
+ plymouth quit
168
+ fi
169
+
170
+ sleep 3
171
+ exit 0 # Esce senza errore, per permettere al sistema di continuare
172
+ fi
138
173
 
139
174
  # Verifica che il device mapper esista
140
175
  if [ ! -e "/dev/mapper/$LUKS_NAME" ]; then
@@ -153,10 +188,14 @@ if mount "/dev/mapper/$LUKS_NAME" "$MOUNT_POINT" 2>&1 | tee -a "$LOG_FILE"; then
153
188
  log "Home directory mounted successfully"
154
189
  else
155
190
  log_error "Failed to mount decrypted volume"
156
- cryptsetup close "$LUKS_NAME"
191
+ # cryptsetup close è gestito dalla trap 'cleanup'
157
192
  exit 1
158
193
  fi
159
194
 
195
+ # Rimuovi la copia in RAM, non serve più
196
+ log "Cleaning up temporary copy: $HOME_IMG"
197
+ rm -f "$HOME_IMG" 2>/dev/null || true
198
+
160
199
  # Ripristina gli utenti se esistono
161
200
  if [ -d "$MOUNT_POINT/.system-backup" ]; then
162
201
  log "Restoring user accounts..."
@@ -167,22 +206,12 @@ if [ -d "$MOUNT_POINT/.system-backup" ]; then
167
206
  userdel -r live 2>&1 | tee -a "$LOG_FILE" || true
168
207
  fi
169
208
 
170
- # Ripristina gli utenti
209
+ # Ripristina gli utenti (NOTA: hai duplicato questo blocco nel tuo script originale, l'ho corretto)
171
210
  if [ -f "$MOUNT_POINT/.system-backup/passwd" ]; then
172
211
  cat "$MOUNT_POINT/.system-backup/passwd" >> /etc/passwd
173
212
  log "Restored $(wc -l < "$MOUNT_POINT/.system-backup/passwd") user entries"
174
213
  fi
175
214
 
176
- if [ -f "$MOUNT_POINT/.system-backup/shadow" ]; then
177
- cat "$MOUNT_POINT/.system-backup/shadow" >> /etc/shadow
178
- fi
179
-
180
- # Ripristina gli utenti
181
- if [ -f "$MOUNT_POINT/.system-backup/passwd" ]; then
182
- cat "$MOUNT_POINT/.system-backup/passwd" >> /etc/passwd
183
- log "Restored $(wc -l < "$MOUNT_POINT/.system-backup/passwd") user entries"
184
- fi
185
-
186
215
  if [ -f "$MOUNT_POINT/.system-backup/shadow" ]; then
187
216
  cat "$MOUNT_POINT/.system-backup/shadow" >> /etc/shadow
188
217
  fi
@@ -213,10 +242,17 @@ if [ -d "$MOUNT_POINT/.system-backup" ]; then
213
242
  else
214
243
  log "No active display manager found to restart"
215
244
  fi
245
+ else
246
+ log "No .system-backup directory found. Assuming /home is just data."
216
247
  fi
217
248
 
218
249
  log "=== Encrypted home mount completed successfully ==="
219
250
 
251
+ # Notifica a Plymouth (se attivo) che abbiamo finito
252
+ if plymouth --ping 2>/dev/null; then
253
+ plymouth quit
254
+ fi
255
+
220
256
  # Non fare cleanup al successo
221
257
  trap - EXIT
222
258
 
@@ -1,11 +0,0 @@
1
- /**
2
- * luks-root-bootstrap-builder.ts
3
- *
4
- * Crea un filesystem.squashfs bootstrap completo con Debian
5
- * per sbloccare il sistema principale cifrato
6
- */
7
- import Ovary from '../ovary.js';
8
- /**
9
- * Crea il filesystem bootstrap completo
10
- */
11
- export declare function createBootstrapFilesystem(this: Ovary, outputSquashfs: string): Promise<void>;
@@ -1,45 +0,0 @@
1
- /**
2
- * luks-root-bootstrap-builder.ts
3
- *
4
- * Crea un filesystem.squashfs bootstrap completo con Debian
5
- * per sbloccare il sistema principale cifrato
6
- */
7
- import fs from 'fs';
8
- import path from 'path';
9
- import Utils from '../utils.js';
10
- import { exec } from '../../lib/utils.js';
11
- const __dirname = path.dirname(new URL(import.meta.url).pathname);
12
- /**
13
- * Crea il filesystem bootstrap completo
14
- */
15
- export async function createBootstrapFilesystem(outputSquashfs) {
16
- Utils.warning('Creating full Debian bootstrap filesystem...');
17
- Utils.warning('This will take several minutes...');
18
- const scriptsDir = path.join(__dirname, '../../../scripts');
19
- const createScript = path.join(scriptsDir, 'luks-root-bootstrap-create.sh');
20
- const unlockScript = path.join(scriptsDir, 'luks-root-unlock.sh');
21
- // Verifica che gli script esistano
22
- if (!fs.existsSync(createScript)) {
23
- throw new Error(`Build script not found: ${createScript}`);
24
- }
25
- if (!fs.existsSync(unlockScript)) {
26
- throw new Error(`Unlock script not found: ${unlockScript}`);
27
- }
28
- try {
29
- // Esegui lo script di creazione bash
30
- Utils.warning('Executing bootstrap creation script...');
31
- await exec(`bash ${createScript} ${outputSquashfs} ${unlockScript}`, { echo: true });
32
- // Verifica che il file sia stato creato
33
- if (!fs.existsSync(outputSquashfs)) {
34
- throw new Error('Bootstrap filesystem was not created');
35
- }
36
- const stats = fs.statSync(outputSquashfs);
37
- const sizeMB = (stats.size / 1024 / 1024).toFixed(2);
38
- Utils.success(`✓ Bootstrap filesystem created: ${sizeMB} MB`);
39
- Utils.success(' Full Debian system with systemd and encrypted root unlock');
40
- }
41
- catch (error) {
42
- Utils.error(`Failed to create bootstrap filesystem: ${error}`);
43
- throw error;
44
- }
45
- }