source: client/engine/Rsync.lib @ c7df6bf

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 c7df6bf was 654d744, checked in by irina <irinagomez@…>, 11 years ago

#565 cambios en la creacion y restauracion de diferenciales.

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

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