Script : Sauvegarde des attributs POSIX de fichiers

Ce script exporte les attributs POSIX des fichiers et répertoires d’un répertoire passés en argument.

Dans le cadre de la sauvegarde de certain répertoire, il arrive que les attributs de fichiers (uid, gid, date de dernier accès, date de dernière modification) ne soient pas sauvegardés ou restauré correctement. Ce script exporte au format « csv » les attributs des fichiers et répertoires afin de les ré appliquer par la suite.

La version PERL dont est inspirée ce script (publiée dans GNU/Linux Magazine 89) est disponibles sur le site Paris Perl Mongueu(r|se)s sous le titre Perles de Mongueurs (27).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/bin/bash
 
# Définition des binaires :
FIND="/usr/bin/find" ;
STAT="/usr/bin/stat" ;
BASENAME="/bin/basename" ;
CHMOD="/bin/chmod" ;
CHOWN="/bin/chown" ;
TOUCH="/bin/touch" ;
DATE="/bin/date" ;
 
########################################
## NE RIEN MODIFIER APRES CETTE LIGNE ##
########################################
 
# Format de sortie du fichier csv : 
STATFORMAT="%a;%u;%g;%X;%Y;%n" ;
 
# ARRAY : Tableau des valeurs :
# 0 => %a droits du fichier
# 1 => %u propriétaire
# 2 => %g groupe
# 3 => %X atime
# 4 => %Y mtime
# 5 => %n nom du fichier
declare -a ARRAY ;
 
# Fonction de sortie :
die() {
        echo $@ >&2 ;
        exit 1 ;
}
 
# Fonction de test des binaires :
check_binaries() {
        [ -x ${FIND} ] || die "File \"${FIND}\" not found ! Check definition in ${0}." ;
        [ -x ${STAT} ] || die "File \"${STAT}\" not found ! Check definition in ${0}." ;
        [ -x ${BASENAME} ] || die "File \"${BASENAME}\" not found ! Check definition in ${0}." ;
        [ -x ${CHMOD} ] || die "File \"${CHMOD}\" not found ! Check definition in ${0}." ;
        [ -x ${DATE} ] || die "File \"${DATE}\" not found ! Check definition in ${0}." ;
        [ -x ${TOUCH} ] || die "File \"${TOUCH}\" not found ! Check definition in ${0}." ;
        [ -x ${CHOWN} ] || die "File \"${CHOWN}\" not found ! Check definition in ${0}." ;
}
 
# Dump des attributs :
dumpattr() {
        ${FIND} ${DIR} -exec ${STAT} -c ${STATFORMAT} {} \; ;
}
 
# Nomage des données pour attribution :
name_values() {
        if [ -z $@ ] ; then 
                echo "Nothing to do!" >&2 ; return 1 ; 
        fi
        arg=$@ ;
        for i in {0..4} ; do
                ARRAY[i]=${arg%%;*} && arg=${arg#*;} ;
        done
        ARRAY[5]=${arg} ;
        return 0 ;
}
 
# Application des attibuts aux fichiers :
apply_attr() {
        name_values $@ || return 1 ;
        if [ ! -e ${ARRAY[5]} ] ; then 
                echo "File \"${ARRAY[5]}\" not found ! Next !" >&2 ; return 1 ; 
        fi
        [ ! -z ${ARRAY[0]} ] && ${CHMOD} $(printf "%04d" ${ARRAY[0]}) ${ARRAY[5]} ;
        [ ! -z ${ARRAY[1]} -a ! -z ${ARRAY[2]} ] && ${CHOWN} ${ARRAY[1]}.${ARRAY[2]} ${ARRAY[5]} ;
        [ ! -z ${ARRAY[3]} ] && ${TOUCH} -c -a -t $(${DATE} -d @${ARRAY[3]} +'%y%m%d%H%M.%S') ${ARRAY[5]} ;
        [ ! -z ${ARRAY[4]} ] && ${TOUCH} -c -m -t $(${DATE} -d @${ARRAY[4]} +'%y%m%d%H%M.%S') ${ARRAY[5]} ;
        return 0 ;
}
 
# Fonction principale du script :
main () {
        case $(${BASENAME} $0) in 
                "attr2csv")
                        DIR=${1:-./} ;
                        dumpattr ;;
                "csv2attr")
                        SAVEIFS=${IFS}
                        IFS="" 
                        while read line ; do
                                apply_attr $line ;
                        done ;
                        IFS=${SAVEIFS} ;;
                *)
                        echo "$0 unknown. Expected \"attr2csv\" or \"csv2attr\"" ;;
        esac
        exit 0 ;
}
 
# Appel des fonctions :
check_binaries ;
main $@ ;

Télécharger le script « attr2csv ».

Mise en place

Copier le script sous « /sbin/attr2csv » avec les droits « 500 » puis créer un lien « /sbin/csv2attr » pointant vers « /sbin/attr2csv ».

Exemple d’utilisation

Sauvegarde des attributs POSIX du contenu du répertoire « ~fhh/tmp/test/ » dans le fichier « ~/perms.csv » :

mafalda ~ # cd ~fhh/tmp/test/
mafalda test # attr2csv > ~/perms.csv
mafalda test # cat ~/perms.csv 
755;1000;100;1253969328;1254152180;./
644;1000;100;1254152180;1254152180;./toto;echo coucou
777;1000;100;1253993582;1253993582;./toto;essai
644;1000;100;1254004204;1254004204;./toto et arrivé
6755;1000;100;1253969328;1253969328;./toto

Modification des dates de derniers accès puis modification des paramètres de certains fichiers. Vérification des modifications avec « attr2csv » :

mafalda test # touch *
mafalda test # chmod a-s,a+rwx toto
mafalda test # attr2csv 
755;1000;100;1253969328;1254152180;./
644;1000;100;1254156853;1254156853;./toto;echo coucou
777;1000;100;1254156853;1254156853;./toto;essai
644;1000;100;1254156853;1254156853;./toto et arrivé
777;1000;100;1254156853;1254156853;./toto

Les permissions sur les fichiers ont été modifiés et les dates de derniers accès également.

Restauration des anciens droits et des permissions :

mafalda test # csv2attr < ~/perms.csv

Vérification de la bonne restitution des permissions :

mafalda ~ # attr2csv ~fhh/tmp/test/
755;1000;100;1253969328;1254152180;/home/fhh/tmp/test/
644;1000;100;1254152180;1254152180;/home/fhh/tmp/test/toto;echo coucou
777;1000;100;1253993582;1253993582;/home/fhh/tmp/test/toto;essai
644;1000;100;1254004204;1254004204;/home/fhh/tmp/test/toto et arrivé
6755;1000;100;1253969328;1253969328;/home/fhh/tmp/test/toto
Références

La version PERL du script sur le site Paris Perl Mongueu(r|se)s : http://articles.mongueurs.net/magazines/perles/perles-27.html

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *