source: client/engine/Rsync.lib @ 6b0b68d

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

#565 sincronizadas: mejora ayuda funciones, creación función de chequeo de las imágenes (ogCheckSyncImage) y en los script de interfaz con la consola se incluye CambiarAcceso? para que si está en modo usuario monte el repositorio en modo escritura.

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

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