| | | | |

Création d’un rapport system & envois par mail

Sur des serveurs, serveurs distant ou VPS, il est souvent intéressant d’avoir des rapports sur l’état actuelle de la machine. Par exemple combien d’espace libre il reste sur le disque ou en mémoire etc.

Dans cette article on va extraire les informations rechercher et les intégrer dans un fichier.

Affichage de l’espace disque disponible sur le serveur

On va commencer par extraire l’espace disque disponible avec la commande:
df -h
Quelque chose de similaire devrais s’afficher:

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        15G  2.8G   11G  21% /
devtmpfs        430M     0  430M   0% /dev
tmpfs           462M     0  462M   0% /dev/shm
tmpfs           462M   47M  415M  11% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           462M     0  462M   0% /sys/fs/cgroup
/dev/mmcblk0p1  253M   49M  204M  20% /boot
tmpfs            93M     0   93M   0% /run/user/1000

Dans cette exemple on a d’autre informations qu’on ne veut peut-être pas voir.
On va appliquer un filtre avec la commande suivante:
df -h | grep /dev/root
/dev/root est le dossier qu’on désire voir. Cette exemple a été fais sur un RaspBerry Pi. Si on est sur un autre serveur tel qu’un VPS OVH, le dossier change.

Ce qui s’affiche est réduit au minimum mais ça devrais déjà nous être utile.

/dev/root 15G 2.8G 11G 21% /

Pour conserver une trace de nos information, on va l’ajouter à un fichier.
On rajoute >> à la fin de la ligne de commande et le nom de fichier au quel on veut ajouter les infos:
df -h | grep /dev/root >> InfoSystem.txt

Pour afficher le contenu du fichier on utilise la commande:
cat InfoSystem.txt

Si on répète la commande df -h | grep /dev/root >> InfoSystem.txt et qu’on regarde à nouveau le contenu du fichier avec la commande cat InfoSystem.txt , on peut voir qu’il affiche deux lignes.
Ceci est du au deux >> qu’on a mit sur la commande df -h | grep /dev/root >> InfoSystem.txt . Si on met un seul > , le fichier original est effacer et une seul ligne est écrite dans le fichier.

Pour donner un peu plus de forme au fichier, on va exécuter les deux ligne suivante:
df -h | grep Filesystem > InfoSystem.txt
df -h | grep /dev/root >> InfoSystem.txt

La première commande va effacer le fichier originel et y a jouter le titre extrait de la commande df .
La deuxième commande, va extraire l’espace disponible sur le disque et le rajouter au fichier.
Si on regarde le contenu du fichier avec la commande cat InfoSystem.txt , on a un semblant de tableau avec le titre et les résultats en dessous.

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        15G  2.8G   11G  21% /

Affichage de la mémoire libre du serveur

La commande free , nous permet d’avoir un aperçu de la mémoire vive libre sur notre system.
On va utiliser la commande free -h et l’ajouter au fichier existant sans effacer son contenu initial.
free -h >> InfoSystem.txt

Le nouveau fichier devrais contenir quelque chose de similaire à ceci:

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        15G  2.8G   11G  21% /
              total        used        free      shared  buff/cache   available
Mem:          923Mi       187Mi       146Mi        46Mi       588Mi       635Mi
Swap:          99Mi       1.0Mi        98Mi

Affichage du nom du serveur

Si on a plusieurs machine qui nous font de beau rapport de ce type, il faut encore savoir les identifier. On ajoute le nom de la machine au fichier avec la commande hostname :
hostname >> InfoSystem.txt

Affichage de la date et de l’heure du serveur

Si on analyse à nouveau le contenu du fichier, on a déjà pas mal d’informations mais on sais pas quand elles ont été ajouter au fichier. On va donc ajouter la date et l’heure avec la commande date:
date >> InfoSystem.txt

Affichage de l’adresse IP Public du serveur

Une autre information intéressante, si c’est une machine distante, c’est l’adresse IP public, vu que celle-ci peut changer, il est important d’avoir la plus récente si on veut se connecter en SSH.
On peut utiliser la commande curl https://ipinfo.io/ip , qui renvois juste l’adresse IP public actuelle de la machine.
On ajoute l’adresse IP au fichier avec la commande suivante:
curl https://ipinfo.io/ip
>> InfoSystem.txt

On peut voir le contenu de notre fichier avec la commande cat InfoSystem.txt

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        15G  2.8G   11G  21% /
              total        used        free      shared  buff/cache   available
Mem:          923Mi       187Mi       146Mi        46Mi       588Mi       635Mi
Swap:          99Mi       1.0Mi        98Mi
RaspBerryPi-BE
Wed 15 Jun 15:05:15 CEST 2022
87.64.172.119

Création d’un fichier bash pour automatiser nos commandes

On commence à avoir pas mal d’informations, mais ça fais aussi pas mal de commandes à taper. On va automatiser le tout dans une seul commande avec un fichier bash.
On édite un fichier avec la commande nano .
sudo nano InfoSystem.sh
On ajoute ce qui suite dans le fichier:

#!/bin/sh
echo $(echo "Salut, Voici un petit rapport sur cette machine" > InfoSystem.txt)

echo $(hostname) $(echo -n " - ") $(date) $(echo -n " - IP: ") $(curl https://ipinfo.io/ip)  >> InfoSystem.txt

echo $(echo >> InfoSystem.txt)
echo $(df -h | grep Filesystem >> InfoSystem.txt)
echo $(df -h | grep /dev/root >> InfoSystem.txt)

echo $(echo >> InfoSystem.txt)
echo $(free -h >> InfoSystem.txt)

On enregistre avec “Ctrl” + “x” , “y” , “Entrer”.

Ceci parait bien plus compliquer que les simple commandes. Mais tout a une explication.

  1. #!/bin/sh = indentification du type de fichier
  2. echo $(echo "Salut, Voici un petit rapport sur cette machine" > InfoSystem.txt) = ajout d’un petit message au début du fichier de rapport InfoSystem.txt . Vu qu’il y a que un seul > , le fichier original est effacer et remplacer.
  3. echo $(hostname) $(echo -n " - ") $(date) $(echo -n " - IP: ") $(curl https://ipinfo.io/ip) > InfoSystem.txt = 5 commandes dans une ligne pour avoir un rapport plus compacte.
    echo -n " - " = permet de mettre du texte ou dans ce cas ci un espace suivie d’un trais d’union et d’un autre espace. La même chose plus loin avec IP:
    Quand il y a plusieurs commande suivie dans une trame echo , il faut isolé chaque commande supplémentaire avec $( )
  4. echo $(echo >> InfoSystem.txt) = ajoute juste une ligne vide au fichier.

Le reste des commandes sont identique et expliquer plus haut.

Pour exécuter le fichier créer, on utilise la commande:
sh InfoSystem.sh

Le message suivant devrais apparaitre.

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    13  100    13    0     0     60      0 --:--:-- --:--:-- --:--:--    60

Ceci est du à la commande curl https://ipinfo.io/ip qui récupère l’adresse IP sur un site web.

Voici à quoi pourrais ressembler le fichier une fois la commande suivante exécuter:
cat InfoSystem.txt

Salut, Voici un petit rapport sur cette machine
RaspBerryPi-BE - Wed 15 Jun 16:14:46 CEST 2022 - IP: xxx.xxx.xxx.xxx

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        15G  2.8G   11G  21% /

              total        used        free      shared  buff/cache   available
Mem:          923Mi       189Mi       144Mi        46Mi       588Mi       633Mi

Renommer le fichier avec la date actuelle

Afin de garder un suivie des rapports, on peut aussi les renommer avec la date et l’heure du jour de création. Pour le faire on ajoute la ligne suivante à la fin de notre fichier InfoSystem.sh :
echo $(mv InfoSystem.txt "$(date '+%Y%m%d%H%M').InfoSystem.txt")

La commande mv déplace le fichier vers un autre fichier et dans notre cas un autre fichier avec un autre nom. date '+%Y%m%d%H%M' extrait la date, Y= Année, m=mois, d= jour, H=heure, M=minutes.

Envois du rapport system par mail

Voilà déjà quelque chose de bien intéressant mais le plus intéressant c’est de recevoir les rapport par mail. Dans l’article “ssmtp, envoyer des mail en ligne de commande” , on apprend à installer le logiciel ssmtp qui permet d’envoyer des mails à partir de la ligne de commande.
Pour la suite il faut que ssmtp soit installer.

En rajoutant la ligne suivante avant la ligne qui renomme le fichier de rapport, on envois le contenu du fichier comme contenu du mail à l’adresse email indiquer:
ssmtp -v Votre@Email.com < /home/pi/InfoSystem.txt

Pour l’envois de mail avec une meilleures mise en forme, on peut utiliser la commande suivante:
cat NonDeFichier | mail -s "ObjetDuMail" MailDe@Destination.com
Cette commande utilise mailutils. Il faut donc qu’il ai été installé comme indiquer dans l’article “ssmtp, envoyer des mail en ligne de commande“.

La commande suivant permet d’envoyer un mail avec un sujet/objet, le contenu du mail et une pièce jointe:
cat ContenuMail.txt | mail -s "Sujet du Mail" Votre@Email.com -A PieceJoint.txt

Exemple d’un scripte bash qui récupère les informations du serveur et les envois par mail


#!/bin/sh

# Variable qui contient le nom et emplacement du fichier rapport.
# Cette variable permet de faire moins de modification au fichier et évité les erreurs.
FileN="/home/pi/SysReboot.txt"

echo $(echo "Salut, c'est ") $(hostname) $(echo -n ". On est le ") $(date) $(echo " et je viens de démarrer.") > $FileN

# Récupération de l'adresse IP public
echo $(echo -n " - IP: ") $(curl https://ipinfo.io/ip) >> $FileN
# Récupération du nom d'hôte sur public sur internet
echo $(echo -n " - IP: ") $(curl https://ipinfo.io/hostname) >> $FileN

# Ajout d'une ligne vide au fichier.
echo $(echo >> $FileN)
# Ajout de la ligne de titre de la fonction df.
echo $(df -h | grep Filesystem >> $FileN)
°Ajout de la ligne qui nous intéresse.
echo $(df -h | grep /dev/root >> $FileN)

# Ajout d'une ligne vide au fichier.
echo $(echo >> $FileN)
# Ajout de la mémoire libre au fichier.
echo $(free -h >> $FileN)

# Envois du mail avec la commande mail.
cat $FileN | mail -s "SystemBoot" MailDe@Destination.com

# Une autre commande qui permet d'envoyé le mail avec un sujet/objet, un contenu et un pièce jointe.
#cat ContenuMail.txt | mail -s "Sujet du Mail" Votre@Email.com -A PieceJoint.txt

# Renommage du fichier original avec un nom de fichier contenant la date.
echo $(mv $FileN "$FileN $(date '+%Y%m%d%H%M')")

Exécution des scripte automatiquement

crontab permet de démarrer des scripte ou commandes en arrière plan à des date et heures prédéfini. Il est aussi possible de programmer des scripte ou commandes au démarrage du system.

La commande crontab -e permet d’éditer le fichier Cron.

Pour programmer l’exécution d’un scripte à 22h30, on ajoute la ligne suivante en fin de fichier:
30 22 * * * sh /home/pi/Scripte.sh

Habituellement le temps est défini par des * . Chaque * a une fonction décrite ci-dessous.
1ère * 0 à 59, pour définir les minutes.
2ème * 0 à 23 pour définir l’heure.
3ème * 1 à 31 pour définir le jour du mois.
4ème * 1 à 12 pour définir le mois, peut aussi être écrit avec le libellé anglais (jan ; feb ; mar ; apr ; etc.)
5ème * de 1 (lundi) à 7 (dimanche) pour définir le jour de la semaine, peut aussi être défini avec le libellé abrégé anglais (sun ; mon ; tue ; wed ; thu ; fri ; sat)

On peut aussi programmer un scripte au démarrage du system avec la commande suivante:
@reboot delay 30 && /home/pi/SrcipteDemmarage.sh
L’option delay permet de retarder le démarrage du scripte de 30 seconde.

Pour donner suite à notre scripte créer plus haut, on va le programmer pour qu’il se démarre toute les semaine le lundi à 0h00. Avant de programmer Cron, il faut qu’on rend le fichier exécutable.

On utilise la commande suivante pour le faire:
sudo chmod +x InfoSystem.sh

Puis on édite le fichier Cron avec la commande:
sudo crontab -e

On ajoute la ligne suivante en fin de fichier:
0 0 * * 1 sh /home/pi/InfoSystem.sh

On enregistre avec “Ctrl” + “x” , “y” , “Entrer”.

On redémarre Cron avec la commande:
sudo systemctl restart cron

Normalement le scripte devrais se démarrer tout les lundi à 0h00 et envoyer un mail avec le contenu prédéfini.

mes sources:
https://phoenixnap.com/kb/ubuntu-20-04-change-hostname
https://www.freecodecamp.org/news/shell-scripting-crash-course-how-to-write-bash-scripts-in-linux
https://www.linuxtricks.fr/wiki/print.php?id=752
https://mailutils.org/
https://www.quennec.fr/trucs-astuces/syst%C3%A8mes/gnulinux/commandes/fichiers-dossiers/rendre-un-fichier-ex%C3%A9cutable
https://fr.linux-console.net/?p=796#gsc.tab=0
https://doc.ubuntu-fr.org/cron

Laisser un commentaire