source: client/engine/Rsync.lib @ 8ecc409

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-instalacion
Last change on this file since 8ecc409 was 348b5c9, checked in by Irina Gómez <irinagomez@…>, 6 years ago

#855 #679 Los script de crear o restaurar imágenes sincronizadas permiten cambiar de repositorio. ogChangeRepo: se resuelve errata por la que no tomaba los permisos (ro|rw) del repositorio.

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