Gestion des tests short ou long

- Gestion du choix de la durée du test (short ou long).
- Gestion de l'utilisation d'argument pour lancer directement un test short ou long
- Meilleure gestion des temps restants.
This commit is contained in:
John Doe 2022-04-18 18:08:22 +02:00
parent 6c05951e7d
commit 818893e7c1
1 changed files with 84 additions and 40 deletions

View File

@ -1,5 +1,15 @@
#!/bin/bash
OUTPUT=($(lsscsi -g | grep "disk" | grep -v "Virtual Disk" | grep -o "/dev/sg[0-9]" | paste -sd ' ')) #Liste des disques non virtuels
DISKS=() #Array vide dans lequel on mettra les disques a tester
TEMPS_SHORT=() #Array vide dans lequel on va mettre les temps de polling short
TEMPS_LONG=() #Array vide dans lequel on va mettre les temps de polling long
ARRAY_TEMPS=() #Creation d un array vide pour temps de selftest
AVANCEMENT=() #Array pour le pourcentage du test restant sur chaque disque
LOG=($(eval echo ~$USER/SANTE_DISK)) #Chemin du fichier de sortie du test (dans le repertoire home de l utilisateur)
PACKAGES=(lsscsi smartmontools mailutils) #Liste des paquets necessaires
FIN_TEST="NOK"
#Si votre fichier de script est appelé par cron et qu il contient un shell à la première ligne du type #!/Bin/bash , vous devez rechercher le nom parent-parent correspondant à vos besoins.
PPPID=`ps h -o ppid= $PPID` #Le PID parent est disponible dans bash en tant que variable $ PPID . La commande ps permettant d'obtenir le PID parent du PID parent
P_COMMAND=`ps h -o %c $PPPID` #On recupere le nom de la commande
@ -9,13 +19,6 @@ else
RUNNING_FROM_CRON=0
fi
OUTPUT=($(lsscsi -g | grep "disk" | grep -v "Virtual Disk" | grep -o "/dev/sg[0-9]" | paste -sd ' ')) #Liste des disques non virtuels
DISKS=() #Array vide dans lequel on mettra les disques a tester
ARRAY_TEMPS=() #Creation d un array vide pour temps de selftest
LOG=($(eval echo ~$USER/SANTE_DISK)) #Chemin du fichier de sortie du test (dans le repertoire home de l utilisateur)
PACKAGES=(lsscsi smartmontools mailutils) #Liste des paquets necessaires
FIN_TEST="NOK"
for i in "${PACKAGES[@]}" #Verification et installation des paquets necessaires
do
if ! dpkg -s $i >/dev/null 2>&1; then
@ -31,23 +34,51 @@ do
fi
done
if [ "$1" != "" ]; then
TYPE_TEST="$1"
fi
if [ "$RUNNING_FROM_CRON" == "0" ]; then
while [[ "$TYPE_TEST" != "short" && "$TYPE_TEST" != "long" ]]
do
if [ "$TYPE_TEST" != "" ]; then
echo "La durée du test entrée ($TYPE_TEST) est invalide."
else
echo "Aucune durée de test entrée."
fi
read -p "Veuillez selectionner la durée du test (short ou long) : " TYPE_TEST
done
echo "Vous avez choisi le test $TYPE_TEST."
for i in "${!DISKS[@]}" #Boucle de test sur l'INDEX de chaque disque (présence du ! )
do
DISK_MOUNT="${DISKS[$i]}"
DUREE_TEST_POLLING=($(/usr/sbin/smartctl -c "$DISK_MOUNT" | grep "polling" | grep -Eo '[0-9]{1,}' | paste -sd ' ')) #Extraction des temps de polling dans les capacites SMART du disque (seulement le chiffre, en minutes).
TEMPS_SHORT[$i]="${DUREE_TEST_POLLING[0]}" #Alimentation de l'array pour les temps courts
TEMPS_LONG[$i]="${DUREE_TEST_POLLING[1]}"
done
for i in "${!DISKS[@]}"
do
DISK_MOUNT="${DISKS[$i]}"
if [ "$TYPE_TEST" == "short" ]; then
DUREE_TEST="${TEMPS_SHORT[$i]}"
else
DUREE_TEST="${TEMPS_LONG[$i]}"
fi
ARRAY_TEMPS+=($DUREE_TEST)
MODEL=($(/usr/sbin/smartctl -i $DISK_MOUNT | grep "Device Model:" | sed "s/Device Model: //g"))
echo "Le selftest pour le disque ${MODEL[@]} ($DISK_MOUNT) prendra $DUREE_TEST minutes." #Utilisation d'un Array pour MODEL afin de gérer les espaces
done
elif [[ "$TYPE_TEST" != "short" && "$TYPE_TEST" != "long" ]]; then # Si lancé par Cron sans argument valide
"$TYPE_TEST"= long
fi
for i in "${DISKS[@]}" #Boucle de test sur chaque disque
do
if [ "$RUNNING_FROM_CRON" == "0" ]; then
DUREE_TEST_VAN=($(/usr/sbin/smartctl -c "$i" | grep "polling" | grep -Eo '[0-9]{1,}' | paste -sd ' ')) #Extraction des temps de polling dans les capacites SMART du disque (seulement le chiffre, en minutes).
DUREE_TEST=0
for j in "${DUREE_TEST_VAN[@]}"
do
if (("$j" > DUREE_TEST)); then
DUREE_TEST="$j"
fi
done
ARRAY_TEMPS+=($DUREE_TEST)
MODEL=($(/usr/sbin/smartctl -i $i | grep "Device Model:" | sed "s/Device Model: //g"))
echo "Le selftest pour le disque ${MODEL[@]} ($i) prendra $DUREE_TEST minutes."
fi
/usr/sbin/smartctl -t long "$i" > /dev/null 2>&1
/usr/sbin/smartctl -t "$TYPE_TEST" "$i" > /dev/null 2>&1
done
if [ "$RUNNING_FROM_CRON" == "0" ]; then
echo ""
@ -59,32 +90,45 @@ if [ "$RUNNING_FROM_CRON" == "0" ]; then
then TEMPS_MAX="$i"
fi
done
fi
while [ "$FIN_TEST" = "NOK" ] #On boucle tant qu au moins un disque n a pas fini son selftest
do
while [ "$FIN_TEST" = "NOK" ] #On boucle tant qu au moins un disque n a pas fini son selftest
do
ECRIRE="FALSE"
FIN_TEST="OK"
for i in "${DISKS[@]}"
TEMPS=($(date +"%T"))
for i in "${!DISKS[@]}"
do
MODEL=($(/usr/sbin/smartctl -i $i | grep "Device Model:" | sed "s/Device Model: //g"))
if /usr/sbin/smartctl -c "$i" | grep "Self-test routine in progress" > /dev/null 2>&1; then #Si scan non fini
MODEL=($(/usr/sbin/smartctl -i ${DISKS[$i]} | grep "Device Model:" | sed "s/Device Model: //g"))
if /usr/sbin/smartctl -c "${DISKS[$i]}" | grep "Self-test routine in progress" > /dev/null 2>&1; then #Si scan non fini
FIN_TEST="NOK" #On repasse la variable FIN_TEST a FALSE
if [ "$RUNNING_FROM_CRON" == "0" ]; then
TEMPS=($(date +"%T"))
POURCENTAGE_RESTANT=($(/usr/sbin/smartctl -c "$i" | grep "% of test remaining"))
echo "$TEMPS : $POURCENTAGE_RESTANT du selftest restant sur le disque ${MODEL[@]} ($i)."
POURCENT_EXT=($(/usr/sbin/smartctl -c "${DISKS[$i]}" | grep "% of test remaining"))
if [ "${POURCENT_RESTANT[$i]}" != "$POURCENT_EXT" ]; then
POURCENT_RESTANT[$i]="$POURCENT_EXT"
AVANCEMENT[$i]="$TEMPS : $POURCENT_RESTANT du selftest restant sur le disque ${MODEL[@]} (${DISKS[$i]})."
ECRIRE="TRUE" #On écrit seulement si changement sur au moins un disque
fi
else
if [ "$RUNNING_FROM_CRON" == "0" ]; then
echo "$TEMPS : selftest terminé sur le disque ${MODEL[@]} ($i)."
fi
AVANCEMENT[$i]="$TEMPS : selftest terminé sur le disque ${MODEL[@]} (${DISKS[$i]})."
fi
done
echo ""
if [ "$FIN_TEST" = "NOK" ]; then
sleep 5m #On attend pour relancer la boucle de test de statut
if [ "$ECRIRE" == "TRUE" ];then
echo ""
for i in "${!DISKS[@]}"
do
echo "${AVANCEMENT[$i]}"
done
fi
done
if [ "$RUNNING_FROM_CRON" == "0" ]; then
sleep 5s #On attend pour relancer la boucle de test de statut
done
echo ""
for i in "${!DISKS[@]}" #Une fois qu'on est sur la fin du test pour l'ensemble des disques
do
echo "${AVANCEMENT[$i]}"
done
echo ""
echo "**************************************************"
echo "***** TESTS TERMINES ET LOG DISPONIBLE SOUS *****"
echo "************ $LOG *************"
@ -109,4 +153,4 @@ do
done
if [ "$RUNNING_FROM_CRON" == "1" ]; then
cat $LOG | /usr/bin/mailx -s "Sante des disques sur $HOSTNAME" root@$HOSTNAME #envoi de mail
fi
fi