Rolinh

Rolinh' release

Monitorer Son Espace Disque Avec Dfc

Lorsque l’on doit gérer des serveurs, une des choses à prendre en compte est l’évolution du besoin en terme d’espace de stockage. En effet, ceux-ci évoluent au cours du temps et, afin de ne pas être pris de court, un bon administrateur systèmes se doit de mettre en place une solution lui permettant d’être informé de cette évolution. Cela lui permet de pouvoir planifier des mesures en conséquence, telles que l’achat de nouveaux disques durs ou d’un SAN.

Il existe de nombreuses solutions pour effectuer cette tâche mais si vous ne souhaitez pas prendre un bazooka pour tuer une mouche, alors dfc combiné à une tâche cron peut tout à fait faire l’affaire. En effet, depuis sa version 3.0.0, dfc permet l’export vers CSV et HTML, ce qui se révèle bien pratique pour cette tâche.

Dans cet article, je vais vous présenter les bases d’un script capable de relever le taux d’utilisation des disques d’une machine fonctionnant sous Linux, BSD ou OSX et d’envoyer le rapport par e-mail avec les versions en HTML et CSV en pièce jointe.

Il est d’abord nécessaire de définir quelques variables:

1
2
3
4
MAILADDRESS=john.doe@domain.tld
TMPFSREPORTHTML=/tmp/dfc-report.html
TMPFSREPORTCSV=/tmp/dfc-report.csv
BOUNDARY="========== BOUNDARY =========="

Il est également nécessaire de définir la fonction qui s’occupera effectivement de générer les données pour le rapport. À noter que si dfc n’est pas disponible sur le serveur pour une raison ou un autre, la commande df est appelée en remplacement:

1
2
3
4
5
6
7
8
9
10
fsusage() {
    echo "FILESYSTEM SPACE USAGE REPORT"
    if command -v dfc &>/dev/null; then
        echo "$(dfc -t -tmpfs,rootfs,devtmpfs -c never -disTW)"
        dfc -t -tmpfs,rootfs,devtmpfs -c always -disTWo -e html > $TMPFSREPORTHTML
        dfc -t -tmpfs,rootfs,devtmpfs -c never -disTWo -e csv > $TMPFSREPORTCSV
    else
        echo "$(df -Th)"
    fi
}

Étant donné que l’on souhaite envoyer le tout par email, une fonction qui génère son entête s’avère bien utile:

1
2
3
4
5
6
7
8
9
10
11
12
wheader() {
    echo "From: $(hostname -s)@$(hostname --domain)"
    echo "To: $MAILADDRESS"
    echo "Subject: Disk usage report for $(hostname)"
    if command -v dfc &>/dev/null; then
        echo "Mime-Version: 1.0"
        echo -e "Content-Type: Multipart/Mixed; boundary=\"$BOUNDARY\"\n"
        echo "--${BOUNDARY}"
    fi
    echo -e "Content-Type: text/plain\n"
    echo -e "Disk usage report for $(hostname) on $(date)\n"
}

Et puis une autre qui attache les pièces jointes (les fichiers CSV et HTML):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mailattach() {
    if [ -f $TMPFSREPORTHTML ]; then
        echo "--${BOUNDARY}"
        echo "Content-Type: text/html; name="${TMPFSREPORTHTML}
        echo "Content-Disposition: attachment; filename="`basename ${TMPFSREPORTHTML}`
        echo
        cat $TMPFSREPORTHTML
        echo
    fi
    if [ -f $TMPFSREPORTCSV ]; then
        echo "--${BOUNDARY}"
        echo "Content-Type: text/csv; name="${TMPFSREPORTCSV}
        echo "Content-Disposition: attachment; filename="`basename ${TMPFSREPORTCSV}`
        echo
        cat $TMPFSREPORTCSV
        echo
    fi
    echo -e "--${BOUNDARY}--\n"
}

On a désormais tout ce qu’il faut. Il suffit donc simplement d’appeler ces fonctions et d’envoyer le tout par email. Bien évidemment, je considère ici que sendmail ou autre serveur d’envoi est installé et fonctionnel:

1
2
3
4
5
{
    wheader
    fsusage
    mailattach
} | sendmail -i -t

Pour bien faire, il faudrait générer un fichier de log mais je n’estime pas que des explications soient nécessaires pour cela.

EDIT: dfc se trouve sur ici s’il n’est pas déjà disponible en version >= 3.0.0 dans les dépôts de votre distribution.