source: client/engine/Rsync.lib @ a7c4bd4

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

#565 Se controla el error en la transferencia de rsync y se muestra aviso

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

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