-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsecurity_checks.sh
More file actions
222 lines (191 loc) · 7.33 KB
/
Copy pathsecurity_checks.sh
File metadata and controls
222 lines (191 loc) · 7.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#!/bin/bash
################################################################################
# VÉRIFICATIONS DE SÉCURITÉ - AcmeFrag (Support XFS + EXT4 + SSD Protection)
#
# Licence / License: GNU General Public License v3
# COMMERCIAL USE REQUIRES PAID LICENSE
# Copyright (C) 2026 [Jean-Philippe Reculeau]
# See LICENSE file for full details
################################################################################
# Détecte le type de système de fichiers
# Argument: $1 = cible directory
# Retourne: Le type de FS (xfs, ext4, etc.) ou "unknown"
detect_filesystem_type() {
local target_dir="$1"
# Méthode 1: statfs (plus fiable sur Raspberry Pi)
local fs_type
fs_type=$(stat -f -c %T "$target_dir" 2>/dev/null)
# Si stat échoue, essayer df
if [ -z "$fs_type" ]; then
fs_type=$(df -T "$target_dir" 2>/dev/null | tail -1 | awk '{print $2}')
fi
echo "${fs_type:-unknown}"
}
# Détecte si le disque est un SSD ou un HDD
# Argument: $1 = target directory
# Retourne: "ssd" ou "hdd" ou "unknown"
detect_disk_type() {
local target_dir="$1"
local dev_path
local rotational
# Obtenir le chemin du device
dev_path=$(lsblk -o NAME,MOUNTPOINT -J 2>/dev/null | grep -F "$target_dir" | grep -o 'nvme[^"]*\|sd[a-z]*' | head -1)
# Si lsblk échoue, essayer avec df
if [ -z "$dev_path" ]; then
dev_path=$(df "$target_dir" 2>/dev/null | tail -1 | awk '{print $1}' | sed 's/[0-9]*$//')
dev_path="${dev_path##*/}" # Garder que le nom (sda, nvme0n1, etc.)
fi
if [ -z "$dev_path" ]; then
echo "unknown"
return 1
fi
# Vérifier si c'est un NVMe (toujours SSD)
if [[ "$dev_path" =~ nvme ]]; then
echo "ssd"
return 0
fi
# Vérifier le flag rotational pour HDD vs SSD
if [ -f "/sys/block/$dev_path/queue/rotational" ]; then
rotational=$(cat "/sys/block/$dev_path/queue/rotational" 2>/dev/null)
if [ "$rotational" = "0" ]; then
echo "ssd"
return 0
elif [ "$rotational" = "1" ]; then
echo "hdd"
return 0
fi
fi
echo "unknown"
return 1
}
# Vérifie si le chemin fourni existe physiquement sur le système.
check_directory_exists() {
local target_dir="$1"
if [ ! -d "$target_dir" ]; then
echo -e "\n ❌ Erreur : Le dossier $target_dir n'existe pas."
return 1
fi
return 0
}
# Vérifie si le dossier est un point de montage (un disque branché).
# C'est crucial : cela évite d'écrire par erreur sur la carte SD de ton Pi 5
# si le disque USB de 6 To s'est déconnecté.
check_mount_point() {
local target_dir="$1"
if ! mountpoint -q "$target_dir"; then
echo -e "\n ❌ Erreur : $target_dir n'est pas un point de montage actif."
return 1
fi
return 0
}
# Vérifie le type de système de fichiers.
# Support de XFS (xfs_fsr, xfs_bmap, xfs_db)
# Support de EXT4 (e4defrag, filefrag, tune2fs)
check_filesystem_type() {
local target_dir="$1"
local fs_type
local supported="false"
fs_type=$(detect_filesystem_type "$target_dir")
# Vérifier que le FS est dans la liste supportée
case "$fs_type" in
xfs)
echo -e "\n ✅ Système de fichiers détecté : XFS"
supported="true"
;;
ext4)
echo -e "\n ✅ Système de fichiers détecté : EXT4"
supported="true"
;;
*)
echo -e "\n ❌ Erreur : Le système de fichiers détecté est : $fs_type"
echo " Les formats supportés sont : XFS et EXT4"
return 1
;;
esac
return 0
}
# NOUVELLE FONCTION: Vérification SSD
# Les SSDs ne doivent PAS être défragmentés (wear leveling, usure)
check_ssd_warning() {
local target_dir="$1"
local disk_type
local allow_ssd_defrag="${ALLOW_SSD_DEFRAG:-false}"
disk_type=$(detect_disk_type "$target_dir")
if [ "$disk_type" = "ssd" ]; then
echo -e "\n ⚠️ ATTENTION : Le disque détecté est UN SSD (ou NVMe)"
echo ""
echo " ⚠️ Les SSDs utilisent le \"wear leveling\" (distribution interne de l'usure)."
echo " La défragmentation tradicelle est:"
echo " • INUTILE (performance interne gérée par le contrôleur)"
echo " • DANGEREUSE (usure accélérée de la mémoire flash)"
echo " • NON RECOMMANDÉE par les fabricants"
echo ""
if [ "$allow_ssd_defrag" = "true" ]; then
echo " 🚨 La défragmentation SSD est ACTIVÉE dans config.sh"
echo " Continuons à vos risques et périls..."
sleep 2
else
echo " ❌ La défragmentation est DÉSACTIVÉE pour protéger le SSD"
return 1
fi
elif [ "$disk_type" = "hdd" ]; then
echo -e "\n ✅ Disque détecté : HDD (mécanique) - Défragmentation utile"
else
echo -e "\n ⚠️ Type de disque : Impossible à déterminer"
echo " Continuation prudente (meilleures pratiques appliquées)"
fi
return 0
}
# Vérifie que les outils nécessaires sont disponibles
check_required_tools() {
local target_dir="$1"
local fs_type
fs_type=$(detect_filesystem_type "$target_dir")
case "$fs_type" in
xfs)
# Vérifier les outils XFS
if ! command -v xfs_fsr &> /dev/null; then
echo -e "\n ❌ Erreur : xfs_fsr n'est pas installé"
echo " Sur Raspberry Pi: sudo apt install xfsprogs"
return 1
fi
if ! command -v xfs_bmap &> /dev/null; then
echo -e "\n ❌ Erreur : xfs_bmap n'est pas installé"
echo " Sur Raspberry Pi: sudo apt install xfsprogs"
return 1
fi
;;
ext4)
# Vérifier les outils EXT4
if ! command -v e4defrag &> /dev/null; then
echo -e "\n ❌ Erreur : e4defrag n'est pas installé"
echo " Sur Raspberry Pi: sudo apt install e2fsprogs"
return 1
fi
# filefrag est inclus dans debugfs/e2fsprogs
if ! command -v filefrag &> /dev/null; then
echo -e "\n ❌ Erreur : filefrag n'est pas installé"
echo " Sur Raspberry Pi: sudo apt install e2fsprogs"
return 1
fi
;;
esac
echo -e "\n ✅ Tous les outils requis sont disponibles"
return 0
}
# Fonction principale pour exécuter toutes les vérifications de sécurité
run_security_checks() {
local target_dir="$1"
echo ""
echo "=============================================================================="
echo "--- 🔒 VÉRIFICATIONS DE SÉCURITÉ"
echo "=============================================================================="
check_directory_exists "$target_dir" || return 1
check_mount_point "$target_dir" || return 1
check_filesystem_type "$target_dir" || return 1
check_ssd_warning "$target_dir" || return 1
check_required_tools "$target_dir" || return 1
echo -e "\n ✅ TOUTES LES VÉRIFICATIONS PASSÉES"
echo "=============================================================================="
return 0
}