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.
- package/.oclif.manifest.json +17 -3
- package/README.md +769 -2
- package/README.pdf +1705 -1747
- package/addons/eggs/theme/livecd/{grub.theme.cfg → full.grub.theme.cfg} +1 -1
- package/addons/eggs/theme/livecd/{isolinux.theme.cfg → full.isolinux.theme.cfg} +1 -1
- package/addons/eggs/theme/livecd/generic-splash.png +0 -0
- package/addons/eggs/theme/livecd/generic.grub.main.cfg +29 -0
- package/addons/eggs/theme/livecd/generic.grub.theme.cfg +67 -0
- package/addons/eggs/theme/livecd/generic.isolinux.main.cfg +34 -0
- package/addons/eggs/theme/livecd/generic.isolinux.theme.cfg +34 -0
- package/addons/eggs/theme/livecd/simple.grub.main.cfg +29 -0
- package/addons/eggs/theme/livecd/simple.grub.theme.cfg +67 -0
- package/addons/eggs/theme/livecd/{isolinux.main.simple.cfg → simple.isolinux.main.cfg} +1 -2
- package/addons/eggs/theme/livecd/simple.isolinux.theme.cfg +47 -0
- package/dist/classes/diversions.d.ts +1 -1
- package/dist/classes/diversions.js +4 -25
- package/dist/classes/ovary.d/bind-live-fs.js +1 -1
- package/dist/classes/ovary.d/initrd.js +3 -2
- package/dist/classes/ovary.d/luks-get-password.js +1 -0
- package/dist/classes/ovary.d/luks-home.js +41 -29
- package/dist/classes/ovary.d/luks-root-initrd.d.ts +17 -0
- package/dist/classes/ovary.d/luks-root-initrd.js +213 -0
- package/dist/classes/ovary.d/luks-root.js +60 -35
- package/dist/classes/ovary.d/make-dot-disk.js +10 -1
- package/dist/classes/ovary.d/make-efi.js +59 -43
- package/dist/classes/ovary.d/make-squashfs.d.ts +1 -1
- package/dist/classes/ovary.d/make-squashfs.js +2 -5
- package/dist/classes/ovary.d/merged.js +1 -1
- package/dist/classes/ovary.d/produce.d.ts +2 -2
- package/dist/classes/ovary.d/produce.js +45 -44
- package/dist/classes/ovary.d/syslinux.js +47 -34
- package/dist/classes/ovary.d/xorriso-command.js +1 -2
- package/dist/classes/ovary.d.ts +3 -4
- package/dist/classes/ovary.js +6 -6
- package/dist/classes/utils.d.ts +2 -0
- package/dist/classes/utils.js +13 -3
- package/dist/commands/love.d.ts +1 -0
- package/dist/commands/love.js +9 -2
- package/dist/commands/produce.d.ts +2 -1
- package/dist/commands/produce.js +18 -4
- package/dist/krill/classes/sequence.d.ts +1 -1
- package/dist/krill/classes/sequence.js +3 -3
- package/package.json +4 -4
- package/scripts/_eggs +3 -1
- package/scripts/boot-encrypted-root.sh +177 -0
- package/scripts/eggs.bash +2 -2
- package/scripts/mount-encrypted-home.sh +92 -56
- package/dist/classes/ovary.d/luks-root-bootstrap-builder.d.ts +0 -11
- package/dist/classes/ovary.d/luks-root-bootstrap-builder.js +0 -45
- package/scripts/luks-root-bootstrap-create.sh +0 -235
- package/scripts/luks-root-unlock.sh +0 -172
- /package/addons/eggs/theme/livecd/{grub.main.cfg → full.grub.main.cfg} +0 -0
- /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 --
|
|
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 "$
|
|
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 "$
|
|
55
|
-
log_error "home.img not found at $
|
|
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 $
|
|
68
|
+
log "Found home.img at $ORIG_HOME_IMG"
|
|
62
69
|
|
|
63
70
|
# Copia in RAM se è su media read-only
|
|
64
|
-
|
|
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 "$
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
134
|
-
echo "
|
|
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
|
|
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
|
-
}
|