#!/usr/bin/env bash ################################################################################ # Script permettant de vérifier la cohérence entre des depôts Git clonés # et les fichiers présents sur le système ################################################################################ # Copyright © 2019-2020 Alban Vidal - zordhak@debian.org # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . ################################################################################ # Vérifie sur le fichier listant les repo existe, sinon échec # TODO : Mettre à jour le README et expliquer un peu comment fonctionne ce check if [ ! -f /etc/zorval/git-monitored-repos ] ; then echo "ERREUR, le fichier /etc/zorval/git-monitored-repos n'existe pas" echo "Merci de faire un tour sur le dépôt Git suivant :" echo "https://framagit.org/zorval/scripts/check-nrpe" exit 2 fi ################################################################################ RETURN_CODE=0 EXIT_MESSAGE="" ################################################################################ # Pour chaque repo : # - Partie n°1 : git status # - Partie n°2 : boucle pour checker chaque fichier # - Partie n°3 : boucle pour checker les liens symboliques while read REPO ; do # Test si le répertoire existe ou non if [ ! -d $REPO ] ; then RETURN_CODE=1 EXIT_MESSAGE="${EXIT_MESSAGE}\n- HS ${REPO} -> n'existe pas\n" continue # Passage à l'occurence suivante (le check de ce repo est ignoré) fi # On retire l'éventuel '/' à la fin de $REPO, sinon le check ne fonctionne pas REPO=${REPO%/} #------------------------------------------------------------# # Partie n° 1 - git pull et status cd $REPO # pull désactivé car l'utilisateur 'nagios' n'a pas les droits pour puller #git pull > /dev/null 2>&1 OUTPUT=$(git status --porcelain) # Si 'git status' renvoie quelque chose -> Warning if [ ! -z "$OUTPUT" ]; then RETURN_CODE=1 EXIT_MESSAGE="${EXIT_MESSAGE}\n- HS ${REPO} -> 'git status' incorrect." EXIT_MESSAGE="${EXIT_MESSAGE}\n${OUTPUT}" else EXIT_MESSAGE="${EXIT_MESSAGE}\n- OK ${REPO}" fi #------------------------------------------------------------# # Partie n°2 : boucle pour checker chaque fichier FILES=$(find $REPO -type f) # Liste des fichiers dans le dépot # Pour chaque fichier IFS=$'\n' for FILE in $FILES; do # On fait un sha1sum dans le repo git REPO_SHA1SUM=$(sha1sum $FILE | awk '{print $1}') FILE=$(echo $FILE | sed "s,$REPO,,") # Si le fichier existe dans / if [ -f $FILE ]; then # On fait un sha1sum du fichier dans / LOCAL_SHA1SUM=$(sha1sum $FILE | awk '{print $1}') # Si le sha1sum est différent, les fichiers sont différents if [ "$REPO_SHA1SUM" != "$LOCAL_SHA1SUM" ]; then RETURN_CODE=1 EXIT_MESSAGE="${EXIT_MESSAGE}\n diff ${FILE#/} $FILE" fi # Sinon s'il n'existe pas else RETURN_CODE=1 EXIT_MESSAGE="${EXIT_MESSAGE}\n Absent : $FILE" fi done #------------------------------------------------------------# # Partie n°3 : Vérification des liens symboliques présents dans le dépôt LN_REPO=$(find $REPO -type l) # Liste des liens symboliques dans le dépôt for LN in $LN_REPO ; do # On vérifie si il existe en local LN=$(echo $LN | sed "s,$REPO,,") # Test si il existe ou non en local if [ ! -L $LN ] ; then RETURN_CODE=1 EXIT_MESSAGE="${EXIT_MESSAGE}\n Lien absent : $LN" fi done EXIT_MESSAGE="${EXIT_MESSAGE}\n" # Ajoute à retour à la ligne à la fin du check d'un dépôt done < /etc/zorval/git-monitored-repos ################################################################################ if [ $RETURN_CODE -eq 0 ] ; then echo -e "Git OK\n${EXIT_MESSAGE}" else echo -e "Git ERROR\n${EXIT_MESSAGE}" fi exit $RETURN_CODE