Révision 1

bin/del-iscsi-volume (revision 1)
1
#!/bin/bash
2

  
3

  
4
function usage {
5
  echo "Usage :" 1>&2
6
  echo "$0 [OPTIONS]" 1>&2
7
  echo " -h display this message" 1>&2
8
  echo " -i interactive mode" 1>&2
9
  echo " -T Specify the TID" 1>&2
10

  
11
}
12

  
13
function nointeractive {
14
if [ "$TID2DEL" == "" ]
15
then
16
   echo "Please specify a TID ISCSI" 1>&2
17
   exit 1
18
fi
19
TARGET=$(cat /proc/net/iet/session |grep -i tid:$TID2DEL |cut -d ":" -f3)
20

  
21
TID_FIND=1
22
TID_ISACTIVE=1
23
for line in $(cat /proc/net/iet/session)
24
do
25
  if [ $TID_FIND -eq 0 ]
26
  then
27
     CHECK_STATE=$(echo $line |awk '{ if ( /state:active/ ){ print 0 }else{ print $1 $line} }')
28
     if [ "$CHECK_STATE" = "0" ]
29
     then
30
         TID_ISACTIVE=0
31
     fi
32

  
33
  fi
34
  if [ $TID_ISACTIVE -eq 0 ]
35
  then
36
     echo "iscsi volume in use, please disconnect all clients " 1>&2
37
     exit 1
38
  fi
39
  TID_LISTED=$(echo $line |awk '(/tid:/) { print $1 }')
40
  if [ "$TID_LISTED" != "" ]
41
  then
42
     if [ "tid:$TID2DEL" = "$TID_LISTED" ]
43
     then
44
        TID_FIND=0
45
     else
46
       TID_FIND=1
47
     fi
48
 fi
49
done
50

  
51
ietadm --op delete --tid=$TID2DEL
52
if [ $? -eq 0 ]
53
then
54
   echo "*** La suppression via la commande ietadm s'est termine correctement"
55
   echo ""
56
   echo "*** Vérification et suppression du volume dans le fichier /etc/iet/ietd.conf ..."
57

  
58
   COPY_LINE=0
59
   >/tmp/.buffer_ietd.conf
60
   while read line
61
   do
62
      echo $line |grep -i "^Target"
63
      if [ $? -eq 0 ]
64
      then
65
         COPY_LINE=0
66
      fi
67
      echo $line |grep -i "^Target $TARGET"
68
      if [ $? -eq 0 ]
69
      then
70
         COPY_LINE=1
71
      fi
72
      if [ $COPY_LINE -eq 0 ]
73
      then
74
         echo $line >> /tmp/.buffer_ietd.conf
75
      fi
76

  
77
    done < "/etc/iet/ietd.conf"
78
    echo "*** Sauvegarde du fichier /etc/iet/ietd.conf ..."
79
    TODAY=$(date +%Y%m%d%H%M%S)
80
    cp /etc/iet/ietd.conf /etc/iet/ietd.conf.$TODAY
81
    cp /tmp/.buffer_ietd.conf /etc/iet/ietd.conf
82

  
83

  
84
   echo ""
85
   echo "*** Vérification /proc/net/iet/volume :"
86
   cat /proc/net/iet/volume
87

  
88
   echo ""
89
   echo "*** Verification repertoire /etc/iet :"
90
   ls -ltr /etc/iet
91

  
92
   echo ""
93
   echo "*** Operation de suppression [OK] ..."
94
else
95

  
96
   echo "*** Un probleme est survenu lors de la tentive de suppresion du volume iscsi TID:$TID2DEL"
97
   echo "*** Veuillez vérifier que le volume n'est pas en cours d'uilisation (cat /proc/net/iet/session) sinon contacter l'admin en charge de ce serv ce"
98
fi
99

  
100

  
101
}
102

  
103

  
104
function interactive {
105

  
106
echo "*** Choix du volume ISCSI a supprimer ***"
107
cat /proc/net/iet/session
108

  
109
echo "*** Saisir le TID du volume iscsi a supprimer : ***" 
110
while read inputline
111
do
112
   TID2DEL=$inputline 
113
   echo "*** Etes-vous sur du nom : $inputline ? (y/n) ***"
114
   
115
   while read inputConfirm
116
   do
117
      if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
118
      then
119
         break
120
      fi
121
      echo "*** Etes-vous certain de vouloir supprimer le TID : $inputline ? (y/n) ***" 
122
   done
123

  
124
   if [ "$inputConfirm" = "y" ]
125
   then
126
      break
127
   fi
128
   if [ "$inputConfirm" != "y" ]
129
   then
130
      echo "*** Saisir le TID du volume iscsi a supprimer : ***" 
131
   fi
132
done
133

  
134
echo "**** Recuperation de la propriété Target (identifiant utilise dans le fichier /etc/iet/ietd.conf) ..."
135
TARGET=$(cat /proc/net/iet/session |grep -i tid:$TID2DEL |cut -d ":" -f3)
136

  
137
echo "Nom de la target a rechercher dans /etc/iet/ietd.conf : $TARGET"
138

  
139
echo ""
140
echo "**** Check si le volume est en cours d'utilisation ..."
141

  
142

  
143
TID_FIND=1
144
TID_ISACTIVE=1
145
for line in $(cat /proc/net/iet/session)
146
do
147
  if [ $TID_FIND -eq 0 ]
148
  then
149
     CHECK_STATE=$(echo $line |awk '{ if ( /state:active/ ){ print 0 }else{ print $1 $line} }')
150
     if [ "$CHECK_STATE" = "0" ]
151
     then
152
         TID_ISACTIVE=0
153
     fi
154

  
155
  fi
156
  if [ $TID_ISACTIVE -eq 0 ]
157
  then
158
     echo "Le volume isci est en cours d'utilisation, suppression impossible"
159
     exit 1
160
  fi
161
  TID_LISTED=$(echo $line |awk '(/tid:/) { print $1 }')
162
  if [ "$TID_LISTED" != "" ]
163
  then
164
     if [ "tid:$TID2DEL" = "$TID_LISTED" ]
165
     then
166
        TID_FIND=0 
167
     else
168
       TID_FIND=1 
169
     fi
170
 fi
171
done
172

  
173
echo "*** Debut de la procédure de suppression ..."
174
echo ""
175

  
176
ietadm --op delete --tid=$TID2DEL
177
if [ $? -eq 0 ]
178
then
179
   echo "*** La suppression via la commande ietadm s'est termine correctement"
180
   echo ""
181
   echo "*** Vérification et suppression du volume dans le fichier /etc/iet/ietd.conf ..."
182

  
183
   COPY_LINE=0
184
   >/tmp/.buffer_ietd.conf
185
   while read line
186
   do
187
      echo $line |grep -i "^Target"
188
      if [ $? -eq 0 ]
189
      then
190
         COPY_LINE=0
191
      fi
192
      echo $line |grep -i "^Target $TARGET" 
193
      if [ $? -eq 0 ]
194
      then
195
         COPY_LINE=1
196
      fi
197
      if [ $COPY_LINE -eq 0 ]
198
      then
199
         echo $line >> /tmp/.buffer_ietd.conf
200
      fi 
201

  
202
    done < "/etc/iet/ietd.conf"
203
    echo "*** Sauvegarde du fichier /etc/iet/ietd.conf ..."
204
    TODAY=$(date +%Y%m%d%H%M%S)
205
    cp /etc/iet/ietd.conf /etc/iet/ietd.conf.$TODAY
206
    cp /tmp/.buffer_ietd.conf /etc/iet/ietd.conf
207
       
208

  
209
   echo ""
210
   echo "*** Vérification /proc/net/iet/volume :"
211
   cat /proc/net/iet/volume
212

  
213
   echo ""
214
   echo "*** Verification repertoire /etc/iet :"
215
   ls -ltr /etc/iet
216

  
217
   echo ""
218
   echo "*** Operation de suppression [OK] ..."
219
else
220

  
221
   echo "*** Un probleme est survenu lors de la tentive de suppresion du volume iscsi TID:$TID2DEL"
222
   echo "*** Veuillez vérifier que le volume n'est pas en cours d'uilisation (cat /proc/net/iet/session) sinon contacter l'admin en charge de ce service"
223
fi
224
echo "*** FIN ***"
225
}
226

  
227
while getopts "iT:h" OPTION
228
do
229
     case $OPTION in
230
         h)
231
             usage
232
             exit 1
233
             ;;
234
         i)
235
             interactive
236
             ;;
237
         T)
238
             TID2DEL=$OPTARG
239
             ;;
240
         *)
241
             usage
242
             exit 1
243
             ;;
244
     esac
245
done
246

  
247
if [ ! -d "/proc/net/iet" ]
248
then
249
  echo "Please, check if ietd is running ..." 1>&2
250
  exit 1
251
fi
252
if [ -z $TID2DEL ]
253
then
254
   usage
255
   exit 1
256
fi
257
nointeractive
258

  
0 259

  
bin/dell-omsa-alert (revision 1)
1
#!/bin/bash
2

  
3

  
4
/opt/dell/srvadmin/sbin/omreport system alertlog > /tmp/alertmsg.txt 2>&1
5
echo "====================================================================" >>/tmp/alertmsg.txt
6
echo "!!!PENSER A VIDER LES LOGS QUAND LES PROBLEMES ONT ETE RESOLUS !!!!!!" >>/tmp/alertmsg.txt
7
mail -s "PSITTACUS SAN : $1" root </tmp/alertmsg.txt> /tmp/mailout.txt 2>&1
0 8

  
bin/enable-snapshot (revision 1)
1
#!/bin/bash
2

  
3
DIR_CRON="/etc/cron.d/"
4
DIR_CONF_SNAPSHOT="/opt/gZFS/snapshots/"
5
BIN_ZFS_SNAPSHOT="/sbin/zfs-snapshot"
6

  
7

  
8
function usage {
9
  echo "Usage : $0 options" 1>&2
10
  echo "OPTIONS :" 1>&2
11
  echo "  -i : interactive mode, this option is not compatible with others options" 1>&2
12
  echo "  -m : minute field for cron snapshot" 1>&2
13
  echo "  -H : hour field for cron snapshots" 1>&2
14
  echo "  -D : Day of Month field for cron snapshots" 1>&2
15
  echo "  -M : Month field for cron snapshots" 1>&2
16
  echo "  -d : Day of week for cron snapshots" 1>&2
17
  echo "  -N : Name of ZFS Volume/FileSystem to snapshots" 1>&2
18
  echo "  -t : Type ZFS Volume or FileSystem. Possible value : volume or filesystem" 1>&2
19
  echo "  -k : Number of snapsot to keep" 1>&2
20
}
21

  
22
function checkField4Cron {
23
  if [[ $OPTARG =~ [a-zA-Z] ]]
24
  then
25
     echo "-$OPTION contain a bad value" 1>&2
26
     exit 1
27
  fi
28
}
29

  
30
function createCronFile4Snapshot {
31
FILE_NAME=$(echo "snapshot-"${NAMEZFS/\//-})
32
echo "$MINUTE $HOUR $MONTH $DAYMONTH $DAYWEEK root $BIN_ZFS_SNAPSHOT $DIR_CONF_SNAPSHOT$FILE_NAME.conf" > $DIR_CRON$FILE_NAME
33
echo "name=$NAMEZFS" >$DIR_CONF_SNAPSHOT$FILE_NAME.conf
34
echo "type=$TYPEZFS" >>$DIR_CONF_SNAPSHOT$FILE_NAME.conf
35
echo "nbsnapshots=$SNAP2KEEP" >>$DIR_CONF_SNAPSHOT$FILE_NAME.conf
36
}
37

  
38
function interactive {
39
zfs list
40
echo "*** Choix du volume pour l'activation des snapshot (merci de saisir le path complet du volume) : ***"
41

  
42
while read inputline
43
do
44
   NAME_VOL=$inputline
45
   if [ "$NAME_VOL" = "" ]
46
   then
47
      echo "*** Choix du volume pour l'activation des snapshot : ***" 
48
   else
49

  
50
      echo "*** Etes-vous sur du nom : $inputline ? (y/n) ***"
51
   
52

  
53
      while read inputConfirm
54
      do
55
         if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
56
         then
57
            break
58
         fi
59
         echo "*** Etes-vous sur du nom : $inputline ? (y/n) ***"
60
      done
61

  
62
      if [ "$inputConfirm" = "y" ]
63
      then
64
         zfs list $NAME_VOL
65
         if [ $? -eq 0 ]
66
         then
67
            echo "*** Le volume saisi $NAME_VOL existe ***"
68
            break
69
         else
70
            echo "*** Le volume saisi $NAME_VOL n'existe pas ***"    
71
            echo "*** Choix du volume pour l'activation des snapshot : ***"
72
         fi
73
      fi
74
      if [ "$inputConfirm" != "y" ]
75
      then
76
         echo "*** Choix du volume pour l'activation des snapshot : ***"
77
      fi
78

  
79
   fi
80
done
81

  
82
echo "*** Le volume est utilise en zfs natif ou en zvol (sous forme d'un device) : volume/filesystem ***"
83

  
84
while read inputline
85
do
86
  if [ "$inputline" = "volume" ] || [ "$inputline" = "filesystem" ]
87
  then
88
     TYPE_ZFS=$inputline
89
     break
90
  else
91
    echo "*** Le volume est utilise en zfs natif ou en zvol (sous forme d'un device) : volume/filesystem ***"
92
     
93
  fi
94

  
95
done
96

  
97

  
98
echo "*** Nombre de snapshot a garder : ***"
99

  
100

  
101

  
102
while read inputline
103
do
104
   NB_SNAP=$inputline
105
   if [ "$NB_SNAP" = "" ]
106
   then
107

  
108
       echo "*** Nombre de snapshot a garder : ***"
109
              
110
   else
111
       
112
       echo "*** Creation du fichier de configuration ***"
113
       FILE_NAME=$(echo "snapshot-"${NAME_VOL/\//-}) 
114
       >$DIR_CONF_SNAPSHOT$FILE_NAME.conf
115
       echo "name=$NAME_VOL" > $DIR_CONF_SNAPSHOT$FILE_NAME.conf
116
       echo "nbsnapshots=$NB_SNAP" >> $DIR_CONF_SNAPSHOT$FILE_NAME.conf
117
       echo "type=$TYPE_ZFS" >> $DIR_CONF_SNAPSHOT$FILE_NAME.conf
118
       break    
119
   fi
120
done
121

  
122
echo "*** Frequence des snapshots ***"
123
echo "1 - Tous les jours"
124
echo "2 - Toutes les semaines"
125
echo "3 - Tous les mois"
126
echo "*******************************"
127
while read inputline
128
do 
129
   case $inputline in
130
   
131
    "1" )
132
          echo "*** Saisir l'heure (HH:MM) "
133
          while read inputheure
134
          do
135
             if [[ "$inputheure" =~ [0-9][0-9]":"[0-9][0-9] ]]
136
             then
137
                echo "Le choix de l'heure est : $inputheure"
138
                H_DEBUT=$(echo $inputheure |cut -d":" -f1)
139
                M_DEBUT=$(echo $inputheure |cut -d":" -f2)
140
                echo "$M_DEBUT $H_DEBUT * * * root $BIN_ZFS_SNAPSHOT $DIR_CONF_SNAPSHOT$FILE_NAME.conf" > $DIR_CRON$FILE_NAME
141
                break;
142
             else
143
                echo "*** Saisir l'heure (HH:MM) "
144
             fi
145
          done
146

  
147
          break ;;
148
    "2" ) 
149
          echo "*** Saisir le jour de la semaine : 0-6 (0 est dimanche) "
150
          while read inputjour
151
          do
152
             if [[ "$inputjour" =~ [0-9] ]]
153
             then
154
               
155
                 echo "*** Saisir l'heure (HH:MM) "
156
                 while read inputheure
157
                 do
158
                    if [[ "$inputheure" =~ [0-9][0-9]":"[0-9][0-9] ]]
159
                    then
160
                       echo "Le choix de l'heure est : $inputheure"
161
                       H_DEBUT=$(echo $inputheure |cut -d":" -f1)
162
                       M_DEBUT=$(echo $inputheure |cut -d":" -f2)
163
                       break;
164
                    else
165
                       echo "*** Saisir l'heure (HH:MM) "
166
                    fi
167
                  done
168
                
169
                  echo "$M_DEBUT $H_DEBUT * * $inputjour root $BIN_ZFS_SNAPSHOT $DIR_CONF_SNAPSHOT$FILE_NAME.conf" > $DIR_CRON$FILE_NAME
170
                  echo "*** Planification du snapshot [OK]"
171
                  break;
172
             else
173
                 echo "*** Saisir le jour de la semaine : 0-6 (0 est dimanche) "
174
             fi
175
          done
176

  
177
          break ;;
178

  
179
     "3" )
180
          echo "*** Saisir le jour du mois : 01-30"
181
          while read inputjour
182
          do
183
             if [[ "$inputjour" =~ [0-9][0-9] ]]
184
             then
185

  
186
                 echo "*** Saisir l'heure (HH:MM) "
187
                 while read inputheure
188
                 do
189
                    if [[ "$inputheure" =~ [0-9][0-9]":"[0-9][0-9] ]]
190
                    then
191
                       echo "Le choix de l'heure est : $inputheure"
192
                       H_DEBUT=$(echo $inputheure |cut -d":" -f1)
193
                       M_DEBUT=$(echo $inputheure |cut -d":" -f2)
194
                       break;
195
                    else
196
                       echo "*** Saisir l'heure (HH:MM) "
197
                    fi
198
                  done
199

  
200
                  echo "$M_DEBUT $H_DEBUT $inputjour * * root $BIN_ZFS_SNAPSHOT $DIR_CONF_SNAPSHOT$FILE_NAME.conf" > $DIR_CRON$FILE_NAME
201
                  echo "*** Planification du snapshot [OK]"
202
                  break;
203
             else
204
                 echo "*** Saisir le jour du mois : 01-30 "
205
             fi
206
          done
207

  
208
          break ;;
209

  
210
   esac
211
   echo "*** Frequence des snapshots *** "
212
   echo "1 - Tous les jours"
213
   echo "2 - Toutes les semaines"
214
   echo "3 - Tous les mois"
215
   echo "*******************************"
216
   
217
done
218
/etc/init.d/cron restart
219
}
220

  
221
while getopts "im:H:D:M:d:N:t:k:h" OPTION
222
do
223
     case $OPTION in
224
         h)
225
             usage
226
             exit 1
227
             ;;
228
         i)
229
            interactive
230
            exit 0
231
            ;;
232
         m)
233
            checkField4Cron
234
            MINUTE=$OPTARG
235
            ;;
236
         H)
237
            checkField4Cron
238
            HOUR=$OPTARG
239
            ;;
240
         D) 
241
            checkField4Cron
242
            DAYMONTH=$OPTARG
243
            ;;
244
         M)
245
            checkField4Cron
246
            MONTH=$OPTARG
247
            ;;
248
         d)
249
            checkField4Cron
250
            DAYWEEK=$OPTARG
251
            ;;
252
         N)
253
            NAMEZFS=$OPTARG
254
            ;;
255
         t)
256
            TYPEZFS=$OPTARG
257
            ;;
258
         k)
259
            SNAP2KEEP=$OPTARG
260
            ;;
261
         *)
262
            usage
263
            exit 1
264
            ;;
265
     esac
266
done
267

  
268
if [[ -z $MINUTE ]] || [[ -z $HOUR ]] || [[ -z $DAYMONTH ]] || [[ -z $MONTH ]] || [[ -z $DAYWEEK ]] || [[ -z $NAMEZFS ]] || [[ -z $TYPEZFS ]] || [[ -z $SNAP2KEEP ]]
269
then
270
     usage
271
     exit 1
272
fi
273

  
274
createCronFile4Snapshot
275

  
276
/etc/init.d/cron restart
277

  
278

  
0 279

  
bin/create-filesystem (revision 1)
1
#!/bin/bash
2

  
3
function usage {
4
echo "Syntax :" 1>&2 
5
echo "$0 [options]" 1>&2
6
echo " -n : filesystem name" 1>&2
7
echo " -p : pool name" 1>&2
8
echo " -o : options zfs filesystem. Read the man zfs for more details" 1>&2
9

  
10
}
11

  
12
function nointeractive {
13

  
14
/sbin/zfs create -o $FS_OPTION $NAME_POOL/$NAME
15

  
16
}
17

  
18

  
19
function interactive {
20
zfs list
21
echo "*** Choix du pool pour la creation du filesystem : ***"
22

  
23
while read inputline
24
do
25
   if [ "$inputline" != "" ]
26
   then
27
      zfs list |grep -i $inputline
28
      if [ $? -eq 1 ]
29
      then
30
         echo "*** Choix du pool pour la creation du filesystem : ***"
31
      else
32

  
33
         echo "*** Etes-vous sur du choix du pool : $inputline ? (y/n) ***"
34
         while read inputConfirm
35
         do
36
            if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
37
            then
38
              break
39
            fi
40
            echo "*** Etes-vous sur du nom : $inputline ? (y/n) ***"
41
         done
42

  
43
          if [ "$inputConfirm" = "y" ]
44
          then
45
             NAME_POOL=$inputline
46
             echo "Saisir le nom du filesystem : "
47
             while read inputFS
48
             do
49
                if [ "$inputFS" != "" ]
50
                then
51
                   zfs list |grep -i "$inputFS "
52
                   if [ $? -eq 0 ]
53
                   then
54
                         echo "Le nom du filesystem existe deja"
55
                         FS_OK=1   
56
                   else
57
                      FS_OK=0 
58
                   fi
59
                   if [ $FS_OK -eq 1 ]
60
                   then
61
                      echo "Saisir le nom du filesystem : "
62
                   else
63
                      NAME_FS=$inputFS
64
                           zfs create $NAME_POOL/$inputFS
65
                           if [ $? -eq 0 ]
66
                           then
67
                              echo "*** Creation du filesystem ZFS [OK] ***" 
68
                              zfs list
69
                              break
70
                           else
71
                              echo "/!\\ Creation du filesystem ZFS [ERROR] /!\\"
72
                           fi
73
                    fi
74
                else
75
                  echo "Saisir le nom du filesystem : "
76
                fi
77
             done
78
             break
79
          fi
80
          break
81
      fi
82
   else
83
      echo "*** Choix du pool pour la creation du filesystem : ***"
84
   fi
85
done
86
}
87

  
88
while getopts "in:p:b:s:o:h" OPTION
89
do
90
     case $OPTION in
91
         h)
92
             usage
93
             exit 1
94
             ;;
95
         i)
96
            interactive
97
            exit 0
98
            ;;
99
         n)
100
           NAME=$OPTARG
101
           ;;
102
         p)
103
           NAME_POOL=$OPTARG
104
           ;;
105
         o)
106
           FS_OPTION=$OPTARG
107
           FS_OPTION=$(echo $FS_OPTION|sed -e 's/,/ -o /g')
108
           echo "$FS_OPTION"
109
           ;;
110
    esac
111
done
112
if [[ -z $NAME_POOL ]] || [[ -z $NAME ]] 
113
then
114
     usage
115
     exit 1
116
fi
117

  
118
nointeractive
0 119

  
bin/show-infodisk-cache (revision 1)
1
#!/bin/bash
2

  
3
#cat /opt/gZFS/infodisks.cache
4
while read line
5
do
6
echo $line
7
done < "/opt/gZFS/infodisks.cache"
8
#done < "/var/log/syslog"
0 9

  
bin/del-filesystem (revision 1)
1
#!/bin/bash
2

  
3
function usage {
4
  echo "Description : destroy a ZFS FileSystem." 1>&2
5
  echo "Usage :" 1>&2
6
  echo "$0 [OPTIONS]" 1>&2
7
  echo " -h display this message" 1>&2
8
  echo " -i interactive mode" 1>&2
9
  echo " -n ZFS Volume Name" 1>&2
10

  
11
}
12

  
13
function nointeractive {
14

  
15
MOUNTED=$(zfs get -H mounted $FS_NAME|awk '{ print $3}')
16

  
17
if [ "$MOUNTED" == "no" ]
18
then
19
   zfs destroy $FS_NAME
20
   
21
else
22
   echo "ZFS FileSystem $FS_NAME mounted" 1>&2
23
   exit 1;
24
fi 
25
}
26

  
27

  
28
function interactive {
29

  
30
zfs list
31
echo "*** Enter the ZFS FileSystem Name : ***" 
32
while read inputline
33
do
34
   NAME_VOL=$inputline 
35
   echo "*** Do you want really remove the ZFS FileSystem : $inputline ? (y/n) ***"
36
   while read inputConfirm
37
   do
38
      if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
39
      then
40
         break
41
      fi
42
      echo "*** Do you want really remove the ZFS FileSystem : $inputline ? (y/n) ***"
43
   done
44

  
45
   
46
   if [ "$inputConfirm" = "y" ]
47
   then
48
      break
49
   fi
50
   if [ "$inputConfirm" != "y" ]
51
   then
52
      echo "*** Enter the ZFS Volume FileSystem : ***" 
53
   fi
54
done
55
nointeractive
56
}
57

  
58
while getopts "in:h" OPTION
59
do
60
     case $OPTION in
61
         h)
62
             usage
63
             exit 1
64
             ;;
65
         i)
66
             interactive
67
             ;;
68
         n)
69
             FS_NAME=$OPTARG
70
             ;;
71
         *)
72
             usage
73
             exit 1
74
             ;;
75
     esac
76
done
77

  
78
if [[ -z $FS_NAME ]]
79
then
80
     usage
81
     exit 1
82
fi
83
nointeractive
84

  
85

  
0 86

  
bin/zpool-get-state (revision 1)
1
#!/bin/bash
2

  
3

  
4
function usage {
5

  
6
  echo "Syntax :"
7
  echo "$0 -n zpool_name : display zpool state and last scrub"
8
  echo "$0 -h : display this message"
9
}
10
function nointeractive {
11
  echo $(zpool status $poolname|grep -i "state:"|sed -e "s/^ \+//g"|sed -e "s/: /:/")
12
  echo $(zpool status $poolname|grep -i "scan:"|sed -e "s/^ \+//g"|sed -e "s/: /:/")
13
  exit 0
14
}
15
while getopts "in:h" OPTION
16
do
17
     case $OPTION in
18
         h)
19
             usage
20
             exit 1
21
             ;;
22
         n)
23
            poolname=$OPTARG
24
            ;;
25
         *)
26
            usage
27
            ;;
28
     esac
29
done
30
if [[ -z $poolname ]]
31
then
32
     usage
33
     exit 1
34
fi
35

  
36
nointeractive
37

  
38

  
0 39

  
bin/zfs-snapshot (revision 1)
1
#!/bin/bash
2

  
3
function check_env_volume {
4
#*** CHECK DE L'ENVIRONNEMENT ***
5

  
6
if [ ! -d "/mnt/snapshot" ]
7
then
8
   mkdir -p /mnt/snapshot
9
   if [ $? -eq 1 ]
10
   then
11
      echo "/!\\ Probleme lors de la creation de /mnt/snapshot /!\\"
12
      exit 1
13
   fi
14
fi
15
#*** FIN DU CHECK DE L'ENVIRONNEMENT ***
16
}
17

  
18
function check_env_filesystem {
19
echo "**** $1"
20
if [ "$#" -eq 0 ]
21
then
22
   echo "/!\\ Le fichier de configuration est manquant /!\\"
23
   exit
24
fi 
25

  
26
if [ ! -f $1 ]
27
then
28
   echo "/!\\ Le fichier de configuration n'existe pas /!\\" 
29
   exit
30
fi
31
NAME_VOL=$(cat $1 |grep "name" |cut -d"=" -f2)
32
TYPE_ZFS=$(cat $1 |grep "type" |cut -d"=" -f2)
33
NB_SNAP=$(cat $1 |grep "nbsnapshots"|cut -d"=" -f2)
34
if [ "$NAME_VOL" = "" ] || [ "$TYPE_ZFS" = "" ] || [ "$NB_SNAP" = "" ]
35
then
36
   echo "/!\\ Probleme le fichier de configuration est incoherent ou incomplet /!\\"
37
   exit
38
fi
39

  
40

  
41
}
42

  
43
function create_snapshot_volume {
44
#*** ETAPE DE CREATION DU SNAPSHOT ***#
45

  
46
echo ""
47
echo "*** Snapshot ZFS pour : $NAME_VOL"
48
echo "*** Type de volume ZFS : $TYPE_ZFS"
49
echo ""
50

  
51
if [ "$TYPE_ZFS" = "volume" ]
52
then
53
   if [ ! -d /mnt/snapshot/$NAME_VOL ]
54
   then
55
      mkdir -p /mnt/snapshot/$NAME_VOL
56
   fi
57
   mount -o ro /dev/zvol/$NAME_VOL /mnt/snapshot/$NAME_VOL
58
   if [ $? -eq 0 ]
59
   then
60
      echo "*** Mount en lecture seule de $NAME_VOL [OK]"
61
   else
62
      echo "/!\\ Probleme lors de la tentative de mount de $NAME_VOL sur /mnt/snapshot/$NAME_VOL /!\\"
63
      exit
64
   fi
65
fi
66

  
67
echo "*** Creation du snapshot pour $NAME_VOL"
68
ZDATE=$(date +%Y%m%d%H%M%S)
69
/sbin/zfs snapshot $NAME_VOL@snapshot-$ZDATE
70
echo ""
71
#*** FIN ETAPE DE CREATION DU SNAPSHOT ***#
72
}
73

  
74
function create_snapshot_filesystem {
75
#*** ETAPE DE CREATION DU SNAPSHOT ***#
76

  
77
echo ""
78
echo "*** Snapshot ZFS pour : $NAME_VOL"
79
echo "*** Type de volume ZFS : $TYPE_ZFS"
80
echo ""
81
echo "*** Creation du snapshot pour $NAME_VOL"
82
ZDATE=$(date +%Y%m%d%H%M%S)
83
/sbin/zfs snapshot $NAME_VOL@snapshot-$ZDATE
84
echo ""
85
#*** FIN ETAPE DE CREATION DU SNAPSHOT ***#
86
}
87

  
88

  
89
function check_after_snapshot_volume {
90
#*** ETAPE DE VERIFICATION ***#
91
echo "*** Umount du volume /mnt/snapshot/$NAME_VOL ..."
92
umount /mnt/snapshot/$NAME_VOL
93
if [ $? -eq 1 ]
94
then
95
   echo "/!\\ Probleme lors du demontage du volume $NAME_VOL /!\\"
96
fi
97

  
98
mount -o ro /dev/zvol/$NAME_VOL@snapshot-$ZDATE /mnt/snapshot/$NAME_VOL
99
if [ $? -eq 0 ]
100
then
101
   echo "*** Creation du snapshot et verification du montage du snapshot /dev/zvol/$NAME_VOL@snapshot-$ZDATE [OK]"
102
   umount /mnt/snapshot/$NAME_VOL
103
   if [ $? -eq 1 ]
104
   then
105
      echo "/!\\ Probleme lors du demontage du volume $NAME_VOL /!\\"
106
   fi
107

  
108
else
109
   echo "/!\\ Probleme avec lors de la creation ou du snapshot : commande de destruction de /dev/zvol/$NAME_VOL@snapshot-$ZDATE /!\\"
110
   /sbin/zfs destroy $NAME_VOL@snapshot-$ZDATE
111
   if [ $? -eq 0 ]
112
   then
113
      echo "*** Suppression du snapshot $NAME_VOL@snapshot-$ZDATE [OK]"
114
   else
115
      echo "/!\\ Suppression du snapshot $NAME_VOL@snapshot-$ZDATE [ERROR]. A TRAITER DANS LES PLUS BREFS DELAIS !!!"
116
   fi
117
fi
118
#*** FIN ETAPE DE VERIFICATION ***#
119
}
120

  
121

  
122
function del_old_snapshot {
123
#*** ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***#
124
echo ""
125
CPT_SNAP=$(/sbin/zfs list -t snapshot -r $NAME_VOL |cut -d" " -f1 |grep -i $NAME_VOL\@ |wc -l)
126
echo "*** Le nombre de snapshot pour $NAME_VOL est : $CPT_SNAP"
127
/sbin/zfs list -t snapshot -r $NAME_VOL 
128

  
129
if [ $CPT_SNAP -gt $NB_SNAP ]
130
then
131
   echo "*** Detection du snapshot le plus ancien"
132
   for ID_SNAP_OLDER in $(/sbin/zfs list -t snapshot -r $NAME_VOL |cut -d" " -f1 |grep -i $NAME_VOL\@)
133
   do
134
      echo "*** Le snapshot le plus ancien est : $ID_SNAP_OLDER"
135
      break
136
   done
137
   /sbin/zfs destroy $ID_SNAP_OLDER
138
   if [ $? -eq 0 ]
139
   then
140
      echo "*** Suppression du snapshot $ID_SNAP_OLDER [OK]"
141
   else
142
      echo "/!\\ Suppression du snapshot $ID_SNAP_OLDER [ERROR]."
143
   fi
144

  
145
fi
146
#*** FIN ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***#
147
}
148

  
149
echo "**** $1"
150
if [ "$#" -eq 0 ]
151
then
152
   echo "/!\\ Le fichier de configuration est manquant /!\\"
153
   exit
154
fi 
155

  
156
if [ ! -f $1 ]
157
then
158
   echo "/!\\ Le fichier de configuration n'existe pas /!\\" 
159
   exit
160
fi
161

  
162
NAME_VOL=$(cat $1 |grep "name" |cut -d"=" -f2)
163
TYPE_ZFS=$(cat $1 |grep "type" |cut -d"=" -f2)
164
NB_SNAP=$(cat $1 |grep "nbsnapshots"|cut -d"=" -f2)
165
if [ "$NAME_VOL" = "" ] || [ "$TYPE_ZFS" = "" ] || [ "$NB_SNAP" = "" ]
166
then
167
   echo "/!\\ Probleme le fichier de configuration est incoherent ou incomplet /!\\"
168
   exit
169
fi
170

  
171
if [ "$TYPE_ZFS" == "volume" ]
172
then
173
   check_env_volume
174
   create_snapshot_volume
175
   check_after_snapshot_volume
176
   del_old_snapshot
177

  
178

  
179
else
180
   if [ "$TYPE_ZFS" == "filesystem" ]
181
   then
182
      create_snapshot_filesystem
183
      del_old_snapshot
184

  
185
   fi
186
fi
0 187

  
bin/update-iscsi-volume (revision 1)
1
#!/bin/bash
2
cat /proc/net/iet/volume
3
echo "*** Saisir TID a mettre a jour : ***"
4

  
5
while read inputline
6
do
7
   TID_ISCSI=$inputline
8
   echo "*** Etes-vous sur de vouloir mettre a jour le TID : $inputline ? (y/n) ***"
9

  
10
   while read inputConfirm
11
   do
12
      if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
13
      then
14
         break
15
      fi
16
      echo "*** Etes-vous sur du nom : $inputline ? (y/n) ***"
17
   done
18

  
19
   if [ "$inputConfirm" = "y" ]
20
   then
21
      COPY_LINE=1
22
      TARGET=$(cat /proc/net/iet/session |grep tid:$TID_ISCSI |awk '{split($0,array,"name:")} END {print array[2]}') 
23
      LUN=$(cat /proc/net/iet/volume |grep "tid:$TID_ISCSI" -A1  | awk '{split($0,array,"lun:")} END {print array[2]}'|cut -d " " -f1)
24
      TYPE=$(cat /proc/net/iet/volume |grep "tid:$TID_ISCSI" -A1  | awk '{split($0,array,"iotype:")} END {print array[2]}'|cut -d " " -f1)
25
      DEV_PATH=$(cat /proc/net/iet/volume |grep "tid:$TID_ISCSI" -A1  | awk '{split($0,array,"path:")} END {print array[2]}'|cut -d " " -f1)
26

  
27
      echo "*** $TARGET"
28
      echo "*** $LUN"
29
      echo "*** $TYPE"
30
      echo "*** $DEV_PATH"
31
      COPY_LINE=0
32
      while read line
33
      do
34
         echo $line |grep -i "^Target"
35
         if [ $? -eq 0 ]
36
         then
37
            COPY_LINE=0
38
         fi
39
         echo $line |grep -i "^Target $TARGET"
40
         if [ $? -eq 0 ]
41
         then
42
            COPY_LINE=1
43
         fi
44
         if [ $COPY_LINE -eq 1 ]
45
         then
46
            SEARCH_USER=$(echo $line |grep -i "^IncomingUser")
47
            if [ "$SEARCH_USER" != "" ]
48
            then
49
               echo "FIND $SEARCH_USER"
50
               USERCHAP=$(echo $SEARCH_USER|cut -d " " -f2)
51
               PASSCHAP=$(echo $SEARCH_USER|cut -d " " -f3)
52
               if [ "$USERCHAP" != "IncomingUser" ]
53
               then
54
                  echo "USERCHAP : $USERCHAP"
55
                  echo "PASSCHAP : $PASSCHAP"
56
               fi
57
            fi 
58
         fi
59

  
60
      done < "/etc/iet/ietd.conf"
61

  
62
      #ietadm --op delete --tid=$TID_ISCSI
63
      #ietadm --op new --tid=$TID_ISCSI --params Name=$TARGET
64
      #ietadm --op new --tid=$TID_ISCSI --lun=$LUN --params Path=$DEV_PATH,Type=$TYPE
65
      #ietadm --op new --tid=$TID_ISCSI --user --params=IncomingUser=$USERCHAP,Password=$PASSCHAP
66
      break
67
   fi
68
   if [ "$inputConfirm" != "y" ]
69
   then
70
      echo "*** Saisir TID a mettre a jour : ***"
71
   fi
72
done
0 73

  
bin/get-conf-snapshot (revision 1)
1
#!/bin/bash
2

  
3
function usage {
4
echo "Syntax : $0 zfs_filesystem/volume_name" 1>&2
5
echo "Return the parameters snapshot for a zfs filesystem/volume" 1>&2
6
}
7

  
8
DIR_CRON="/etc/cron.d/"
9
DIR_CONF_SNAP="/opt/gZFS/snapshots/"
10
NAMEZFS=$1
11
FILE_NAME=$(echo "snapshot-"${NAMEZFS/\//-})
12

  
13
if [ "$1" != "" ]
14
then
15
   if [ -e $DIR_CRON$FILE_NAME ]
16
   then
17
      echo "minutesofsnapshots=$(cat $DIR_CRON$FILE_NAME |awk '{split($0,array," ")} END {print array[1]}')"
18
      echo "hoursofsnapshots=$(cat $DIR_CRON$FILE_NAME |awk '{split($0,array," ")} END {print array[2]}')"
19
      echo "monthsnapshots=$(cat $DIR_CRON$FILE_NAME |awk '{split($0,array," ")} END {print array[3]}')"
20
      echo "dayofmonthsnapshots=$(cat $DIR_CRON$FILE_NAME |awk '{split($0,array," ")} END {print array[4]}')"
21
      echo "dayofweeksnapshots=$(cat $DIR_CRON$FILE_NAME |awk '{split($0,array," ")} END {print array[5]}')"
22
   fi
23
   if [ -e "$DIR_CONF_SNAP$FILE_NAME.conf" ]
24
   then
25
      echo "fileconf=$DIR_CONF_SNAP$FILE_NAME.conf"
26
      /bin/cat $DIR_CONF_SNAP$FILE_NAME.conf
27
   fi 
28
   
29

  
30
else
31
usage
32
exit 1
33
fi
0 34

  
bin/zfs-clone (revision 1)
1
#!/bin/bash
2

  
3
function usage {
4
echo "Syntax :"
5
echo "$0 -n snapshot name to clone"
6
echo "$0 -i for a interactive use"
7

  
8
}
9

  
10

  
11
function nointeractive {
12

  
13
TODAY=$(date +%Y%m%d%H%M%S)
14

  
15
clone_name=$(echo "$volfs2clone" |sed -e "s/@.*$//g")
16
/sbin/zfs clone $volfs2clone $clone_name-$TODAY-clone
17
if [ "$?" == "0" ]
18
then
19
echo "name:$clone_name-$TODAY-clone"
20
exit 0
21
fi
22
}
23

  
24
function interactive {
25

  
26
/sbin/zfs list -t snapshot
27
echo "*** Select Volume or Filesystem to Clone : ***" 
28
while read inputline
29
do
30
   NAMEVOLFS=$inputline 
31
   echo "*** Are you sur ? : $inputline ? (y/n) ***"
32
   
33
   while read inputConfirm
34
   do
35
      if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
36
      then
37
         break
38
      fi
39
      echo "*** Are you sur ? : $inputline ? (y/n) ***" 
40
   done
41

  
42
   if [ "$inputConfirm" = "y" ]
43
   then
44
     volfs2clone=$inputline
45
     nointeractive
46
   fi
47
   if [ "$inputConfirm" != "y" ]
48
   then
49
      /sbin/zfs list -t snapshot
50
      echo "*** Select Volume or Filesystem to Clone : ***" 
51
   fi
52
done
53

  
54
}
55

  
56
while getopts "in:h" OPTION
57
do
58
     case $OPTION in
59
         h)
60
             usage
61
             exit 1
62
             ;;
63
         n)
64
            volfs2clone=$OPTARG
65
            ;;
66
         i)
67
            interactive
68
            exit 0
69
            ;;
70
     esac
71
done
72
if [[ -z $volfs2clone ]]
73
then
74
     usage
75
     exit 1
76
fi
77
nointeractive
78

  
0 79

  
bin/disable-snapshot (revision 1)
1
#!/bin/bash
2

  
3
DIR_CRON="/etc/cron.d/"
4
DIR_CONF_SNAPSHOT="/opt/gZFS/snapshots/"
5
BIN_ZFS_SNAPSHOT="/sbin/zfs-snapshot"
6

  
7

  
8

  
9

  
10

  
11

  
12
function usage {
13
  echo "Usage :" 1>&2
14
  echo "disable-snapshot [OPTIONS]" 1>&2
15
  echo " -h display this message" 1>&2
16
  echo " -i interactive mode" 1>&2
17
  echo " -N Specify the name ZFS Volume/Filesystem" 1>&2
18

  
19
}
20

  
21
function nointeractive {
22
FILE_NAME=$(echo "snapshot-"${NAMEZFS/\//-})
23
   /bin/rm -f $DIR_CONF_SNAPSHOT$FILE_NAME.conf
24
   if [ -e $DIR_CONF_SNAPSHOT$FILE_NAME.conf ]
25
   then
26
      echo "Error : cannot delete $DIR_CONF_SNAPSHOT$FILE_NAME.conf"    
27
   fi
28

  
29
   /bin/rm $DIR_CRON$FILE_NAME
30
   if [ -e $DIR_CRON$FILE_NAME ]
31
   then
32
      echo "Error : cannot delete $DIR_CRON$FILE_NAME"
33
   fi
34

  
35
}
36

  
37
function interactive {
38

  
39
/sbin/zfs list
40
echo "*** Nom du volume pour desactiver les snapshot :"
41
while read inputline
42
do
43
   if [ "$inputline" != "" ]
44
   then  
45
       /sbin/zfs list $inputline
46
      if [ $? -eq 0 ]
47
      then
48
         FILE_NAME=$(echo "snapshot-"${inputline/\//-})
49
         if [ -e $DIR_CONF_SNAPSHOT$FILE_NAME.conf ]
50
         then
51
            /bin/rm -f $DIR_CONF_SNAPSHOT$FILE_NAME.conf
52
            if [ $? -eq 0 ]
53
            then
54
               echo "*** Suppression du fichier conf $DIR_CONF_SNAPSHOT$FILE_NAME.conf [OK]"
55
            else
56
               echo "/!\\ Suppression du fichier $DIR_CONF_SNAPSHOT$FILE_NAME.conf [ERROR] /!\\"
57
               exit
58
            fi
59
         else
60
            echo "*** Le fichier de conf $DIR_CONF_SNAPSHOT$FILE_NAME.conf n'existe pas"
61
         fi
62

  
63
         if [ -e $DIR_CRON$FILE_NAME ]
64
         then
65
            /bin/rm $DIR_CRON$FILE_NAME
66
            if [ $? -eq 0 ]
67
            then
68
               echo "*** Suppression du fichier de cron $DIR_CRON$FILE_NAME [OK]"
69
               break
70
            else
71
               echo "/!\\ Suppression du fichier de cron $DIR_CRON$FILE_NAME /!\\"
72
               exit
73
            fi
74
         else
75
            echo "*** Le fichier cron $DIR_CRON$FILE_NAME n'existe pas"
76
            break
77
         fi
78
      fi
79
   fi
80
   echo "*** Nom du volume pour desactiver les snapshot :"
81
done
82
}
83

  
84
while getopts "iN:h" OPTION
85
do
86
     case $OPTION in
87
         h)
88
             usage
89
             exit 1
90
             ;;
91
         i)
92
             interactive
93
             ;;
94
         N)
95
             NAMEZFS=$OPTARG
96
             ;;
97
         *)
98
             usage
99
             exit 1
100
             ;;
101
     esac
102
done
103
if [[ -z $NAMEZFS ]]
104
then
105
     usage
106
     exit 1
107
fi
108
nointeractive
0 109

  
bin/get-disk-info (revision 1)
1
#!/bin/bash
2
SMARTTOOL="/usr/sbin/smartctl"
3

  
4

  
5

  
6
function usage {
7
  echo "Syntax :"
8
  echo "$0 -d device_name"
9
}
10

  
11
function nointeractive {
12

  
13
FIRST_TEST=$($SMARTTOOL $DEVBYID)
14
if [ $? -eq 0 ]
15
then
16
   while read line
17
   do
18
    if [[ "$line" =~ ":" ]]
19
    then
20
       echo $line
21
    fi 
22

  
23
   done <<< "$($SMARTTOOL -i -H $DEVBYID)"
24
   DEVBYIDNOPART=$(echo $DEVBYID |sed -e "s/\/dev\/disk\/by-id\///g" |sed -e "s/-part1$//g")
25
   echo "nameinzpool:$DEVBYIDNOPART"
26
   errorread=$(/sbin/zpool status |grep "$DEVBYIDNOPART"|sed -e "s/\t//g" |sed -e "s/ \+/ /g" | sed -e "s/^ //g"|cut -d " " -f3)
27
   echo "errorread:$errorread"
28
   errorwrite=$(/sbin/zpool status |grep "$DEVBYIDNOPART"|sed -e "s/\t//g" |sed -e "s/ \+/ /g" | sed -e "s/^ //g"|cut -d " " -f4)
29
   echo "errorwrite:$errorwrite"
30
   errorchecksum=$(/sbin/zpool status |grep "$DEVBYIDNOPART"|sed -e "s/\t//g" |sed -e "s/ \+/ /g" | sed -e "s/^ //g"|cut -d " " -f5)
31
   echo "errorchecksum:$errorchecksum"
32
   exit 0
33
fi
34

  
35
if [[ -e /sbin/multipath ]] || [[ -e /usr/sbin/multipath ]] || [[ -e /usr/local/sbin/multipath ]]
36
then
37

  
38
    resultMulti=$(multipath -l $DEVBYID |sed -e 's/(/disk_id=/g' |sed -e 's/)//g'|cut -d " " -f2 |grep disk_id|cut -d '=' -f2)
39
    if [ "$resultMulti" != ""  ]
40
    then
41
        while read liner
42
        do
43
          if [[ "$liner" =~ ":" ]]
44
          then
45
              echo $liner
46
          fi 
47
        done<<< "$($SMARTTOOL -i -H /dev/disk/by-id/scsi-$resultMulti)"
48
        DEVBYIDNOPART=$(echo $DEVBYID|cut -d "/" -f4)
49
        echo "nameinzpool:$DEVBYIDNOPART"
50
        errorread=$(/sbin/zpool status |grep "$DEVBYIDNOPART "|sed -e "s/\t//g" |sed -e "s/ \+/ /g" | sed -e "s/^ //g"|cut -d " " -f3)
51
        echo "errorread:$errorread"
52
        errorwrite=$(/sbin/zpool status |grep "$DEVBYIDNOPART "|sed -e "s/\t//g" |sed -e "s/ \+/ /g" | sed -e "s/^ //g"|cut -d " " -f4)
53
        echo "errorwrite:$errorwrite"
54
        errorchecksum=$(/sbin/zpool status |grep "$DEVBYIDNOPART "|sed -e "s/\t//g" |sed -e "s/ \+/ /g" | sed -e "s/^ //g"|cut -d " " -f5)
55
        echo "errorchecksum:$errorchecksum"
56
        exit 0
57
    fi
58
fi
59

  
60
echo "no informations disk"
61
}
62

  
63
while getopts "d:h" OPTION
64
do
65
     case $OPTION in
66
         h)
67
             usage
68
             exit 1
69
             ;;
70
         d)
71
            DEVBYID=$OPTARG
72
            ;;
73
         *)
74
           usage
75
           exit 1
76
           ;;
77
     esac
78
done
79
if [[ -z $DEVBYID ]] 
80
then
81
     usage
82
     exit 1
83
fi
84

  
85
nointeractive
86

  
0 87

  
... Ce différentiel a été tronqué car il excède la taille maximale pouvant être affichée.

Formats disponibles : Unified diff