source: client/engine/Rsync.lib @ aed65e0

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 aed65e0 was 5962edd, checked in by ramon <ramongomez@…>, 11 years ago

#640: Evitar errores duplicados en llamadas a ogMount y comprobar error de montaje en script bootOs.

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

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