Retrouver un fichier modifié par Puppet dans le Filebucket local

Qui n’a pas, un jour, eu besoin de récupérer une version de fichier écrasée par Puppet ?
Pas vous n’est-ce pas ? Car vous ne modifiez jamais vos fichiers managés par Puppet localement sur une machine client bien sûr !
Toutefois, ce cas peut-être utile :

Le script suivant va vérifier dans le /var/log/message les fichiers modifiés par Puppet et vous donne l’emplacement de la sauvegarde du fichier modifié dans le Filebucket. Pour récupérer le contenu du fichier correspondant, faire un cat ou un cp

Tout cela n’est bien entendu possible que si le filebucket local n’est pas désactivé sur les clients.

Ce script est applicable à la version Community (Open Source), toutefois, il est facilement transposable à la version Enterprise.

 

#/bin/bash
# Recherche dans le /var/log/messages
#Exemple :
# Oct 28 11:01:36 mylocallinux puppet-agent[30297]: (/File[/etc/pam.d/system-auth]/content) content changed '{md5}36d487e07f2e30531c562e0e406dc4ad' to '{md5}e6e84846529165d489eb6ffb59e4e225'

color_diff() {
        sed 's/^  -/  \x1b[31m-/;s/^  +/  \x1b[32m+/;s/^  @/  \x1b[34m@/;s/$/\x1b[0m/'
}

BOLD=$(echo    -e '\x1b[1m')
REGULAR=$(echo -e '\x1b[0m')
RED_INV=$(echo -e '\x1b[41m')
NO_INV=$(echo  -e '\x1b[49m')

show() {
        file=$(echo $4 | sed -e 's,^(/File\[\([^]]\+\).*,\1,')
        from=$(echo $5 | sed -e 's/.*{md5}\([[:xdigit:]]\+\).*/\1/')
        to=$(echo $6 | sed -e 's/.*{md5}\([[:xdigit:]]\+\).*/\1/')
        #echo "*** $1 $2 $3 $4 $5 $6 ***"
        echo "${BOLD}$1 $2 $3 $file changed:$REGULAR"
        ffrom=$(find /var/lib/puppet/clientbucket/ -type d -name $from)
        fto=$(find /var/lib/puppet/clientbucket/ -type d -name $to)
        if [ -e "$ffrom" -a -e "$fto" ] ; then
                diff -u $ffrom/contents $fto/contents | sed -e 's/^/  /' | color_diff
        elif [ -e "$ffrom" -a ! -e "$fto" ]; then
                curr_md5=$(md5sum $file | cut -d " " -f 1)
                if [ "$to" = "$curr_md5" ];then
                        diff -u $ffrom/contents $file | sed -e 's/^/  /' | color_diff
                else
                        echo "  ${RED_INV}ERROR: can't diff from '$from' and '$to'. '$to' doesn't exist.$NO_INV"
                fi
        else
                echo "  ${RED_INV}ERROR: '$from' or '$to' doesn't exist.$NO_INV"
        fi
}

grep -h puppet-agent /var/log/messages{-*,} \
        | awk '{ if ($5 ~ /puppet-agent.*/ && ($7 " " $8  ~ /content changed/) ) {print $0}; }' \
        | while read month day time host process file content changed from _to to; do
        if [ "$content $changed" = "content changed" ]; then
                show $month $day $time $file $from $to
        fi
done