source: client/engine/Rsync.lib @ 642e39f

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

#659 rsync version 3.0.1: se integra en el trunk el binario compilado en estatico y la función

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

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