source: client/engine/Rsync.lib @ 97f6020

918-git-images-111dconfigfileconfigure-oglivegit-imageslgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacionwebconsole3
Last change on this file since 97f6020 was c8bbcdc, checked in by irina <irinagomez@…>, 11 years ago

#565 se resuelve problema de corromper la imagen sincronizada al reducirla

git-svn-id: https://opengnsys.es/svn/branches/version1.0@4240 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100755
File size: 26.9 KB
Line 
1#!/bin/bash
2#/**
3# ogCreateFileImage  [ REPO | CACHE ] image_name extension size
4#@brief   Crear el archivo
5#@param 1 Repositorio  [ REPO | CACHE ]
6#@param 2 Nombre Imagen
7#@param 3 Tipo imagen [ img |diff ]
8#@param 4 Tamaño de la imagen
9#@return  instrucción para ser ejecutada.
10#*/
11
12function ogCreateFileImage () {
13local SIZEREQUIRED IMGDIR IMGFILE DIRMOUNT LOOPDEVICE  IMGSIZE IMGEXT
14
15if [ "$*" == "help" ]; then
16    ogHelp "$FUNCNAME" : "$MSG_HELP_ogCreateFileImage" \
17           "$FUNCNAME [ REPO|CACHE ] image_name extension  size(K)" \
18           "$FUNCNAME REPO Ubuntu12 img 300000" \
19           "$FUNCNAME CACHE Windows7 diff 20000000"
20    return
21fi
22
23
24if [ $# -lt 4 ]; then
25    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME  [ REPO|CACHE ] image_name extension  size(k)"
26    return $?
27fi
28
29SIZEREQUIRED=$4
30[ $SIZEREQUIRED -lt 300000 ] && SIZEREQUIRED=300000
31
32if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
33        IMGDIR="$(ogGetParentPath "$1" "/$2")"
34        [ "$3" == "img" ] && IMGEXT="img" ||  IMGEXT="img.diff"
35        IMGFILE="${IMGDIR}/$(basename "/$2").$IMGEXT"
36        ## Si no existe, crear subdirectorio de la imagen.
37        if [ $? != 0 ]; then
38            ogEcho log session  "      $MSG_HELP_ogMakeDir \"$1 $(dirname "$2")."
39            ogMakeDir "$1" "$(dirname "/$2")" || return $(ogRaiseError $OG_ERR_NOTWRITE "$3 /$4"; echo $?)
40            IMGDIR="$(ogGetParentPath "$1" "/$2")" || return $(ogRaiseError $OG_ERR_NOTWRITE "$3 /$4"; echo $?)
41        fi
42        DIRMOUNT="/tmp/$(ogGetMountImageDir "$2" "$3")"
43        mkdir -p "$DIRMOUNT"
44        LOOPDEVICE=$(losetup -f)
45        # Si existe el fichero de la imagen se hace copia de seguridad, si  no existe se crea.
46        if [ -f "$IMGFILE" ]; then
47                # Si la imagen esta montada la desmonto
48                if [ -r "$DIRMOUNT/ogimg.info" ]; then
49                    umount "$DIRMOUNT"
50                    [ $? -ne 0 ] && return $(ogRaiseError $OG_ERR_DONTUNMOUNT_IMAGE "$1 $2.$IMGEXT"; echo $?)
51                fi
52
53                if [ "$BACKUP" == "true" -o "$BACKUP" == "TRUE" ]; then
54                    # Copia seguridad
55                    ogEcho log session  "     $MSG_SCRIPTS_FILE_RENAME \"$IMGFILE\" ->  \"$IMGFILE.ant\"."
56                    cp -f  "$IMGFILE" "$IMGFILE.ant" 
57                    mv -f "$IMGFILE.torrent" "$IMGFILE.torrent.ant" 2>/dev/null
58                    rm -f "$IMGFILE.sum"
59                fi
60
61                IMGSIZE=$(ls -l --block-size=1024 "$IMGFILE" | awk '{print $5}')
62                if [ $IMGSIZE -lt $SIZEREQUIRED ];then
63                   ogEcho log session  "      $MSG_SYNC_RESIZE"
64                   echo "      truncate --size=>$SIZEREQUIRED k $IMGFILE"
65                   truncate --size=">$SIZEREQUIRED"k "$IMGFILE" &> $OGLOGCOMMAND
66                   # FS de la imagen segun la version del kernel: < 3.7 ext4, si >=  btrfs
67                   #if [[ "$(uname -r)" < "3.7" ]]; then
68                   if [ $(uname -r|cut -d. -f2) -lt 7 ]; then
69                        losetup $LOOPDEVICE "$IMGFILE"
70                        echo "      resize2fs -f $LOOPDEVICE"
71                        resize2fs -f $LOOPDEVICE &> $OGLOGCOMMAND
72                       
73                   else
74                        echo "      ogMountImage $1 "$2" $3"
75                        ogMountImage $1 "$2" $3
76                        echo "      btrfs filesystem resize max $DIRMOUNT"
77                        btrfs filesystem resize max "$DIRMOUNT" &> $OGLOGCOMMAND
78                   fi
79                fi
80        else
81                echo "      dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED"
82                dd if=/dev/zero of="$IMGFILE" bs=1024 count=$SIZEREQUIRED 2>&1 | tee -a $OGLOGCOMMAND
83                #Formateamos imagen
84                losetup $LOOPDEVICE $IMGFILE
85                # FS de la imagen segun la version del kernel: < 3.7 ext4, si >=  btrfs
86                #if [[ "$(uname -r)" < "3.7" ]]; then
87                if [ $(uname -r|cut -d. -f2) -lt 7 ]; then
88                   echo "      mkfs.ext4 -i 4096  -b 4096 -L "${2##*\/}" $LOOPDEVICE"
89                   mkfs.ext4 -i 4096  -b 4096 -L "${2##*\/}" $LOOPDEVICE 2>&1 |tee -a $OGLOGCOMMAND
90                else
91                   echo "      mkfs.btrfs  -L ${2##*\/} $LOOPDEVICE "
92                   mkfs.btrfs  -L "${2##*\/}" $LOOPDEVICE 2>&1 | tee -a $OGLOGCOMMAND
93                fi
94        fi
95        # Monto la imagen
96        ogMountImage $1 "$2" $3 &>/dev/null
97        [ $? -eq 0 ] || return $( ogRaiseError $OG_ERR_IMAGE "$3 $4"; echo $?)
98        #touch "$DIRMOUNT/ogimg.info"
99        echo "mounted"> $IMGFILE.lock
100
101        # Si existe dispositivo de loop lo borro.
102        [ $LOOPDEVICE ] && losetup -d $LOOPDEVICE 2>&1 &>/dev/null
103
104else
105        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
106        echo "      hose $REPOIP 2009 --out sh -c \"echo -ne CREATE_IMAGE $2 $3 $SIZEREQUIRED \""
107        hose $REPOIP 2009 --out sh -c "echo -ne CREATE_IMAGE \"$2\" $3 $SIZEREQUIRED"
108fi
109
110}
111
112function ogCreateInfoImage () {
113#/**
114#  ogCreateInfoImage
115#@brief   Crear listados con la informacion de la imagen, los situa en /tmp.
116#@param 1 num_disk
117#@param 2 num_part
118#@param 3 Repositorio  [ REPO | CACHE ] (opcional en las completas)
119#@param 4 Nombre Imagen Basica (opcional en las completas)
120#@param 5 Tipo imagen [ img | diff ]
121#*/
122local  IMGTYPE IMGDIRAUX DIRMOUNT DESTRSYNC PASSWORD OPTRSYNC USERRSYNC ORIG FSTYPE PART DIREMPTY IMGLIST IMGINFO IMGACL
123
124# Ayuda o menos de 5 parametros y la imagen no es basica
125if [ "$*" == "help" -o   $# -lt 5 -a "$3" != "img"  ]; then
126        ogHelp "$FUNCNAME" : "$MSG_HELP_ogCreateInfoImage" \
127                "$FUNCNAME num_disk num_part [ REPO|CACHE ] [ base_image_name ] extension  " \
128                "base image -> $FUNCNAME 1 2 img" \
129                "diff image -> $FUNCNAME 1 1 CACHE Windows7 diff "
130        return
131fi
132
133if [ $# -lt 3 ]; then
134    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME  num_disk num_part [ REPO|CACHE ] [ base_image_name]  extension  "
135    return $?
136fi
137
138# Comprobar errores.
139PART=$(ogDiskToDev "$1" "$2") || return $?
140ORIG=$(ogMount $1 $2) || return $?
141
142if [ $3 == "img" ]; then
143   IMGTYPE="img"
144else
145   # Comprobamos que las extension sea valida
146   ogCheckStringInGroup $5 "img diff" || return $( ogRaiseError  $OG_ERR_FORMAT "$MSG_SYNC_EXTENSION"; echo $?)
147   IMGTYPE=$5
148   if [ "$IMGTYPE" == "diff" ]; then
149        # Imagen completa con la que comparo la particion.
150        IMGDIRAUX="$(ogGetMountImageDir "$4" "img")"
151        if [ "$3" == "CACHE" -o "$3" == "cache" ]; then
152           DIRMOUNT="/tmp/$IMGDIRAUX"
153           DESTRSYNC="$DIRMOUNT"
154        else
155           [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
156           DIRMOUNT="$OGIMG/$IMGDIRAUX"
157           USERRSYNC="opengnsys"
158           PASSWORD="--password-file=/scripts/passrsync"
159           DESTRSYNC="$USERRSYNC@$REPOIP::ogimages/$IMGDIRAUX"
160        fi
161   fi
162fi
163
164
165FSTYPE=$(ogGetFsType $1 $2)
166
167# Creamos la lista del contenido y lo situamos en la particion a copiar.
168DIREMPTY="/tmp/empty$$"
169IMGLIST="/tmp/ogimg.list"
170IMGINFO="/tmp/ogimg.info"
171IMGACL="/tmp/ogimg.acl"
172
173# Borramos archivos antiguos.
174rm -f /tmp/ogimg.* 2>/dev/null
175rm -f $ORIG/ogimg.* 2>/dev/null
176
177# En las diferenciales no sabemos el tamaño -> ponemos una constante.
178SIZEDATA=${SIZEDATA:-"SIZEDATA"}
179
180# Incluimos información de la imagen. Segun el kernel sera ext4 o btrfs.
181#if [[ "$(uname -r)" < "3.7" ]]; then
182if [ $(uname -r|cut -d. -f2) -lt 7 ]; then
183        echo "#EXT4:NO:$FSTYPE:$SIZEDATA" > $IMGINFO
184else
185        echo "#BTRFS:LZO:$FSTYPE:$SIZEDATA" > $IMGINFO
186fi
187
188if [ "$IMGTYPE" == "img" ]; then
189        # Imagen Basica
190        echo "      rsync -aHAXvn --delete $ORIG/ $DIREMPTY >> $IMGINFO"
191        rsync -aHAXvn --delete $ORIG/ $DIREMPTY>> $IMGINFO
192        sed -i -e s/"^sent.*.bytes\/sec"//g -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g $IMGINFO
193        sed -i  '/^\.\//d' $IMGINFO
194
195else
196        # Imagen Diferencial
197        echo "      rsync -aHAXvn$OPTRSYNC  --delete  $ORIG/ $DESTRSYNC a $IMGLIST"
198        rsync -aHAXvn$OPTRSYNC $PASSWORD  --delete  "$ORIG/" "$DESTRSYNC" >> $IMGLIST
199        sed -i -e s/"^sent.*.bytes\/sec"//g -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g $IMGLIST
200        sed -i  '/^\.\//d' $IMGLIST
201
202        # Creamos informacion de la imagen
203        grep -e '\->' -e  '\=>' $IMGLIST > /tmp/ogimg.ln
204        grep -e  ^deleting  $IMGLIST | sed s/^deleting\ //g | grep -v ^ogimg  > /tmp/ogimg.rm
205        #grep -v -e '\->' -e  '\=>'  -e ^deleting  $IMGLIST >> $IMGINFO
206        grep -v -e '\->' -e  '\=>'  -e ^deleting -e ^created  $IMGLIST >> $IMGINFO
207
208        rm -f $IMGLIST
209
210        # Comprobamos que los ficheros de diferencias no esten vacios o salimos con error.
211        if [ $(grep -v -e "^$"  -e "^#" $IMGINFO /tmp/ogimg.ln /tmp/ogimg.rm |wc -l) -eq 0 ]; then
212                ogRaiseError $OG_ERR_NOTDIFFERENT "$1 $2 $3 $4 $5"
213                return $?       
214        fi
215
216fi
217
218# Guardamos el contenido de las acl (Solo win) Necesario particion desmontada (esta asi)
219ogUnmount $1 $2
220if [ $FSTYPE == "NTFS" ]; then
221        echo "      ntfs-3g.secaudit -b $PART /"
222        ntfs-3g.secaudit -b $PART / > $IMGACL
223fi
224
225
226}
227
228
229#/**
230#  ogAclFilter
231#@brief Del fichero de acl de la partición extraemos las acl de los ficheros de la diferencial
232#@param No.
233#@return  (nada)
234#*/
235function ogAclFilter () {
236local  IMGACL IMGINFO FILES ACLTMP
237
238# Ayuda o menos de 5 parametros y la imagen no es basica
239if [ "$*" == "help" ]; then
240        ogHelp "$MSG_HELP_ogAclFilter" \
241                "$FUNCNAME [ no parameters ]  "
242        return
243fi
244
245IMGACL="/tmp/ogimg.acl"
246IMGINFO="/tmp/ogimg.info"
247FILES="/tmp/files$$"
248ACLTMP="/tmp/acl$$.tmp"
249ACLFILES="/tmp/aclfiles$$"
250
251# comprobamos que existan los archivos de origen. Si no salimos sin error.
252[ -f $IMGACL -a -f $IMGINFO ] || return 0
253
254echo "" > $ACLTMP
255grep -n  -e "File" -e "Directory" $IMGACL > $ACLFILES
256
257# Al fichero le quitamos las líneas sobrantes: comentarios y lineas vacias.
258sed -e s/"^#.*$"//g $IMGINFO > $FILES
259sed -i '/^$/d'  $FILES
260
261
262# Recorremos el listado y extraemos la acl correspondiente al fichero o directorio.
263while read LINE; do
264    #read END INI <<< "$(grep -n  -e "File" -e "Directory" $IMGACL| grep -A 1 "$LINE"| awk -F :  '!(NR%2){print $1" "p}{p=$1}' )"
265    read END INI <<< "$(grep -A 1 "$LINE" $ACLFILES | awk -F :  '!(NR%2){print $1" "p}{p=$1}' )"
266    let NUM=$END-$INI-1
267    # Si algún archivo no se encuentra, el error lo mandamos a /dev/null
268    sed -n -e $INI,+"$NUM"p  $IMGACL 2>/dev/null >> $ACLTMP
269    echo "aclfilter: $LINE" >> $OGLOGCOMMAND
270done < $FILES
271
272cp $ACLTMP $IMGACL
273rm -f $FILES $ACLTMP $ACLFILES
274
275}
276
277#/**
278#  ogRestoreInfoImage
279#@brief Crear o modificar enlaces y restaurar las ACL. La informacion esta ya copiada a la particion.
280#@param 1 num_disk
281#@param 2 num_part
282#*/
283function ogRestoreInfoImage () {
284local  DEST PART IMGACL IMGLN OPTLN LINEA DESTLN ORIGLN TYPELN
285
286# Ayuda o menos de 5 parametros y la imagen no es basica
287if [ "$*" == "help" ]; then
288        ogHelp  "$FUNCNAME": "$MSG_HELP_ogRestoreInfoImage" \
289                "$FUNCNAME num_disk num_part" \
290                "base image -> $FUNCNAME 1 2 " \
291                "diff image -> $FUNCNAME 1 1 "
292        return
293fi
294
295if [ $# -lt 2 ]; then
296    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part  "
297    return $?
298fi
299
300# Control de errores.
301PART=$(ogDiskToDev "$1" "$2") || return $?
302DEST=$(ogMount $1 $2) || return $?
303
304IMGACL="ogimg.acl"
305IMGLN="ogimg.ln"
306
307#Creamos o modificamos los enlaces.
308# La imagen diferencial tiene ogimg.ln
309# para la completa lo generamos con los enlaces que contengan  /mnt/
310[ -r "$DEST/$IMGLN" ] || grep -e "->" -e "=>" "$DEST/ogimg.info"|grep "/mnt/" > "$DEST/$IMGLN"
311if [ $(wc -l "$DEST/$IMGLN"|cut -f1 -d" ") -ne 0 ]; then
312   while read LINEA
313   do
314        ORIGLN="${LINEA#*> }"
315        # Si origen hace referencia a la particion lo modificamos
316        echo $ORIGLN|grep "/mnt/"> /dev/null && ORIGLN="$DEST/${ORIGLN#/mnt/*/}"
317        # rsync marca - los enlaces simbolicos y = enlaces "duros"
318        LINEA="${LINEA%>*}"
319        TYPELN="${LINEA##* }"
320        DESTLN="${LINEA% *}"
321
322        if [ "$TYPELN" == "-" ]
323        then
324           OPTLN='-s'
325        else
326           OPTLN=''
327        fi
328        cd "$DEST/$(dirname "$DESTLN")"
329        rm -f "$(basename "$DESTLN")"
330        ln $OPTLN "$ORIGLN" "$(basename "$DESTLN")"
331        echo -n "."
332   done < "$DEST/$IMGLN"  2>/dev/null
333   echo ""
334
335fi
336
337# Restauramos acl
338if [ "$(ogGetFsType $1 $2)" == "NTFS"  -a -f "$DEST/$IMGACL" ] ; then
339        cd /
340        cp "$DEST/$IMGACL" /tmp
341        ogUnmount "$1" "$2"
342        echo "ntfs-3g.secaudit -se $PART /tmp/$IMGACL"
343        ntfs-3g.secaudit -se $PART /tmp/$IMGACL
344        # Para evitar que de falso error
345        echo ""
346fi
347
348}
349
350function ogSyncCreate () {
351#/**
352# ogSyncCreate
353#@brief   sincroniza los datos de la partición a la imagen para crearla. La imagen esta montada en un directorio.
354#@param 1 num_disk
355#@param 2 num_part
356#@param 3 Repositorio  [ REPO | CACHE ]
357#@param 4 Nombre Imagen
358#@param 5 Tipo imagen [ img | diff ]
359#*/
360local ORIG DIRAUX DIRMOUNT DESTRSYNC USERRSYNC PASSWORD OPTRSYNC RETVAL
361
362# Limpiamos los archivo de log
363echo  "" >$OGLOGCOMMAND;
364
365if [ "$*" == "help" ]; then
366        ogHelp  "$FUNCNAME": "$MSG_HELP_ogSyncCreate" \
367                "$FUNCNAME num_disk num_part [ REPO|CACHE ] image_name extension  " \
368                "$FUNCNAME 1 2 REPO Ubuntu12 img" \
369                "$FUNCNAME 1 1 CACHE Windows7 diff "
370        return
371fi
372
373
374if [ $# -lt 4 ]; then
375    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME  num_disk num_part [ REPO|CACHE ] image_name extension  "
376    return $?
377fi
378
379ORIG=$(ogMount $1 $2) || return $?
380
381DIRMOUNT="$(ogGetMountImageDir "$4" $5)"
382# Si la imagen es diferencial la lista de ficheros a transferir esta dentro de la imagen.
383if [ "$5" == "diff" ]; then
384        FILESFROM=" --files-from=/tmp/ogimg.info"
385        # Borramos los directorios
386        sed -i '/\/$/d' /tmp/ogimg.info
387else
388        FILESFROM=""
389fi
390
391if [ "$3" == "CACHE" -o "$3" == "cache" ]; then
392        DESTRSYNC="/tmp/$DIRMOUNT"
393else
394        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
395        PASSWORD="--password-file=/scripts/passrsync"
396        [ "$ogrsyncz" ==  "true" ] && OPTRSYNC="z "
397        [ "$ogrsyncw" == "true" ] && OPTRSYNC="W$OPTRSYNC"
398        USERRSYNC="opengnsys"
399        DESTRSYNC="$USERRSYNC@$REPOIP::ogimages/$DIRMOUNT"
400fi
401# Sincronizamos los datos de la partición a la imagen
402echo "      rsync -aHAX$OPTRSYNC --progress --inplace --delete $FILESFROM  $ORIG/ $DESTRSYNC"
403rsync -aHAX$OPTRSYNC $PASSWORD --progress --inplace --delete $FILESFROM  "$ORIG/" "$DESTRSYNC" 2>$OGLOGCOMMAND | egrep "^deleting|^sent|^sending|^total|%" |tee -a $OGLOGCOMMAND
404RETVAL=${PIPESTATUS[0]}
405echo "      rsync -aHAX$OPTRSYNC --inplace /tmp/ogimg* $DESTRSYNC"
406rsync -aHAX$OPTRSYNC  $PASSWORD  --inplace /tmp/ogimg* "$DESTRSYNC"
407
408return $RETVAL
409}
410
411
412#/**
413# ogSyncRestore
414#@brief   sincroniza los datos de la imagen a la partición para restaurarla.
415#@param 1 Repositorio  [ REPO | CACHE ]
416#@param 2 Nombre Imagen
417#@param 3 Tipo imagen [ img | diff ]
418#@param 4 num_disk
419#@param 5 num_part
420#*/
421function ogSyncRestore () {
422local DIRMOUNT ORIG DESTRSYNC PASSWORD OPTRSYNC USERRSYNC IMGINFO FILESFROM
423
424# Limpiamos los archivo de log
425echo  "" >$OGLOGCOMMAND;
426
427if [ "$*" == "help" ]; then
428        ogHelp  "$FUNCNAME": "$MSG_HELP_ogSyncRestore" \
429                "$FUNCNAME [ REPO|CACHE ] image_name extension  num_disk num_part  " \
430                "$FUNCNAME REPO Ubuntu12 img 1 2" \
431                "$FUNCNAME CACHE Windows7 diff 1 1"
432        return
433fi
434
435
436if [ $# -lt 5 ]; then
437    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME  [ REPO|CACHE ] image_name extension   num_disk num_part "
438    return $?
439fi
440
441
442DIRMOUNT="$(ogGetMountImageDir "$2" "$3")"
443DESTRSYNC=$(ogGetMountPoint $4 $5)
444
445# Borramos ficheros de informacion de restauraciones antiguas
446rm -rf $DESTRSYNC/ogimg.*
447
448# Origen y destino de la sincronizacion y en REPO opciones rsync
449if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
450        ORIG="/tmp/$DIRMOUNT"
451else
452        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
453        PASSWORD="--password-file=/scripts/passrsync"
454        [ "$ogrsyncz" ==  "true" ] && OPTRSYNC="z "
455        [ "$ogrsyncw" == "true" ] && OPTRSYNC="W$OPTRSYNC"
456        USERRSYNC="opengnsys"
457        ORIG="$USERRSYNC@$REPOIP::ogimages/$DIRMOUNT"
458fi
459
460# Opciones rsync en cache y repo
461# Para la imagen basica, opcion de borrar archivos de la particion que no existen en la imagen
462[ "$3" == "img" ] && [ "$ogrsyncdel" != "false" ] && OPTRSYNC="$OPTRSYNC --delete"
463
464# Nos traemos listado ficheros y bajamos la imagen
465
466ogEcho log session "      $MSG_SYNC_RESTORE"
467
468# Si la imagen es diferencial nos traemos los archivos de informacion de la imagen.
469if [ "$3" == "diff" ]; then
470        # Lista de archivos a copiar:
471        IMGINFO="ogimg.info"
472        FILESFROM=" --files-from=$DESTRSYNC/$IMGINFO"
473
474        echo "      rsync -aHAX$OPTRSYNC --progress  $ORIG/ogimg* $DESTRSYNC"
475        rsync -aHAX$OPTRSYNC $PASSWORD --progress  "$ORIG"/ogimg* $DESTRSYNC
476        # Borramos linea de información de la imagen, sino busca un fichero con ese nombre
477        sed -i   '/^\#/d' $DESTRSYNC/$IMGINFO
478
479        cd $DESTRSYNC
480        # Diferencial: Borramos archivos sobrantes.
481        ogEcho log session "      $MSG_SYNC_DELETE" 
482        cat "$DESTRSYNC/ogimg.rm" 2>/dev/null | xargs rm -rf
483
484fi
485
486echo "      rsync -aHAX$OPTRSYNC --progress  $FILESFROM  $ORIG/ $DESTRSYNC"
487rsync -aHAX$OPTRSYNC $PASSWORD --progress  $FILESFROM  "$ORIG/" "$DESTRSYNC"  2>$OGLOGCOMMAND | egrep "^deleting|^sent|^sending|^total|%"  |tee -a $OGLOGCOMMAND
488return ${PIPESTATUS[0]}
489
490}
491
492function ogMountImage () {
493#/**
494# ogMountImage
495#@brief   Monta la imagen para sincronizar.
496#@param 1 Repositorio  [ REPO | CACHE ]
497#@param 2 Nombre Imagen
498#@param 3 Tipo imagen [ img |diff ]
499#@return punto de montaje
500#*/
501local IMGEXT IMGFILE DIRMOUNT
502
503if [ "$*" == "help" ]; then
504        ogHelp "$FUNCNAME": "$MSG_HELP_ogMountImage" \
505                "$FUNCNAME [ REPO|CACHE ] image_name [ extension ]" \
506                "$FUNCNAME REPO Ubuntu12" \
507                "$FUNCNAME CACHE Windows7 diff"
508        return
509fi
510
511
512if [ $# -lt 2 ]; then
513    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME [ REPO|CACHE ]  image_name [ extension ]"
514    return $?
515fi
516
517[ "$3" == "" -o "$3" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
518
519DIRMOUNT="$(ogGetMountImageDir "$2" ${IMGEXT#*\.})"
520
521if [ "$1" == "REPO" -o "$1" == "repo" ]; then
522        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
523        hose $REPOIP 2009 --out sh -c "echo -ne MOUNT_IMAGE \"$2\" ${IMGEXT#*\.}"
524        echo "$OGIMG/$DIRMOUNT"
525else
526        # Si está montado nada que hacer.
527        df | grep "$DIRMOUNT$" 2>&1 >/dev/null && echo "/tmp/$DIRMOUNT" && return 0
528
529        IMGFILE="$(ogGetPath "$1" /"$2.$IMGEXT")" \
530                || return $(ogRaiseError $OG_ERR_NOTFOUND "$1 $2.$IMGEXT"; echo $?)
531        mkdir -p "/tmp/$DIRMOUNT"
532       
533        # FS de la imagen segun la version del kernel: < 3.7 ext4, si >=  btrfs
534        if [ $(uname -r|cut -d. -f2) -lt 7 ]; then
535            mount -t ext4 -o loop "$IMGFILE" "/tmp/$DIRMOUNT" 1>/dev/null
536        else
537            mount -o compress=lzo  "$IMGFILE" "/tmp/$DIRMOUNT" 1>/dev/null
538        fi
539
540        # Comprobamos que se ha montado bien
541        [ $? -eq 0 ] || return $(ogRaiseError $OG_ERR_DONTMOUNT_IMAGE "$1 $2 $3"; echo $?)
542        echo "/tmp/$DIRMOUNT"
543fi
544
545}
546
547
548
549
550
551function ogUnmountImage () {
552#/**
553# ogUnmountImage  [ REPO | CACHE ] Image_name [ extension ]
554#@brief   Desmonta la imagen para sincronizar.
555#@param 1 Repositorio  [ REPO | CACHE ]
556#@param 2 Nombre Imagen
557#@param 3 Tipo imagen [ img |diff ]
558#*/
559local IMGTYPE DIRMOUNT
560
561if [ "$*" == "help" ]; then
562    ogHelp "$FUNCNAME": "$MSG_HELP_ogUnmountImage" \
563                "$FUNCNAME [ REPO|CACHE ] image_name [ extension ]" \
564                "$FUNCNAME REPO Ubuntu12" \
565                "$FUNCNAME CACHE Windows7 diff"
566    return
567fi
568
569if [ $# -lt 2 ]; then
570    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME  [ REPO|CACHE ]  image_name [ extension ]"
571    return $?
572fi
573
574[ "$3" == "" ] && IMGTYPE="img" || IMGTYPE="$3"
575
576if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
577        DIRMOUNT="/tmp/$(ogGetMountImageDir "$2" $IMGTYPE)"
578        umount "$DIRMOUNT"
579        rmdir "$DIRMOUNT"
580        [ -f $IMGFILE.lock ] && sed -i s/"mounted"//g $IMGFILE.lock
581else
582        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
583        echo "      hose $REPOIP 2009 --out sh -c echo -ne UMOUNT_IMAGE \"$2\" $IMGTYPE"
584        hose $REPOIP 2009 --out sh -c "echo -ne UMOUNT_IMAGE \"$2\" $IMGTYPE"
585fi
586
587}
588
589function ogGetMountImageDir () {
590#/**
591# ogGetMountImageDir
592#@brief   Devuelve el directorio de montaje de la imagen.
593#@param 1 Nombre Imagen
594#@param 2 Tipo imagen [ img |diff ]
595#*/
596local DIRMOUNT
597if [ "$*" == "help" ]; then
598    ogHelp "$FUNCNAME": "$MSG_HELP_ogGetMountImageDir" \
599                "$FUNCNAME image_name [ extension ]" \
600                "$FUNCNAME Ubuntu12" \
601                "$FUNCNAME Windows7 diff"
602    return
603fi
604
605
606if [ $# -lt 1 ]; then
607    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME image_name [ extension ]"
608    return $?
609fi
610
611
612DIRMOUNT="mount/$1"
613[ "$2" == "diff" ] && DIRMOUNT="$DIRMOUNT.diff"
614echo "$DIRMOUNT"
615
616
617}
618
619
620#/**
621#  ogWaitSyncImage image_name extension stado imagen_size
622#@brief Se espera un tiempo a que se monte la imagen en el servidor.
623#@brief Cuando se esta creando la imagen hay que dar el tamaño, para que espere el tiempo de creación. 
624#@param 1 Respositorio [ REPO | CACHE ]
625#@param 2 Nombre Imagen
626#@param 3 Tipo imagen [ img | diff ]
627#@param 4 Estado [ mounted | reduced ]
628#@param 5 Tamaño imagen (opcional)
629#*/
630function ogWaitSyncImage () {
631local SIZE TIME DIRMOUNT TIMEOUT TIMEAUX LOCKFILE IMGDIR IMGEXT STATE
632
633TIME=$SECONDS
634
635# Ayuda o menos de 5 parametros y la imagen no es basica
636if [ "$*" == "help" ]; then
637        ogHelp  "$FUNCNAME": "$MSG_HELP_ogWaitMountImage" \
638                "$FUNCNAME [ REPO | CACHE ] image_name extension state [ image_size ] " \
639                "$FUNCNAME REPO Ubuntu12 img 30000000" \
640                "$FUNCNAME CACHE Windows7 diff "
641        return
642fi
643
644if [ $# -lt 4 ]; then
645    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME [ REPO | CACHE ]  image_name extension state [ image_size ] "
646    return $?
647fi
648
649SIZE=${5:-"300000"}
650STATE="$4"
651ogCheckStringInGroup "$STATE" "mounted reduced" || \
652        return $(ogRaiseError  command $OG_ERR_FORMAT "STATE = [ mounted | reduced  ]" )
653
654IMGDIR="$(ogGetParentPath "$1" "/$2")"
655[ "$3" == "img" ] && IMGEXT="img" ||  IMGEXT="img.diff"
656LOCKFILE="${IMGDIR}/$(basename "/$2").$IMGEXT.lock"
657
658if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
659        DIRMOUNT="/tmp/$(ogGetMountImageDir "$2" $3)"
660else
661        DIRMOUNT="$OGIMG/$(ogGetMountImageDir "$2" $3)"
662fi
663
664echo -n -e "      $MSG_SYNC_SLEEP: $DIRMOUNT\n      #"  | tee -a $OGLOGSESSION $OGLOGFILE
665
666# Comprobamos: mounted -> que exista $DIRMOUNT/ogimg.info o que el fichero de lock contenga mounted
667#              reduced -> que el fichero de lock contenga reduced.
668
669# time-out segun el tamaño de la imagen. por defecto: 100000k -> 3s
670let TIMEOUT=$SIZE/$CREATESPEED
671[ $TIMEOUT -lt 60 ] && TIMEOUT=60
672until $(grep -i $STATE $LOCKFILE &>/dev/null) ; do
673        [ $STATE = "mounted" -a -f "$DIRMOUNT/ogimg.info" ] && ogEcho session "" && return 0
674        TIMEAUX=$[SECONDS-TIME]
675        [  "$TIMEAUX" -lt "$TIMEOUT" ] || return $(ogRaiseError $OG_ERR_DONTMOUNT_IMAGE "$3 $4 $IMGEXT"; echo $?)
676        echo -n "#"  | tee -a $OGLOGSESSION $OGLOGFILE
677        sleep 5
678done
679echo  "" | tee -a $OGLOGSESSION $OGLOGFILE
680
681}
682
683
684function ogReduceImage () {
685#/**
686# ogReduceImage
687#@brief   Reduce el archivo de la imagen a tamaño datos + 500M
688#@param 1 Repositorio  [ REPO | CACHE ]
689#@param 2 Nombre Imagen
690#@param 3 Tipo Imagen [ img |diff ]
691#@return
692#@exception OG_ERR_FORMAT     # 1 formato incorrecto.
693#@exception OG_ERR_NOTFOUND        # 2 Fichero o dispositivo no encontrado.
694#*/
695local IMGEXT DIRMOUNT AVAILABLE USED IMGDIR IMGFILE ENDSIZE LOOPDEVICE
696if [ "$*" == "help" ]; then
697    ogHelp "$FUNCNAME": "$MSG_HELP_ogReduceImage" \
698                "$FUNCNAME [ REPO|CACHE ] image_name [ extension ]" \
699                "$FUNCNAME REPO Ubuntu12" \
700                "$FUNCNAME CACHE Windows7 diff"
701    return
702fi
703
704if [ $# -lt 2 ]; then
705    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME [ REPO|CACHE ] image_name [ extension ]"
706    return $?
707fi
708
709
710[ "$3" == "" -o "$3" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
711IMGDIR="$(ogGetParentPath "$1" "/$2")"
712IMGFILE="${IMGDIR}/$(basename "/$2").$IMGEXT"
713
714# Solo es posible para imagenes EXT4. Si no es EXT4 salimos sin error
715file "$IMGFILE" | grep -i " ext4 filesystem " 2>&1 > /dev/null || return 0
716
717if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
718        # Al montar se comprueba la existencia de la imagen
719        DIRMOUNT="$(ogMountImage $1 "$2" ${IMGEXT#*\.})"
720        AVAILABLE=$(df -k|grep "$DIRMOUNT$"|awk '{print $4}')
721        # Si el espacio libre menor que 500Mb nos salimos
722        if [ $AVAILABLE -lt 200000 ]; then
723                ogUnmountImage $1 "$2" ${IMGEXT#*\.}
724                echo "reduced" > "$IMGFILE.lock"
725                return 0
726        fi
727
728        # Calculamos la diferencia entre el tamaño interno y externo
729        EXTSIZE=$(ls -l --block-size=1024 "$IMGFILE" | cut -f5 -d" ")
730        INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}')
731        let EDGESIZE=$EXTSIZE-$INTSIZE
732        ogUnmountImage $1 "$2" ${IMGEXT#*\.}
733        LOOPDEVICE=$(losetup -f)
734        losetup $LOOPDEVICE "$IMGFILE"
735
736        # Redimensiono sistema de ficheros
737        echo "      resize2fs -fpM $LOOPDEVICE"
738        resize2fs -fpM $LOOPDEVICE |tee -a $OGLOGCOMMAND
739        ogMountImage $1 "$2" ${IMGEXT#*\.} >/dev/null
740
741        # Calculamos el tamaño final del archivo
742        INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}')
743        let EXTSIZE=$INTSIZE+$EDGESIZE
744        umount "$DIRMOUNT"
745
746        # Si existe dispositivo de loop lo borro.
747        [ $LOOPDEVICE ] && losetup -d $LOOPDEVICE
748
749        # Corto el archivo al tamaño del sistema de ficheros.
750        echo "      truncate --size=\"$EXTSIZE\"k $IMGFILE  "
751        truncate --size="$EXTSIZE"k "$IMGFILE"
752
753        # Desmonto  la imagen
754        echo "reduced" > "$IMGFILE.lock"
755        rmdir "$DIRMOUNT"
756
757else
758        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
759        echo "      hose $REPOIP 2009 --out sh -c echo -ne REDUCE_IMAGE \"$2\" ${IMGEXT#*\.}"
760        hose $REPOIP 2009 --out sh -c "echo -ne REDUCE_IMAGE \"$2\" ${IMGEXT#*\.}"
761fi
762
763
764}
765
766
767
768function ogIsSyncImage () {
769#/**
770# ogIsSyncImage
771#@brief   Comprueba si la imagen es sincronizable
772#@param 1 Repositorio  [ REPO | CACHE ]
773#@param 2 Nombre Imagen
774#@param 3 Tipo Imagen [ img |diff ]
775#@return
776#@exception OG_ERR_FORMAT     # 1 formato incorrecto.
777#@exception OG_ERR_NOTFOUND        # 2 Fichero o dispositivo no encontrado.
778#*/
779local IMGEXT IMGDIR IMGFILE
780
781if [ "$*" == "help" ]; then
782    ogHelp "$FUNCNAME": "$MSG_HELP_ogIsSyncImage" \
783                "$FUNCNAME [ REPO|CACHE ] image_name [ extension ]" \
784                "$FUNCNAME REPO Ubuntu12" \
785                "$FUNCNAME CACHE Windows7 diff"
786    return
787fi
788
789if [ $# -lt 2 ]; then
790    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME [ REPO|CACHE ] image_name [ extension ]"
791    return $?
792fi
793
794[ "$3" == "" -o "$3" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
795IMGDIR="$(ogGetParentPath "$1" "/$2")"
796IMGFILE="${IMGDIR}"/$(basename "/$2").$IMGEXT
797
798file "$IMGFILE" | grep -i -e " BTRFS Filesystem " -e " ext4 filesystem " >/dev/null
799[ $? -eq 0 ] && return 0 || return $OG_ERR_DONTSYNC_IMAGE
800
801
802}
803
804#/**
805# ogCheckSyncImage
806#@brief   Muestra el contenido de la imagen para comprobarla.
807#@param 1 Repositorio  [ REPO | CACHE ]
808#@param 2 Nombre Imagen
809#@param 3 Tipo Imagen [ img |diff ]
810#@return
811#@exception OG_ERR_FORMAT     # 1 formato incorrecto.
812#@exception OG_ERR_NOTFOUND        # 2 Fichero o dispositivo no encontrado.
813#*/
814function ogCheckSyncImage () {
815local IMGEXT  IMGDIR  IMGFILE DIRMOUNT RETVAL
816
817if [ "$*" == "help" ]; then
818    ogHelp "$FUNCNAME":  "$MSG_HELP_ogCheckSyncImage" \
819                "$FUNCNAME [ REPO|CACHE ] image_name [ extension ]" \
820                "$FUNCNAME REPO Ubuntu12" \
821                "$FUNCNAME CACHE Windows7 diff"
822    return
823fi
824
825if [ $# -lt 2 ]; then
826    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME [ REPO|CACHE ] image_name [ extension ]"
827    return $?
828fi
829
830[ "$3" == "" -o "$3" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
831IMGDIR="$(ogGetParentPath "$1" "/$2")"
832IMGFILE="${IMGDIR}/$(basename "/$2").$IMGEXT"
833
834ogIsSyncImage $1 "$2" "${IMGEXT#*\.}" || return $(ogRaiseError $OG_ERR_DONTSYNC_IMAGE "$3 $4"; echo $?)
835
836DIRMOUNT="/tmp/ogCheckImage$$"
837mkdir "$DIRMOUNT"
838# FS de la imagen segun la version del kernel: < 3.7 ext4, si >=  btrfs
839if [ $(uname -r|cut -d. -f2) -lt 7 ]; then
840        mount -t ext4 -o loop "$IMGFILE" "$DIRMOUNT" 2>&1 | tee -a $OGLOGCOMMAND
841        RETVAL=${PIPESTATUS[0]}
842else
843        mount -o compress=lzo  "$IMGFILE" "$DIRMOUNT" 2>&1 | tee -a $OGLOGCOMMAND
844        RETVAL=${PIPESTATUS[0]}
845fi
846ls -C "$DIRMOUNT" | tee -a $OGLOGCOMMAND
847umount "$DIRMOUNT"
848
849rmdir "$DIRMOUNT"
850return $RETVAL
851}
Note: See TracBrowser for help on using the repository browser.