#!/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\ # 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)' # 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)' # 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)' 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)' 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)' 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)' # 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)' # 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)' 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)' 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)' 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)' 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)' 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)' # 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)' # 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)' # 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)' # 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)' # 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)' #sudo shutdown -h now fi fi done exit 0