#!/bin/bash
# dès qu'une erreur est la -> on quitte le programme -> pour le dev
set -e; set -u
# pour debogage
#set -x
#Regle bash
# 'commande première partie'"$VARIABLE"'commande deuxième partie'
# SI BESOIN installer mailutils
USERMAIL=usermail
#USERSENDMAIL=user
#USERDESTMAIL=user
#DOMAIN_MAIL=domain.org
#function envoie_mail {
# FROM=myuser\<user@domain.org\>
# TO=user@domain.org
# NIVEAU_ALERTE=
# su - myuser -c '(echo "SRV HDD1 - Alerte niveau 2/4 : PERCENT_USED = ${PERCENT_USED}" | mail -s "[URGENT] - SRV HDD1 - Al>
#}
# N° de série du SSD via smartctl
SSD=("CT2000BX500SSD1" # Crucial BX 500 2To
"183076804545" # SanDisk SSD PLUS 240GB
"S62BNF0R615469A" # Samsung SSD 870 EVO 500GB
)
# Tera Bytes en ecriture max vu en datasheet ou sur le net
LISTTBWMAX=("720" # Crucial BX 500 2To
"300" # SanDisk SSD PLUS 240GB
"600" # Samsung SSD 870 EVO 500GB
)
TBWMAX=0
### MONITORING HDD1 /dev/sda POUR BAD BLOCK :
### Current_Pending_Sector & Reallocated sector
# récupération de la date et l'heure du jour ; on obtient ici une valeur telle que "mercredi 31 décembre 2014, 00:15:01" :
DATE=`date +"%A %d %B %Y, %H:%M:%S"`
# récupération de la date et l'heure du jour sous un autre format ; on obtient ici un résultat sous la forme suivante : XX-YY-ZZZZ (ex: 31-12-2014) :
DATE2=`date +"%d-%m-%Y"`
# Collecte des noeuds de disque dur /dev/sda /dev/sdb /dev/sdc , ...
#disk=$(lsblk -l -d -p -n -o NAME,TYPE | awk '($2=="disk"){print $1}')
mapfile -t disk < <(lsblk -l -d -p -n -o NAME,TYPE | awk '($2=="disk"){print $1}')
echo "${#disk[@]}"
# Pour chaque disque identifié, on analyse les attributs
for d in "${disk[@]}"
#echo ${disk[@]} | while read d ;
do
REALLO=""
PENDING=""
TYPE=""
NAME=""
PERCENT_USED=""
TOTALWRITTEN=""
SECTORSIZE=""
TBWMAX=""
echo "COMMENCEMENT"
echo "$d"
DISK=$d
DISK_sub="$(basename $d)"
#DISK_sub=$($d | cut --delimiter=/ --fields=2)
#echo $DISK
echo $DISK_sub
#DISK=/dev/sda
# définition du chemin du répertoire à créer :
#REP="/home/jo/Monitoring_hdd1/"
REP="/root/Monitoring_hdd_$DISK_sub/"
# Si le répertoire n'existe pas on le crée
if [ ! -d "$REP" ];then
mkdir "$REP"
fi
# définition du chemin du répertoire à créer :
REP="/root/Monitoring_hdd_$DISK_sub/$DATE2"
# le fichier à créer dans ce répertoire est "pending_sector.csv"
FICHIER="${REP}/pending_sector.csv"
# Si le répertoire n'existe pas on le crée
if [ ! -d "$REP" ];then
mkdir "$REP"
fi
# Si le fichier n'existe pas on le crée et on y injecte les en tete
if [ ! -f "$FICHIER" ];then
touch "$FICHIER" &&
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo "Reallocated bad sectors,pendings sectors" ) > "$FICHIER"
fi
TYPE="$(smartctl -a $DISK | grep 'Rotation Rate:' | awk '{print $3$4$5}')"
NAME="$(smartctl -a $DISK | grep 'Device Model' | awk '{print $3}')"
echo "$TYPE"
#CAS DES SSD
############
if [ "$TYPE" = "SolidStateDevice" ]; then
#echo $(smartctl -a $DISK | grep 'Total_LBAs_Written' | awk '{print $10}')
# Récupération des attributs nécessaire
PERCENT_USED="$(smartctl -a $DISK | grep 'Percent_Lifetime_Remain' | awk '{print $10}')"
TOTALWRITTEN="$(smartctl -a $DISK | grep 'Total_LBAs_Written' | awk '{print $10}')"
SECTORSIZE="$(smartctl -a $DISK | grep 'Sector Size' | awk '{print $3}')"
# SI SSD NE RENVOIE PAS LE POURCENTAGE UTILISE de Tera Bytes, on le calcul POURCENT_USED=[(TBW*SECTOR_SIZE)/10e-12]
for i in "${!SSD[@]}"
do
#echo ${SSD[$i]}
if [ ${SSD[$i]} == "CT2000BX500SSD1" ]; then
TBWMAX=${LISTTBWMAX[$i]}
#echo "i : ",$i
#echo $TBWMAX
else
echo "NO"
fi
done
# CAS 1 CLASSIQUE -> SI attribut pourcentage_used!=0
if [ -n "$PERCENT_USED" ]; then
echo $PERCENT_USED
if [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 20 ] && [ "$PERCENT_USED" -lt 30 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 1/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 1/4" -aFrom:user\<user@domain.org\> user@domain.org)'
#
elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 30 ] && [ "$PERCENT_USED" -lt 50 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 2/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 2/4" -aFrom:user\<user@domain.org\> user@domain.org)'
#
elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 50 ] && [ "$PERCENT_USED" -lt 80 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 3/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 3/4" -aFrom:user\<user@domain.org\> user@domain.org)'
elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 80 ] && [ "$PERCENT_USED" -lt 100 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 4/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 4/4" -aFrom:user\<user@domain.org\> user@domain.org)'
fi
# CAS 2 : BESOIN DE CALCUL DU POURCENTAGE_USED SI Total Written!=0 & TBWMAX!=0
elif [ -z "$PERCENT_USED" ] && [ -n "$TOTALWRITTEN" ] && [ -z "$TOTALWRITTEN" ] && [ -n "$TBWMAX" ]; then
# CALCUL POURCENTAGE UTILISE FONCTION DU PARAM TBWMAX DU SSD
echo $TBWMAX
echo $TOTALWRITTEN
#EXEMPLE -> TOTALWRITTEN=7800211101 octets #SECTORSIZE=512 #TBWMAX (dépend de chaque SSD)=720TB
TBW=$(( ( $TOTALWRITTEN * $SECTORSIZE ) /1000000000000 ))
echo $TBW
PERCENT_USED=$(( ($TBW*100/$TBWMAX) ))
echo $PERCENT_USED
su - $USERMAIL -c '(echo "$HOSTNAME - Disque dur $NAME" | mail -s "CALCUL DU POURCENTAGE UTILISATION TBW - $HOSTNAME -aFrom:user\<user@domain.org\> user@domain.org)'
if [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 20 ] && [ "$PERCENT_USED" -lt 30 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 1/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 1/4" -aFrom:user\<user@domain.org\> user@domain.org)'
#
elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 30 ] && [ "$PERCENT_USED" -lt 50 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 2/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 2/4" -aFrom:user\<user@domain.org\> user@domain.org)'
#
elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 50 ] && [ "$PERCENT_USED" -lt 80 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 3/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 3/4" -aFrom:user\<user@domain.org\> user@domain.org)'
elif [ -n "$PERCENT_USED" ] && [ "$PERCENT_USED" -ge 80 ] && [ "$PERCENT_USED" -lt 100 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${PERCENT_USED}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 4/4 : PERCENT_USED = '"${PERCENT_USED}"'"% | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 4/4" -aFrom:user\<user@domain.org\> user@domain.org)'
fi
# CAS 3 : BESOIN ASSOCIATION TBWMAX A AU TABLEAU EN DEBUG DE PROG
else
su - $USERMAIL -c '(echo "$HOSTNAME - PAS ASSEZ DE DATA POUR TRAITER LE NOUVEAU SSD, PRENDRE ATTRIBUTS SMART POUR CALCUL / OU associer son TBWMAX au tableau du script hdd_bad_block_sda.sh " | mail -s "[URGENT] - $HOSTNAME - PAS ASSEZ DE DATA POUR TRAITER LE NOUVEAU SSD, associer son TBWMAX au tableau du script hdd_bad_block_sda.sh" -aFrom:user\<user@domain.org\> user@domain.org)'
fi
#CAS DES HDD
############
elif [ "$TYPE" != "SolidStateDevice" ]; then
# Reallocated bad sectors
#REALLO=$(smartctl -a /dev/sda | grep 'Reallocated_Sector_Ct' | awk '{print $10}')
REALLO="$(smartctl -a $DISK | grep 'Reallocated_Sector_Ct' | awk '{print $10}')"
# récupération des pendings sectors
#PENDING=$(smartctl -a /dev/sda | grep 'Current_Pending_Sector' | awk '{print $10}')
PENDING="$(smartctl -a $DISK | grep 'Current_Pending_Sector' | awk '{print $10}')"
if [ -z "$PENDING" ]; then
su - $USERMAIL -c '(echo "$HOSTNAME - Revoir Attribut Pending Smartctl : PENDING" | mail -s "[URGENT] - $HOSTNAME - Revoir Attribut Pending Smartctl : PENDING-> du changement HDD ou SSD ou disque Mort" -aFrom:user\<user@domain.org\> user@domain.org)'
elif [ -z "$REALLO" ]; then
su - $USERMAIL -c '(echo "$HOSTNAME - Revoir Attribut Reallo Smartctl : REALLO" | mail -s "[URGENT] - $HOSTNAME - Revoir Attribut Reallo Smartctl : REALLO -> du changement HDD ou SSD ou disque Mort" -aFrom:user\<user@domain.org\> user@domain.org)'
fi
# Reallocated sector -> Prevention des bad sectors HDD
#if [ -n "$REALLO" ] && [ "$REALLO" -ge 0 ] && [ "$REALLO" -lt 5 ]; then
# ( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
#su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 0/5 : reallocated visible < '"${REALLO}"'" | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 0/5" -aFrom:user\<user@domain.org\> user@domain.org)'
# Tests bad sector en attente de reallocation -> si plus de reallocated sector -> perte de data ?
# Current_Pending_Sector < 5 && Reallocated sector > 5
if [ -n "$PENDING" ] && [ -n "$REALLO" ] && [ "$PENDING" -lt 5 ] && [ "$REALLO" -ge 5 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 1/5 : reallocated visible,bad sector < '"${REALLO} ${PENDING}"'" | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 1/5" -aFrom:user\<user@domain.org\> user@domain.org)'
# Current_Pending_Sector (> 5 & < 20) && Reallocated sector > 5
elif [ -n "$PENDING" ] && [ -n "$REALLO" ] && [ "$PENDING" -ge 5 ] && [ "$PENDING" -lt 20 ] && [ "$REALLO" -ge 5 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 2/5 : reallocated visible,bad sector < '"${REALLO},${PENDING}"'" | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 2/5" -aFrom:user\<user@domain.org\> user@domain.org)'
# Current_Pending_Sector (> 20 & < 50) && Reallocated sector > 5
elif [ -n "$PENDING" ] && [ -n "$REALLO" ] && [ "$PENDING" -ge 20 ] && [ "$PENDING" -lt 50 ] && [ "$REALLO" -ge 5 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 3/5 : reallocated visible,bad sector < '"${REALLO},${PENDING}"'" | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 3/5" -aFrom:user\<user@domain.org\> user@domain.org)'
# Current_Pending_Sector (> 50 & < 100) && Reallocated sector > 5
elif [ -n "$PENDING" ] && [ -n "$REALLO" ] && [ "$PENDING" -ge 50 ] && [ "$PENDING" -lt 100 ] && [ "$REALLO" -ge 5 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 4/5 : reallocated visible,bad sector < '"${REALLO},${PENDING}"'" | mail -s "[URGENT] - $HOSTNAME - Alerte niveau 4/5" -aFrom:user\<user@domain.org\> user@domain.org)'
# Current_Pending_Sector > 100 && Reallocated sector > 5
elif [ -n "$PENDING" ] && [ -n "$REALLO" ] && [ "$PENDING" -ge 100 ] && [ "$REALLO" -ge 5 ]; then
( date +"[%m-%d %H:%M:%S]"|tr -d "\n" && echo -n ",${REALLO},${PENDING}" ) >> "$FICHIER"
su - $USERMAIL -c '(echo "$HOSTNAME - Alerte niveau 5/5 : reallocated visible,bad sector < '"${REALLO},${PENDING}"'" | mail -s "[CRITIQUE] - $HOSTNAME - Alerte niveau 5/5" -aFrom:user\<user@domain.org\> user@domain.org)'
#sudo shutdown -h now
fi
fi
done
exit 0