source: client/engine/Rsync.lib @ 251c9e4

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

#636 #565 mensajes log en tiempo real y corrige problema al crear imágenes sincronizada tipo archivo con cliente en modo usuario

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

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