Blog geekesque... ou presque

Aller au contenu | Aller au menu | Aller à la recherche

Décrypteur de log rsync

Comme beaucoup de monde, j'utilise rsync de manière automatisée pour effectuer mes sauvegardes mais les logs sont difficilement interprétables d'un simple regard. J'ai donc décidé de me faire un petit analyseur qui me permettra d'avoir un rendu bien plus lisible. Et en couleur pour que ce soit encore plus visuel.

Le rendu sera, pour chaque ligne de log rsync:

  • l'action effectuée (upload, download, suppression, modification ou ignore)
  • le type de contenu (fichier, répertoire, lien symbolique)
  • le nom du contenu traité
  • les raisons de la modification

A la fin de l'analyse, un comptage des différentes actions sera affiché.

Les logs rsync

Le log se compose de deux parties : le détail de l'opération et l'item traité. Je parle d'item car il peut s'agir d'un répertoire, d'un fichier ou d'un lien symbolique.

La partie détail de l'opération est celle qui nous intéresse le plus, mais aussi la moins parlante. Il s'agit d'une chaîne de 11 caractères, chacun ayant sa signification. Je n'expliquerait que les valeurs les plus fréquentes et les plus utiles. On peut considérer que son encodage est le suivant: YXcstpoguax. Les deux premiers caractères peuvent prendre différentes valeurs:

  • Y est l'action réalisée
    • < est un envoi (upload)
    • > est une réception (download)
    • c est une modification ou création locale (le fichier local est mis à jour depuis le serveur distant)
    • . est le symbole d'ignorance. Cela signifie que l'item en lui-même n'est pas modifié, mais certains de ses attributs peuvent l'être
    • * indique un message, par exemple deleted
  • X est le type de ressource modifiée
    • f pour un fichier
    • d pour un répertoire
    • L pour un lien symbolique

Les suivants sont des opérateurs quasi-booléens. Dans le cas des opérations de modification, ils prennent soit la valeur . (rien de modifié) soit la lettre qui leur est affectée. Dans les cas d'upload et de download, ils prennent tous la valeur + et dans le cas d'un message, la valeur n'a pas d'intérêt, c'est le message complet qui est utile.

  • c : différence de checksum pour les fichiers, changement de destination pour un lien symbolique
  • s : différence de taille
  • t : différence d'heure de modification. On peut rencontrer T, qui signifie que l'heure de modification est ajustée à l'heure de transfert.
  • p : différence de permissions
  • o : différence de propriétaire
  • g : différence de groupe
#!/bin/bash
 
R='\033[0;31m'
G='\033[0;32m'
y='\033[1;33m'
B='\033[0;34m'
NC='\033[0m'
 
function join { local IFS=', '; echo "$*"; }
 
function getdetals {
   local reason=()
   local line=$1
   local target=${line:11}
   case ${line:0:1} in
      f ) type="file";;
      d ) type="directory";;
      L ) type="symlink";;
      D ) type="device";;
      S ) type="special";;
      * ) type="unknown";;
   esac
   if [ "${line:1:1}" = "c" ]; then reason+=('checksum'); fi
   if [ "${line:2:1}" = "s" ]; then reason+=('size'); fi
   if [ "${line:3:1}" = "t" -o "${line:3:1}" = "T" ]; then reason+=('time'); fi
   if [ "${line:4:1}" = "p" ]; then reason+=('permission'); fi
   if [ "${line:5:1}" = "o" ]; then reason+=('owner'); fi
   if [ "${line:6:1}" = "g" ]; then reason+=('group'); fi
   if [ "${line:1:9}" = "+++++++++" ]; then reason+=('added'); fi
   echo "${type} ${target} ($(join ${reason}))"
}
 
if [ $# -eq 0 ]
then
   echo -e "${R}Error${NC} No file given"
   exit 0
elif [ ! -f $1 ]
then
   echo -e "${R}Error${NC} Cannot find ${B}$1${NC}"
   exit 0
else
   LOGFILE=$1
fi
 
declare -A count=([down]=0 [up]=0 [del]=0 [ign]=0 [mod]=0)
 
echo -e "*** Loading ${LOGFILE} ***"
 
IFS=$'\n'
for line in $(cat ${LOGFILE})
do
   op=${line:0:1}
   line=${line:1}
   case ${op} in
      [\>] ) action="${B}<== `getdetals ${line}`${NC}"; ((count[down]++));;
      [\<] ) action="${G}==> `getdetals ${line}`${NC}"; ((count[up]++));;
      [\*] ) msg=${line:0:10};action="${R}${msg^^} ${line:11}${NC}"; ((count[del]++));;
      [\.] ) action="${Y}IGNORED `getdetals ${line}`"; ((count[ign]++));;
      c ) action="${Y}MODIFIED `getdetals ${line}`${NC}"; ((count[mod]++));;
   esac
   echo -e $action
done
 
echo "*******************************************"
echo " Downloaded: ${count[down]}"
echo " Uploaded: ${count[up]}"
echo " Deleted: ${count[del]}"
echo " Ignored: ${count[ign]}"
echo " Modified: ${count[mod]}"

Commentaires

1. Le samedi 12 août 2017, 00:18 par father

Wonderfսl Ьeat ! I would lіke to apprentice while you amеnd your site, how coulɗ
i subscribe for a blog weƅsite? The account helped me
a acceptabⅼe deal. I had Ьeen tiny bit acquainted of this your broadcast offered bright clear concept

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

La discussion continue ailleurs

URL de rétrolien : https://www.g33k-zone.org/index.php?trackback/109

Fil des commentaires de ce billet