source: client/engine/Rsync.lib @ baa5919

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

#565 Cambio nombre ogGetMountDir a ogGetMountImageDir. restoreDiffImage restaura antes la completa

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

  • Property mode set to 100755
File size: 23.4 KB
RevLine 
[d2b8d24]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
[e24b042]7#@param 3 Tipo imagen [ img |diff ]
[d2b8d24]8#@param 4 Tamaño de la imagen
9#@return  instrucción para ser ejecutada.
10#*/
11
12function ogCreateFileImage () {
[e24b042]13local SIZEREQUIRED IMGDIR IMGFILE DIRMOUNT LOOPDEVICE  IMGSIZE IMGEXT
[d2b8d24]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")
[e24b042]33        [ "$3" == "img" ] && IMGEXT="img" ||  IMGEXT="img.diff"
34        IMGFILE=${IMGDIR}/$(basename "/$2").$IMGEXT
[d2b8d24]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
[baa5919]41        DIRMOUNT=/tmp/$(ogGetMountImageDir "$2" "$3")
[d2b8d24]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
[cd1f048]46                # Si la imagen esta montada la desmonto
47                if [ -r "$DIRMOUNT/ogimg.info" ]; then
48                    umount "$DIRMOUNT"
[e24b042]49                    [ $? -ne 0 ] && return $(ogRaiseError $OG_ERR_DONTUNMOUNT_IMAGE "$1 $2.$IMGEXT"; echo $?)
[cd1f048]50                fi
51
[d2b8d24]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
[56b3a42]60                IMGSIZE=$(ls -l --block-size=1024 $IMGFILE | awk '{print $5}')
[d2b8d24]61                if [ $IMGSIZE -lt $SIZEREQUIRED ];then
[1ee5d4d3]62                   echo "      $MSG_SYNC_RESIZE" | tee -a $OGLOGSESSION $OGLOGFILE
[d2b8d24]63                   echo "      truncate --size=>$SIZEREQUIRED k $IMGFILE" | tee -a $OGLOGSESSION $OGLOGFILE
[f456755]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
[d2b8d24]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
[f456755]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
[d2b8d24]93        fi
[f456755]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"
[d2b8d24]98
[8361974]99        # Si existe dispositivo de loop lo borro.
100        [ $LOOPDEVICE ] && losetup -d $LOOPDEVICE 2>&1 &>/dev/null
[d2b8d24]101
102else
103        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
[1ee5d4d3]104        echo "      hose $REPOIP 2009 --out sh -c \"echo -ne CREATE_IMAGE $2 $3 $SIZEREQUIRED \"" | tee -a $OGLOGSESSION $OGLOGFILE
[d2b8d24]105        hose $REPOIP 2009 --out sh -c "echo -ne CREATE_IMAGE \"$2\" $3 $SIZEREQUIRED"
106fi
107
108}
109
110function ogCreateInfoImage () {
111#/**
[1ee5d4d3]112#  ogCreateInfoImage
[d2b8d24]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)
[e24b042]118#@param 5 Tipo imagen [ img | diff ]
[d2b8d24]119#*/
[e24b042]120local  IMGTYPE IMGDIRAUX DIRMOUNT DESTRSYNC PASSWORD OPTRSYNC USERRSYNC ORIG FSTYPE PART DIREMPTY IMGLIST IMGINFO IMGACL
[d2b8d24]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
[e24b042]136   IMGTYPE="img"
[d2b8d24]137else
[1ee5d4d3]138   # Comprobamos que las extension sea valida
139   ogCheckStringInGroup $5 "img diff" || ogRaiseError  $OG_ERR_FORMAT $MSG_SYNC_EXTENSION
[e24b042]140   IMGTYPE=$5
141   if [ "$IMGTYPE" == "diff" ]; then
[d2b8d24]142        # Imagen completa con la que comparo la particion.
[baa5919]143        IMGDIRAUX=$(ogGetMountImageDir "$4" "img")
[d2b8d24]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"
[097bc95]151           PASSWORD="--password-file=/scripts/passrsync"
[d2b8d24]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
[1ee5d4d3]172# En las diferenciales no sabemos el tamaño -> ponemos una constante.
173SIZEDATA=${SIZEDATA:-"SIZEDATA"}
[d2b8d24]174
[f456755]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
[e24b042]183if [ "$IMGTYPE" == "img" ]; then
[d2b8d24]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
[097bc95]193        rsync -aHAXvn$OPTRSYNC $PASSWORD   --delete  "$ORIG/" "$DESTRSYNC" >> $IMGLIST
[d2b8d24]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
[e27c4f4]209if [ $FSTYPE == "NTFS" ]; then
[f456755]210        echo "      ntfs-3g.secaudit -b $PART /" |tee -a $OGLOGSESSION $OGLOGFILE
[e27c4f4]211        ntfs-3g.secaudit -b $PART / > $IMGACL
212fi
[d2b8d24]213
214}
215
[6c2dee2]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
[d2b8d24]251#/**
252#  ogRestoreInfoImage
[e24b042]253#@brief Crear o modificar enlaces y restaurar las ACL. La informacion esta ya copiada a la particion.
[d2b8d24]254#@param 1 num_disk
255#@param 2 num_part
256#*/
257function ogRestoreInfoImage () {
[5ccac26]258local  DEST PART IMGACL IMGLN OPTLN LINEA DESTLN ORIGLN TYPELN
[d2b8d24]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"
[5ccac26]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 ""
[d2b8d24]305
306fi
307
[5ccac26]308# Restauramos acl
[f456755]309if [ "$(ogGetFsType $1 $2)" == "NTFS"  -a -f $DEST/$IMGACL ] ; then
[d2b8d24]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
[f456755]315        # Para evitar que de falso error
316        echo ""
[5ccac26]317fi
[d2b8d24]318
319}
320
321function ogSyncCreate () {
322#/**
323# ogSyncCreate
[e24b042]324#@brief   sincroniza los datos de la partición a la imagen para crearla. La imagen esta montada en un directorio.
[d2b8d24]325#@param 1 num_disk
326#@param 2 num_part
327#@param 3 Repositorio  [ REPO | CACHE ]
328#@param 4 Nombre Imagen
[e24b042]329#@param 5 Tipo imagen [ img | diff ]
[d2b8d24]330#*/
[097bc95]331local ORIG DIRAUX DIRMOUNT DESTRSYNC USERRSYNC PASSWORD OPTRSYNC
[d2b8d24]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)
[baa5919]347DIRMOUNT=$(ogGetMountImageDir "$4" $5)
[e24b042]348# Si la imagen es diferencial la lista de ficheros a transferir esta dentro de la imagen.
[d2b8d24]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)
[097bc95]355        PASSWORD="--password-file=/scripts/passrsync"
356        [ "$ogrsyncz" ==  "true" ] && OPTRSYNC="z "
357        [ "$ogrsyncw" == "true" ] && OPTRSYNC="W$OPTRSYNC"
[d2b8d24]358        USERRSYNC="opengnsys"
359        DESTRSYNC="$USERRSYNC@$REPOIP::ogimages/$DIRMOUNT"
360fi
[1ee5d4d3]361# Sincronizamos los datos de la partición a la imagen
[d2b8d24]362echo "      rsync -aHAX$OPTRSYNC --inplace --delete $FILESFROM  $ORIG/ $DESTRSYNC" | tee -a $OGLOGSESSION $OGLOGFILE
[097bc95]363rsync -aHAXq$OPTRSYNC $PASSWORD  --inplace --delete $FILESFROM  "$ORIG/" "$DESTRSYNC"
[d2b8d24]364echo "      rsync -aHAX$OPTRSYNC --inplace /tmp/ogimg* $DESTRSYNC" | tee -a $OGLOGSESSION $OGLOGFILE
[097bc95]365rsync -aHAXq$OPTRSYNC  $PASSWORD --inplace /tmp/ogimg* $DESTRSYNC
[d2b8d24]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
[e24b042]375#@param 3 Tipo imagen [ img | diff ]
[d2b8d24]376#@param 4 num_disk
377#@param 5 num_part
378#*/
379function ogSyncRestore () {
[097bc95]380local DIRMOUNT ORIG DESTRSYNC PASSWORD OPTRSYNC USERRSYNC IMGINFO FILESFROM
[d2b8d24]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
[baa5919]396DIRMOUNT=$(ogGetMountImageDir "$2" "$3")
[d2b8d24]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)
[097bc95]407        PASSWORD="--password-file=/scripts/passrsync"
408        [ "$ogrsyncz" ==  "true" ] && OPTRSYNC="z "
409        [ "$ogrsyncw" == "true" ] && OPTRSYNC="W$OPTRSYNC"
[d2b8d24]410        USERRSYNC="opengnsys"
411        ORIG="$USERRSYNC@$REPOIP::ogimages/$DIRMOUNT"
412fi
413
414# Opciones rsync en cache y repo
[e24b042]415# Para la imagen basica, opcion de borrar archivos de la particion que no existen en la imagen
[d2b8d24]416[ "$3" == "img" ] && [ "$ogrsyncdel" != "false" ] && OPTRSYNC="$OPTRSYNC --delete"
417
[1ee5d4d3]418# Nos traemos listado ficheros y bajamos la imagen
419
420echo "      $MSG_SYNC_RESTORE" |tee -a  $OGLOGSESSION   $OGLOGFILE
[d2b8d24]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
[097bc95]429        rsync -aHAXq$OPTRSYNC $PASSWORD  $ORIG/ogimg* $DESTRSYNC
[d2b8d24]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
[1ee5d4d3]434        # Diferencial: Borramos archivos sobrantes.
435        echo "      $MSG_SYNC_DELETE"  |tee -a  $OGLOGFILE
[d2b8d24]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
[097bc95]441rsync -aHAXq$OPTRSYNC $PASSWORD  $FILESFROM  "$ORIG/" "$DESTRSYNC"
[d2b8d24]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
[e24b042]452#@param 3 Tipo imagen [ img |diff ]
[1ee5d4d3]453#@return punto de montaje
[d2b8d24]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
[5ccac26]466    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME [ REPO|CACHE ]  image_name [ extension ]"
[d2b8d24]467    return $?
468fi
469
[e24b042]470[ "$3" == "" -o "$3" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
[d2b8d24]471
[baa5919]472DIRMOUNT=$(ogGetMountImageDir "$2" ${IMGEXT#*\.})
[1ee5d4d3]473
[d2b8d24]474if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
[f456755]475        # Si está montado nada que hacer.
476        df | grep "$DIRMOUNT$" 2>&1 >/dev/null && echo "/tmp/$DIRMOUNT" && return 0
477
[cd1f048]478        IMGFILE=$(ogGetPath "$1" /"$2.$IMGEXT")
479        mkdir -p "/tmp/$DIRMOUNT"
[f456755]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 $?
[1ee5d4d3]491        echo "/tmp/$DIRMOUNT"
[d2b8d24]492
493else
[cd1f048]494        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
[e24b042]495        hose $REPOIP 2009 --out sh -c "echo -ne MOUNT_IMAGE \"$2\" ${IMGEXT#*\.}"
[cd1f048]496        echo "$OGIMG/$DIRMOUNT"
[d2b8d24]497
498fi
499
500}
501
502
[cd1f048]503
504
505
[d2b8d24]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
[e24b042]512#@param 3 Tipo imagen [ img |diff ]
[d2b8d24]513#*/
[e24b042]514local IMGTYPE DIRMOUNT
[d2b8d24]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
[8361974]524    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME  [ REPO|CACHE ]  image_name [ extension ]"
[d2b8d24]525    return $?
526fi
527
[e24b042]528[ "$3" == "" ] && IMGTYPE="img" || IMGTYPE="$3"
[d2b8d24]529
530if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
[baa5919]531        DIRMOUNT=/tmp/$(ogGetMountImageDir "$2" $IMGTYPE)
[d2b8d24]532        umount "$DIRMOUNT"
[8361974]533        rmdir "$DIRMOUNT"
[d2b8d24]534else
535        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
[e24b042]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"
[d2b8d24]538fi
539
540}
541
[baa5919]542function ogGetMountImageDir () {
[d2b8d24]543#/**
[baa5919]544# ogGetMountImageDir
[d2b8d24]545#@brief   Devuelve el directorio de montaje de la imagen.
546#@param 1 Nombre Imagen
[e24b042]547#@param 2 Tipo imagen [ img |diff ]
[d2b8d24]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
[e24b042]578#@param 3 Tipo imagen [ img | diff ]
[d2b8d24]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
[baa5919]603        DIRMOUNT="/tmp/$(ogGetMountImageDir "$2" $3)"
[d2b8d24]604else
[baa5919]605        DIRMOUNT="$OGIMG/$(ogGetMountImageDir "$2" $3)"
[d2b8d24]606fi
607
[1ee5d4d3]608echo -n -e "      $MSG_SYNC_SLEEP: $DIRMOUNT\n      #"
[d2b8d24]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]
[1ee5d4d3]615        #[  "$TIMEAUX" -gt "$TIMEOUT" ] && return $(ogRaiseError "$MSG_ERR_DONTMOUNT_IMAGE $1 $2 $3: time_out $TIMEAUX seg."; echo $?)
[d2b8d24]616        # TODO definir el error
617        [  "$TIMEAUX" -gt "$TIMEOUT" ] &&  return 2
618        echo -n "#"
619        sleep 5
620done
[1ee5d4d3]621echo  ""
[d2b8d24]622
623}
[cd1f048]624
[e24b042]625
[cd1f048]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
[e24b042]632#@param 3 Tipo Imagen [ img |diff ]
[cd1f048]633#@return
634#@exception OG_ERR_FORMAT     # 1 formato incorrecto.
635#@exception OG_ERR_NOTFOUND        # 2 Fichero o dispositivo no encontrado.
636#*/
[f456755]637local IMGEXT DIRMOUNT AVAILABLE USED IMGDIR IMGFILE ENDSIZE LOOPDEVICE
[cd1f048]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
[f456755]650
[e24b042]651[ "$3" == "" -o "$3" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
[f456755]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
[cd1f048]657
658if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
659        # Al montar se comprueba la existencia de la imagen
[e24b042]660        DIRMOUNT=$(ogMountImage $1 $2 ${IMGEXT#*\.})
[cd1f048]661
[56b3a42]662        AVAILABLE=$(df -k|grep "$DIRMOUNT$"|awk '{print $4}')
[cd1f048]663        # Si el espacio libre menor que 500Mb nos salimos
[f456755]664        if [ $AVAILABLE -lt 200000 ]; then
[e24b042]665                ogUnmountImage $1 $2 ${IMGEXT#*\.}
666                return 0
667        fi
[cd1f048]668
[f456755]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
[e24b042]675        ogUnmountImage $1 $2 ${IMGEXT#*\.}
[f456755]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
[cd1f048]698else
[6d24524]699        [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
[e24b042]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#*\.}"
[cd1f048]702fi
703
704
705}
706
707
708
[f456755]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
[cd1f048]728
[f456755]729if [ $# -lt 2 ]; then
730    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME [ REPO|CACHE ] image_name [ extension ]"
731    return $?
732fi
[cd1f048]733
[f456755]734[ "$3" == "" -o "$3" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
735IMGDIR=$(ogGetParentPath "$1" "/$2")
736IMGFILE="${IMGDIR}"/$(basename "/$2").$IMGEXT
[cd1f048]737
[f456755]738file "$IMGFILE" | grep -i -e " BTRFS Filesystem " -e " ext4 filesystem " >/dev/null
739[ $? -eq 0 ] && return 0 || return $OG_ERR_DONTSYNC_IMAGE
[cd1f048]740
741
[f456755]742}
Note: See TracBrowser for help on using the repository browser.