scripts de surveillances

Il s’agit de surveiller certains paramètres du serveur/poste de travail via des scripts. Ceux ci pourront envoyer des mails d’alertes, et pourront être planifiés à intervalles réguliers (une fois / jour par exemple). Ces scripts sont des idées de base à modifier selon les circonstances. (celà me sert également de pense bête pour éviter de réinventer la roue à chaque install.. ;-) )

Espace disque disponible

Ce script va surveiller l’espace disque disponible dans chaque partition, et remontera une alerte si on dépasse le seuil.
Il vaégalement  créer un fichier de log dans /var/log.

#!/bin/bash
# script surveillances (espaces disques ..)
# et envoi alertes par mail
# maj :         ronan le 13/8/09
#               (editer nailrc et ajouter smtp=)
now=$(date +%a-%d-%b--%HH%M)
jour=$(date +%d)
destinataire="adresse@fai.fr"
# % espace disque occupé sur partitions locales :
#df -hl | awk '{ print $5 }'|grep %|cut -d% -f 1
df -k | grep /dev | while read FS
do
FS_NAME=`echo $FS | awk -F' ' '{print $6}'`
FS_SIZE=`echo $FS | awk -F' ' '{print $5}'|cut -d% -f1`
if [ $FS_SIZE -gt 95 ]; then
echo "NOM - $now  serveur nom_serveur : partition $FS_NAME utilise ${FS_SIZE}% !" > /var/log/espace-disque-$jour.log
echo "." >> /var/log/espace-disque-$jour.log
#cat /var/log/espace-disque-$jour.log | nail -s "alerte--serveur" -r ronan@DOMAIN $destinataire
mail -s "alerte-nom_serveur"  $destinataire < /var/log/espace-disque-$jour.log
fi
done

Autre version pour l’espace disque :

(requiert le paquet « nail »)

#!/bin/bash
# script surveillances (espaces disques ..)
# et envoi alertes par mail ou nail
# maj :         ronan le 15/2/11
#               (editer nailrc et ajouter smtp=   ou indiquer serveur smtp dans nail
now=$(date +%a-%d-%b--%HH%M)
jour=$(date +%d)
destinataire="destinataire@domaine.com"
sujet="mail automatique : Serveur passerelle : espace disque"
serveur=126.0.0.13
expediteur="expediteur@domaine-local.fr"

# % espace disque occupé sur partitions locales :
#df -hl | awk '{ print $5 }'|grep %|cut -d% -f 1
df -k | grep /dev | while read FS
do
FS_NAME=`echo $FS | awk -F' ' '{print $6}'`
FS_SIZE=`echo $FS | awk -F' ' '{print $5}'|cut -d% -f1`
if [ $FS_SIZE -gt 95 ]; then
echo "NOM - $now  serveur nom_serveur : partition $FS_NAME utilise ${FS_SIZE}% !" > /var/log/espace-disque-$jour.log

 echo "." >> /var/log/espace-disque-$jour.log
 #cat /var/log/espace-disque-$jour.log | nail -s "alerte--serveur" -r ronan@DOMAIN $destinataire
# mail -s "alerte-nom_serveur"  $destinataire < /var/log/espace-disque-$jour.log
#exemple de commande : nail -s "$sujet" -S smtp=$serveur -r "$expediteur" -a "$piecejointe" $destinataire < /tmp/$now.txt
nail -s "$sujet" -S smtp=$serveur -r "$expediteur"  $destinataire < /var/log/espace-disque-$jour.log

fi
done

Surveillance Charge machine

Il s’agit ici de surveiller la charge machine, et d’envoyer une alerte si elle persiste trop longtemps. Il est à planifier toutes les heures. (mise à jour 28nov : swap dispo)

#!/bin/bash
# surveillance charge machine
# uptime |cut -d' ' -f 12 |cut -d',' -f 1
seuil=2
now=$(date +%a-%d-%b--%HH%M)
jour=$(date +%d)
destinataire="adresse@fai.fr"
swapmini=100000
charge=$(uptime |cut -d' ' -f 12 |cut -d',' -f 1 |cut -d'.' -f 1)
charge2=$(uptime |cut -d' ' -f 12 |cut -d',' -f 1)
comptage="/tmp/charge.comptage.log"
# fichier /tmp/charge.comptage.log comptablise alertes consecutives
# si trop nombreuses (nb lignes) on pourra s'en servir pour shooter certains services..
#charge=3 # debugage
# logguer l'etat pour un suivi
uptime >> /var/log/charge-machine-suivi-$jour.log
# tester
if [ $charge -gt $seuil ]; then
echo "Nom - $now serveur nom_serveur: charge $charge2 trop forte > $seuil" > /var/log/charge-machine-$jour.log
echo $now >> $comptage
nbAlertes=$(cat $comptage |wc -l)
if [ $nbAlertes -gt 1 ]; then
echo "nb alertes consecutives : $nbAlertes" >> /var/log/charge-machine-$jour.log
fi
echo "." >> /var/log/charge-machine-$jour.log
mail -s "Alerte-charge-Nom_Serveur"  $destinataire < /var/log/charge-machine-$jour.log
else
if [ -e $comptage ]; then
echo "retour normale $now" >> /var/log/charge-machine-$jour.log
rm /tmp/charge.comptage.log
# envoyer mail retour normale
echo "Nom : retour normale - $now serveur nom_serveur: charge $charge2" > /tmp/mail.txt
echo "." >> /tmp/mail.txt
mail -s "retour-normale-charge-Nom_Serveur"  $destinataire < /tmp/mail.txt
rm /tmp/mail.txt
fi
fi
# surveillance SwapFree
SwapTotal=$(sed -n '/SwapTotal/{s/[^0-9]*//g;p}' /proc/meminfo)
SwapDispo=$(sed -n '/SwapFree/{s/[^0-9]*//g;p}' /proc/meminfo)
#echo "SwapFree = $MEM"
if [ $SwapDispo -lt $swapmini ]; then
 echo "monNom - $now serveur : swap $SwapDispo/$SwapTotal < $swapmini !" > /var/log/charge-machine-swap-$jour.log
 mail -s "Alerte-Swap-serveur"  $destinataire < /var/log/charge-machine-swap-$jour.log
fi

Un script de sauvegarde d’une machine du réseau

Un serveur win en 192.168.0.1 a un dossier dans lequel il génère une sauvegarde (ou tout autre fichier(s) ) que l’on souhaite archiver sur le linux. Il existe un dossier (vide) sur le linux /mnt/windows pour monter le partage réseau.

#!/bin/bash
# script copie fichier sur le reseau, archivage et log
#ronan le 31/12/10
#
dossier="/home/toto/sauveg.win/etat.system"     # dossier sur linux
sourcewin="sauveg.systeme"                      # dossier sur windows
fichier="sauveg.system.state.bkf"               # nom fichier
ipserveurwin="192.168.0.1"                        # ip serveur win
partagewin="C$"                                      # nom partage sur le win
loginwin="administrateur"          # nom login sur le win
passewin="12345678"              # mot de passe sur le win
now=$(date +%F)                                 #date aujourd'hui
mois=$(date +%m)                                #numero mois
annee=$(date +%Y)                               #numero annee
anneePrec=$(date +%Y)                           #numero annee precedente
        let "anneePrec -= 1"
fichierLog="/home/toto/sauvegarde.syst.$mois-$annee.log" # fichier log
#
#supprimer fichier log de l'annee precedente
/bin/rm -f /home/toto/sauvegarde.syst.$mois-$anneePrec.log
#
# logguer debut action
echo "debut copie system state" >> $fichierLog
date >> $fichierLog
#
#renommer ancien fichier sauvegarde
mv $dossier/$fichier $dossier/$fichier.$now
#
# montage
mount -t cifs -o username=$loginwin,password=$passewin //$ipserveurwin/$partagewin /mnt/windows/
#
#copie :
#    si le fichier existe sur le win :
if test -f /mnt/windows/$sourcewin/$fichier; then
        cp /mnt/windows/$sourcewin/$fichier $dossier/
        #echo " * OK fichier $fichier existe dans $dossier"
else
        echo " *** ERREUR fichier source $fichier inaccessible dans $dossier !"
        echo "---" >> $fichierLog
        echo " *** ERREUR fichier source $fichier inaccessible dans $dossier !" >> $fichierLog
        echo "---" >> $fichierLog
fi
#
#demontage
umount /mnt/windows
#
#droits
chown toto.users $fichierLog
chown toto.users $dossier/$fichier
#
#fin
date >> $fichierLog
echo "---" >> $fichierLog

Archiver un fichier d’un dossier et conserver un historique sur 5 jours de le semaine.

À coupler avec le script ci dessus (sauvegarde machine réseau) qui gère le fichier de log (suppression du log ancien.) On aurait pu mettre ces logs dans /var/log/ mais dans mon besoin l’utilisateur « toto » devait pouvoir les consulter directement.

#!/bin/bash
#ronan le 31/12/10
# archive le .tar des donnees
#    --> avec historisation sur une semaine

fichier="sauveg.donnees.tar"            #nom fichier
dossier="/home/toto/sauveg/donnees" #emplacement sauvegarde
now=$(date +%u)                         #numero du jour dans la semaine
mois=$(date +%m)                        # numero mois
annee=$(date +%Y)                       # annee
fichierLog="/home/toto/sauvegarde.syst.$mois-$annee.log" # fichier log

#si fichier existe :
if test -f $dossier/$fichier; then
        #archiver fichier
        echo "-- archivage donnees $fichier dans $fichier.$now" >> $fichierLog
        /bin/mv -f $dossier/$fichier $dossier/$fichier.$now
        date >> $fichierLog
else
        echo " *** ERREUR fichier $fichier illisible dans $dossier !"
        echo " ***" >> $fichierLog
        echo " *** ERREUR fichier $fichier illisible dans $dossier !" >> $fichierLog
        date >> $fichierLog
fi

et voilà !