source: client/engine/Rsync.lib @ f9e03ad

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 f9e03ad was 6c2dee2, checked in by irina <irinagomez@…>, 12 years ago

#565 mejora: al crear las imagenes diferenciales, backup de acl solo de los ficheros modificados

git-svn-id: https://opengnsys.es/svn/branches/version1.0@4068 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/$(ogGetMountDir "$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=$(ogGetMountDir "$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 ] || ogRaiseError  $OG_ERR_NOTFOUND "$IMGACL, $IMGINFO" || return 0
233
234echo "" > $ACLTMP
235
236# Al fichero le quitamos las líneas sobrantes: comentarios y lineas vacias.
237sed -e s/"^#.*$"//g $IMGINFO > $FILES
238sed -i '/^$/d'  $FILES
239
240# Recorremos el listado y extraemos la acl correspondiente al fichero o directorio.
241while read LINE; do
242    read END INI <<< "$(grep -n  -e "File" -e "Directory" $IMGACL| grep -A 1 "$LINE"| awk -F :  '!(NR%2){print $1" "p}{p=$1}' )"
243    let NUM=$END-$INI-1
244    sed -n -e $INI,+"$NUM"p  $IMGACL &>> $ACLTMP
245done < $FILES
246
247cp $ACLTMP $IMGACL
248
249}
250
251#/**
252#  ogRestoreInfoImage
253#@brief Crear o modificar enlaces y restaurar las ACL. La informacion esta ya copiada a la particion.
254#@param 1 num_disk
255#@param 2 num_part
256#*/
257function ogRestoreInfoImage () {
258local  DEST PART IMGACL IMGLN OPTLN LINEA DESTLN ORIGLN TYPELN
259
260# Ayuda o menos de 5 parametros y la imagen no es basica
261if [ "$*" == "help" ]; then
262        ogHelp "$FUNCNAME" "$FUNCNAME num_disk num_part" \
263               "base image -> $FUNCNAME 1 2 " \
264               "diff image -> $FUNCNAME 1 1 "
265        return
266fi
267
268if [ $# -lt 2 ]; then
269    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part  "
270    return $?
271fi
272
273DEST=$(ogMount $1 $2)
274PART=$(ogDiskToDev "$1" "$2" 2>/dev/null)
275IMGACL="ogimg.acl"
276IMGLN="ogimg.ln"
277
278#Creamos o modificamos los enlaces.
279# La imagen diferencial tiene ogimg.ln
280# para la completa lo generamos con los enlaces que contengan  /mnt/
281[ -r $DEST/$IMGLN ] || grep -e "->" -e "=>" $DEST/ogimg.info|grep "/mnt/" > $DEST/$IMGLN
282if [ $(wc -l $DEST/$IMGLN|cut -f1 -d" ") -ne 0 ]; then
283   while read LINEA
284   do
285        ORIGLN="${LINEA#*> }"
286        # Si origen hace referencia a la particion lo modificamos
287        echo $ORIGLN|grep "/mnt/"> /dev/null && ORIGLN="$DEST/${ORIGLN#/mnt/*/}"
288        # rsync marca - los enlaces simbolicos y = enlaces "duros"
289        LINEA="${LINEA%>*}"
290        TYPELN="${LINEA##* }"
291        DESTLN="${LINEA% *}"
292
293        if [ "$TYPELN" == "-" ]
294        then
295           OPTLN='-s'
296        else
297           OPTLN=''
298        fi
299        cd "$DEST/$(dirname $DESTLN)"
300        rm "$(basename $DESTLN)"
301        ln $OPTLN "$ORIGLN" "$(basename $DESTLN)"
302        echo -n "."
303   done < $DEST/$IMGLN  2>/dev/null
304   echo ""
305
306fi
307
308# Restauramos acl
309if [ "$(ogGetFsType $1 $2)" == "NTFS"  -a -f $DEST/$IMGACL ] ; then
310        cd /
311        cp $DEST/$IMGACL /tmp
312        ogUnmount "$1" "$2"
313        echo "      ntfs-3g.secaudit -se $PART" |tee -a $OGLOGSESSION $OGLOGFILE
314        ntfs-3g.secaudit -se $PART /tmp/$IMGACL
315        # Para evitar que de falso error
316        echo ""
317fi
318
319}
320
321function ogSyncCreate () {
322#/**
323# ogSyncCreate
324#@brief   sincroniza los datos de la partición a la imagen para crearla. La imagen esta montada en un directorio.
325#@param 1 num_disk
326#@param 2 num_part
327#@param 3 Repositorio  [ REPO | CACHE ]
328#@param 4 Nombre Imagen
329#@param 5 Tipo imagen [ img | diff ]
330#*/
331local ORIG DIRAUX DIRMOUNT DESTRSYNC USERRSYNC PASSWORD OPTRSYNC
332
333if [ "$*" == "help" ]; then
334        ogHelp "$FUNCNAME" "$FUNCNAME num_disk num_part [ REPO|CACHE ] image_name extension  " \
335               "$FUNCNAME 1 2 REPO Ubuntu12 img" \
336               "$FUNCNAME 1 1 CACHE Windows7 diff "
337        return
338fi
339
340
341if [ $# -lt 4 ]; then
342    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME  num_disk num_part [ REPO|CACHE ] image_name extension  "
343    return $?
344fi
345
346ORIG=$(ogMount $1 $2)
347DIRMOUNT=$(ogGetMountDir "$4" $5)
348# Si la imagen es diferencial la lista de ficheros a transferir esta dentro de la imagen.
349[ "$5" == "diff" ] && FILESFROM=" --files-from=/tmp/ogimg.info" || FILESFROM=""
350
351if [ "$3" == "CACHE" -o "$3" == "cache" ]; then
352        DESTRSYNC="/tmp/$DIRMOUNT"
353else
354        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
355        PASSWORD="--password-file=/scripts/passrsync"
356        [ "$ogrsyncz" ==  "true" ] && OPTRSYNC="z "
357        [ "$ogrsyncw" == "true" ] && OPTRSYNC="W$OPTRSYNC"
358        USERRSYNC="opengnsys"
359        DESTRSYNC="$USERRSYNC@$REPOIP::ogimages/$DIRMOUNT"
360fi
361# Sincronizamos los datos de la partición a la imagen
362echo "      rsync -aHAX$OPTRSYNC --inplace --delete $FILESFROM  $ORIG/ $DESTRSYNC" | tee -a $OGLOGSESSION $OGLOGFILE
363rsync -aHAXq$OPTRSYNC $PASSWORD  --inplace --delete $FILESFROM  "$ORIG/" "$DESTRSYNC"
364echo "      rsync -aHAX$OPTRSYNC --inplace /tmp/ogimg* $DESTRSYNC" | tee -a $OGLOGSESSION $OGLOGFILE
365rsync -aHAXq$OPTRSYNC  $PASSWORD --inplace /tmp/ogimg* $DESTRSYNC
366
367}
368
369
370#/**
371# ogSyncRestore
372#@brief   sincroniza los datos de la imagen a la partición para restaurarla.
373#@param 1 Repositorio  [ REPO | CACHE ]
374#@param 2 Nombre Imagen
375#@param 3 Tipo imagen [ img | diff ]
376#@param 4 num_disk
377#@param 5 num_part
378#*/
379function ogSyncRestore () {
380local DIRMOUNT ORIG DESTRSYNC PASSWORD OPTRSYNC USERRSYNC IMGINFO FILESFROM
381
382if [ "$*" == "help" ]; then
383        ogHelp "$FUNCNAME" "$FUNCNAME [ REPO|CACHE ] image_name extension  num_disk num_part  " \
384               "$FUNCNAME REPO Ubuntu12 img 1 2" \
385               "$FUNCNAME CACHE Windows7 diff 1 1"
386        return
387fi
388
389
390if [ $# -lt 5 ]; then
391    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME  [ REPO|CACHE ] image_name extension   num_disk num_part "
392    return $?
393fi
394
395
396DIRMOUNT=$(ogGetMountDir "$2" "$3")
397DESTRSYNC=$(ogGetMountPoint $4 $5)
398
399# Borramos ficheros de informacion de restauraciones antiguas
400rm -rf $DESTRSYNC/ogimg.*
401
402# Origen y destino de la sincronizacion y en REPO opciones rsync
403if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
404        ORIG="/tmp/$DIRMOUNT"
405else
406        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
407        PASSWORD="--password-file=/scripts/passrsync"
408        [ "$ogrsyncz" ==  "true" ] && OPTRSYNC="z "
409        [ "$ogrsyncw" == "true" ] && OPTRSYNC="W$OPTRSYNC"
410        USERRSYNC="opengnsys"
411        ORIG="$USERRSYNC@$REPOIP::ogimages/$DIRMOUNT"
412fi
413
414# Opciones rsync en cache y repo
415# Para la imagen basica, opcion de borrar archivos de la particion que no existen en la imagen
416[ "$3" == "img" ] && [ "$ogrsyncdel" != "false" ] && OPTRSYNC="$OPTRSYNC --delete"
417
418# Nos traemos listado ficheros y bajamos la imagen
419
420echo "      $MSG_SYNC_RESTORE" |tee -a  $OGLOGSESSION   $OGLOGFILE
421
422# Si la imagen es diferencial nos traemos los archivos de informacion de la imagen.
423if [ "$3" == "diff" ]; then
424        # Lista de archivos a copiar:
425        IMGINFO="ogimg.info"
426        FILESFROM=" --files-from=$DESTRSYNC/$IMGINFO"
427
428        echo "      rsync -aHAXq$OPTRSYNC  $ORIG/ogimg* $DESTRSYNC" |tee -a  $OGLOGFILE
429        rsync -aHAXq$OPTRSYNC $PASSWORD  $ORIG/ogimg* $DESTRSYNC
430        # Borramos linea de información de la imagen, sino busca un fichero con ese nombre
431        sed -i   '/^\#/d' $DESTRSYNC/$IMGINFO
432
433        cd $DESTRSYNC
434        # Diferencial: Borramos archivos sobrantes.
435        echo "      $MSG_SYNC_DELETE"  |tee -a  $OGLOGFILE
436        cat $DESTRSYNC/ogimg.rm 2>/dev/null | xargs rm -rf
437
438fi
439
440echo "      rsync -aHAX$OPTRSYNC  $FILESFROM  $ORIG/ $DESTRSYNC" | tee -a $OGLOGSESSION $OGLOGFILE
441rsync -aHAXq$OPTRSYNC $PASSWORD  $FILESFROM  "$ORIG/" "$DESTRSYNC"
442
443
444}
445
446function ogMountImage () {
447#/**
448# ogMountImage
449#@brief   Monta la imagen para sincronizar.
450#@param 1 Repositorio  [ REPO | CACHE ]
451#@param 2 Nombre Imagen
452#@param 3 Tipo imagen [ img |diff ]
453#@return punto de montaje
454#*/
455local IMGEXT IMGFILE DIRMOUNT
456
457if [ "$*" == "help" ]; then
458    ogHelp "$FUNCNAME" "$FUNCNAME [ REPO|CACHE ] image_name [ extension ]" \
459           "$FUNCNAME REPO Ubuntu12" \
460           "$FUNCNAME CACHE Windows7 diff"
461    return
462fi
463
464
465if [ $# -lt 2 ]; then
466    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME [ REPO|CACHE ]  image_name [ extension ]"
467    return $?
468fi
469
470[ "$3" == "" -o "$3" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
471
472DIRMOUNT=$(ogGetMountDir "$2" ${IMGEXT#*\.})
473
474if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
475        # Si está montado nada que hacer.
476        df | grep "$DIRMOUNT$" 2>&1 >/dev/null && echo "/tmp/$DIRMOUNT" && return 0
477
478        IMGFILE=$(ogGetPath "$1" /"$2.$IMGEXT")
479        mkdir -p "/tmp/$DIRMOUNT"
480       
481        # FS de la imagen segun la version del kernel: < 3.7 ext4, si >=  btrfs
482        #if [[ "$(uname -r)" < "3.7" ]]; then
483        if [ $(uname -r|cut -d. -f2) -lt 7 ]; then
484            mount -t ext4 -o loop "$IMGFILE" "/tmp/$DIRMOUNT" 1>/dev/null
485        else
486            mount -o compress=lzo  "$IMGFILE" "/tmp/$DIRMOUNT" 1>/dev/null
487        fi
488
489        # Comprobamos que se ha montado bien
490        [ $? -eq 0 ] || ogRaiseError $OG_ERR_DONTMOUNT_IMAGE "$1 $2 $3" || return $?
491        echo "/tmp/$DIRMOUNT"
492
493else
494        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
495        hose $REPOIP 2009 --out sh -c "echo -ne MOUNT_IMAGE \"$2\" ${IMGEXT#*\.}"
496        echo "$OGIMG/$DIRMOUNT"
497
498fi
499
500}
501
502
503
504
505
506function ogUnmountImage () {
507#/**
508# ogUnmountImage  [ REPO | CACHE ] Image_name [ extension ]
509#@brief   Desmonta la imagen para sincronizar.
510#@param 1 Repositorio  [ REPO | CACHE ]
511#@param 2 Nombre Imagen
512#@param 3 Tipo imagen [ img |diff ]
513#*/
514local IMGTYPE DIRMOUNT
515
516if [ "$*" == "help" ]; then
517    ogHelp "$FUNCNAME" "$FUNCNAME [ REPO|CACHE ] image_name [ extension ]" \
518           "$FUNCNAME REPO Ubuntu12" \
519           "$FUNCNAME CACHE Windows7 diff"
520    return
521fi
522
523if [ $# -lt 2 ]; then
524    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME  [ REPO|CACHE ]  image_name [ extension ]"
525    return $?
526fi
527
528[ "$3" == "" ] && IMGTYPE="img" || IMGTYPE="$3"
529
530if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
531        DIRMOUNT=/tmp/$(ogGetMountDir "$2" $IMGTYPE)
532        umount "$DIRMOUNT"
533        rmdir "$DIRMOUNT"
534else
535        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
536        echo "      hose $REPOIP 2009 --out sh -c echo -ne UMOUNT_IMAGE \"$2\" $IMGTYPE" |tee -a  $OGLOGFILE
537        hose $REPOIP 2009 --out sh -c "echo -ne UMOUNT_IMAGE \"$2\" $IMGTYPE"
538fi
539
540}
541
542function ogGetMountDir () {
543#/**
544# ogGetMountDir
545#@brief   Devuelve el directorio de montaje de la imagen.
546#@param 1 Nombre Imagen
547#@param 2 Tipo imagen [ img |diff ]
548#*/
549local DIRMOUNT
550if [ "$*" == "help" ]; then
551    ogHelp "$FUNCNAME" "$FUNCNAME image_name [ extension ]" \
552           "$FUNCNAME Ubuntu12" \
553           "$FUNCNAME Windows7 diff"
554    return
555fi
556
557
558if [ $# -lt 1 ]; then
559    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME image_name [ extension ]"
560    return $?
561fi
562
563
564DIRMOUNT="mount/$1"
565[ "$2" == "diff" ] && DIRMOUNT="$DIRMOUNT.diff"
566echo $DIRMOUNT
567
568
569}
570
571
572#/**
573#  ogWaitMountImage image_name extension imagen_size
574#@brief Se espera un tiempo a que se monte la imagen en el servidor.
575#@brief Cuando se esta creando la imagen hay que dar el tamaño, para que espere el tiempo de creación. 
576#@param 1 Respositorio [ REPO | CACHE ]
577#@param 2 Nombre Imagen
578#@param 3 Tipo imagen [ img | diff ]
579#@param 4 Tamaño imagen (opcional)
580#*/
581function ogWaitMountImage () {
582local SIZE TIME DIRMOUNT TIMEOUT TIMEAUX
583
584TIME=$SECONDS
585
586# Ayuda o menos de 5 parametros y la imagen no es basica
587if [ "$*" == "help" ]; then
588        ogHelp "$FUNCNAME" "$FUNCNAME [ REPO | CACHE ] image_name extension [ image_size ] " \
589               "$FUNCNAME REPO Ubuntu12 img 30000000" \
590               "$FUNCNAME CACHE Windows7 diff "
591        return
592fi
593
594if [ $# -lt 2 ]; then
595    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME [ REPO | CACHE ]  image_name extension [ image_size ] "
596    return $?
597fi
598
599
600SIZE=${4:-"300000"}
601
602if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
603        DIRMOUNT="/tmp/$(ogGetMountDir "$2" $3)"
604else
605        DIRMOUNT="$OGIMG/$(ogGetMountDir "$2" $3)"
606fi
607
608echo -n -e "      $MSG_SYNC_SLEEP: $DIRMOUNT\n      #"
609
610# time-out segun el tamaño de la imagen. por defecto: 100000k -> 3s
611let TIMEOUT=$SIZE/$CREATESPEED
612[ $TIMEOUT -lt 60 ] && TIMEOUT=60
613until [ -f "$DIRMOUNT/ogimg.info" ] ; do
614        TIMEAUX=$[SECONDS-TIME]
615        #[  "$TIMEAUX" -gt "$TIMEOUT" ] && return $(ogRaiseError "$MSG_ERR_DONTMOUNT_IMAGE $1 $2 $3: time_out $TIMEAUX seg."; echo $?)
616        # TODO definir el error
617        [  "$TIMEAUX" -gt "$TIMEOUT" ] &&  return 2
618        echo -n "#"
619        sleep 5
620done
621echo  ""
622
623}
624
625
626function ogReduceImage () {
627#/**
628# ogReduceImage
629#@brief   Reduce el archivo de la imagen a tamaño datos + 500M
630#@param 1 Repositorio  [ REPO | CACHE ]
631#@param 2 Nombre Imagen
632#@param 3 Tipo Imagen [ img |diff ]
633#@return
634#@exception OG_ERR_FORMAT     # 1 formato incorrecto.
635#@exception OG_ERR_NOTFOUND        # 2 Fichero o dispositivo no encontrado.
636#*/
637local IMGEXT DIRMOUNT AVAILABLE USED IMGDIR IMGFILE ENDSIZE LOOPDEVICE
638if [ "$*" == "help" ]; then
639    ogHelp "$FUNCNAME" "$FUNCNAME [ REPO|CACHE ] image_name [ extension ]" \
640           "$FUNCNAME REPO Ubuntu12" \
641           "$FUNCNAME CACHE Windows7 diff"
642    return
643fi
644
645if [ $# -lt 2 ]; then
646    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME [ REPO|CACHE ] image_name [ extension ]"
647    return $?
648fi
649
650
651[ "$3" == "" -o "$3" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
652IMGDIR=$(ogGetParentPath "$1" "/$2")
653IMGFILE="${IMGDIR}"/$(basename "/$2").$IMGEXT
654
655# Solo es posible para imagenes EXT4. Si no es EXT4 salimos sin error
656file $IMGFILE | grep -i " ext4 filesystem " 2>&1 > /dev/null || return 0
657
658if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
659        # Al montar se comprueba la existencia de la imagen
660        DIRMOUNT=$(ogMountImage $1 $2 ${IMGEXT#*\.})
661
662        AVAILABLE=$(df -k|grep "$DIRMOUNT$"|awk '{print $4}')
663        # Si el espacio libre menor que 500Mb nos salimos
664        if [ $AVAILABLE -lt 200000 ]; then
665                ogUnmountImage $1 $2 ${IMGEXT#*\.}
666                return 0
667        fi
668
669
670        # Calculamos la diferencia entre el tamaño interno y externo
671        EXTSIZE=$(ls -l --block-size=1024 $IMGFILE | cut -f5 -d" ")
672        INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}')
673        let EDGESIZE=$EXTSIZE-$INTSIZE
674
675        ogUnmountImage $1 $2 ${IMGEXT#*\.}
676        LOOPDEVICE=$(losetup -f)
677        losetup $LOOPDEVICE "$IMGFILE"
678
679        # Redimensiono sistema de ficheros
680        echo resize2fs -fpM $LOOPDEVICE
681        resize2fs -fpM $LOOPDEVICE |tee -a $OGLOGCOMMAND
682        ogMountImage $1 $2 ${IMGEXT#*\.}
683
684        # Calculamos el tamaño final del archivo
685        INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}')
686        let EXTSIZE=$INTSIZE+$EDGESIZE
687        umount $DIRMOUNT
688
689        # Si existe dispositivo de loop lo borro.
690        [ $LOOPDEVICE ] && losetup -d $LOOPDEVICE
691
692        # Corto el archivo al tamaño del sistema de ficheros.
693        echo "      truncate --size=\"$EXTSIZE\"k $IMGFILE  "
694        truncate --size="$EXTSIZE"k $IMGFILE
695
696        rmdir $DIRMOUNT
697
698else
699        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
700        echo "      hose $REPOIP 2009 --out sh -c echo -ne REDUCE_IMAGE \"$2\" ${IMGEXT#*\.}"
701        hose $REPOIP 2009 --out sh -c "echo -ne REDUCE_IMAGE \"$2\" ${IMGEXT#*\.}"
702fi
703
704
705}
706
707
708
709function ogIsSyncImage () {
710#/**
711# ogIsSyncImage
712#@brief   Comprueba si la imagen es sincronizable
713#@param 1 Repositorio  [ REPO | CACHE ]
714#@param 2 Nombre Imagen
715#@param 3 Tipo Imagen [ img |diff ]
716#@return
717#@exception OG_ERR_FORMAT     # 1 formato incorrecto.
718#@exception OG_ERR_NOTFOUND        # 2 Fichero o dispositivo no encontrado.
719#*/
720local IMGEXT IMGDIR IMGFILE
721
722if [ "$*" == "help" ]; then
723    ogHelp "$FUNCNAME" "$FUNCNAME [ REPO|CACHE ] image_name [ extension ]" \
724           "$FUNCNAME REPO Ubuntu12" \
725           "$FUNCNAME CACHE Windows7 diff"
726    return
727fi
728
729if [ $# -lt 2 ]; then
730    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME [ REPO|CACHE ] image_name [ extension ]"
731    return $?
732fi
733
734[ "$3" == "" -o "$3" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
735IMGDIR=$(ogGetParentPath "$1" "/$2")
736IMGFILE="${IMGDIR}"/$(basename "/$2").$IMGEXT
737
738file "$IMGFILE" | grep -i -e " BTRFS Filesystem " -e " ext4 filesystem " >/dev/null
739[ $? -eq 0 ] && return 0 || return $OG_ERR_DONTSYNC_IMAGE
740
741
742}
Note: See TracBrowser for help on using the repository browser.