From f456755884247a72cf1af575a6e15c8c3fc92442 Mon Sep 17 00:00:00 2001 From: irina Date: Fri, 11 Oct 2013 12:40:20 +0000 Subject: #565 adaptacion diferenciales al cliente 1.0.4., extension diferenciles img.diff git-svn-id: https://opengnsys.es/svn/branches/version1.0@4059 a21b9725-9963-47de-94b9-378ad31fedc9 --- admin/Sources/Services/ogAdmRepoAux | 163 ++++++++++++++++++++++++------------ 1 file changed, 111 insertions(+), 52 deletions(-) (limited to 'admin/Sources/Services/ogAdmRepoAux') diff --git a/admin/Sources/Services/ogAdmRepoAux b/admin/Sources/Services/ogAdmRepoAux index 7e9c2b45..b7efe1dc 100755 --- a/admin/Sources/Services/ogAdmRepoAux +++ b/admin/Sources/Services/ogAdmRepoAux @@ -21,13 +21,36 @@ MCASTLOGBASE=$BASEDIR/log/mcastlog MCASTLOG=$MCASTLOGBASE/ogAdmRepoMcast.`date +%Y%m%d-%H%M%S` REPODIR="$BASEDIR/images/" +# Para las sincronizadas BACKUP=$(grep BACKUP /opt/opengnsys/client/etc/engine.cfg| cut -d= -f2) +# FS segun kernel. ext4 para < 3.7, para >= BTRFS +#KERNEL=$(file $BASEDIR/tftpboot/ogclient/ogvmlinuz |awk '{print $9}') +#[[ "$KERNEL" < "3.7" ]] && IMGFS="EXT4" || IMGFS="BTRFS" +KERNEL=$(file $BASEDIR/tftpboot/ogclient/ogvmlinuz |awk -F . '{print $2}') +[ $KERNEL -lt 7 ] && IMGFS="EXT4" || IMGFS="BTRFS" # Añade registro de incidencias. function echolog () { date +"%Y%m%d-%H%M%S $*" >> $REPOLOG } +function mountImage () { + #@param 1 image_file + #@param 2 mount_dir + #@param 3 openciones mount + [ "$3" != "" ] && OPTMOUNT=" -o $3 " + # Si está montado nada que hacer + df |grep "$2$" 2>&1 >/dev/null && return 0 + if [ $IMGFS == "EXT4" ]; then + echolog "mount $OPTMOUNT -t ext4 $1 $2" + mount $OPTMOUNT -t ext4 $1 $2 + else + echolog "mount $OPTMOUNT -o compress=lzo $1 $2" + mount $OPTMOUNT -o compress=lzo "$1" "$2" + fi + return $? +} + mkdir -p $MCASTLOGBASE @@ -36,6 +59,9 @@ PARM2=$(echo $PARM | cut -f2 -d" ") PARM3=$(echo $PARM | cut -f3 -d" ") PARM4=$(echo $PARM | cut -f4 -d" ") +# Determinamos el tipo de sistema de fichero de las imagenes segun el kernel que tenga + + case "$PARM1" in START_MULTICAST) #1 START_MULTICAST @@ -60,30 +86,37 @@ case "$PARM1" in #2 nombre imagen #3 tipo de imagen [ img | diff ] #4 tamaño imagen - MOUNTDIR="$REPODIR/mount/$PARM2" + LOOPDEVICE=$(losetup -f) + DIRMOUNT="$REPODIR/mount/$PARM2" if [ "$PARM3" == "img" ] ; then IMGEXT="img" else IMGEXT="img.diff" - MOUNTDIR="$MOUNTDIR.diff" + DIRMOUNT="$DIRMOUNT.diff" fi IMGFILE="$REPODIR/$PARM2.$IMGEXT" IMGDIR="$(dirname $IMGFILE)" [ -d $IMGDIR ] || mkdir -p $IMGDIR - mkdir -p "$MOUNTDIR" + mkdir -p "$DIRMOUNT" SIZEREQUIRED="$PARM4" + # Si existe la imagen hacemos copia de seguridad y la redimesionamos if [ -f "$IMGFILE" ]; then - echolog "Redimensionamos la imagen $IMGFILE al tamaño necesario: $SIZEREQUIRED" - # Copia de seguridad de la imagen - # Si la imagen esta montada la desmonto - if [ -r "$MOUNTDIR/ogimg.info" ]; then - echolog "umount $MOUNTDIR" - umount "$MOUNTDIR" - [ $? -ne 0 ] && echolog "Error: No podemos desmontar la imagen para hacer copia de seguridad" && exit 1 + # TODO modificar ogGetImageSize + IMGSIZE=$(ls -l --block-size=1024 $IMGFILE| cut -f5 -d" ") + + if [ "$BACKUP" == "true" -o $IMGSIZE -lt $SIZEREQUIRED ]; then + # Si la imagen esta montada la desmonto + if [ -r "$DIRMOUNT/ogimg.info" ]; then + echolog "umount $DIRMOUNT" + umount "$DIRMOUNT" + [ $? -ne 0 ] && echolog "Error: No podemos desmontar la imagen para hacer copia de seguridad o redimensionar" && exit 1 + fi fi + + # Copia de seguridad de la imagen if [ "$BACKUP" == "true" ]; then echolog "Copia de seguridad de la imagen anterior" echolog "cp $IMGFILE $IMGFILE.ant" @@ -93,41 +126,48 @@ case "$PARM1" in fi # Redimensionamos la imagen al tamaño necesario - # TODO modificar ogGetImageSize - IMGSIZE=$(ls -l --block-size=1024 $IMGFILE| cut -f5 -d" ") if [ $IMGSIZE -lt $SIZEREQUIRED ];then + echolog "Redimensionamos la imagen $IMGFILE al tamaño necesario: $SIZEREQUIRED" echolog "truncate --size=\">$SIZEREQUIRED\"k $IMGFILE" truncate --size=">$SIZEREQUIRED"k $IMGFILE 2>&1 > $REPOLOG # Montamos la imagen, si da error nos salimos - mount -o compress=lzo "$IMGFILE" "$MOUNTDIR" - echolog "btrfs filesystem resize max $MOUNTDIR" - btrfs filesystem resize max "$MOUNTDIR" 2>&1 > $REPOLOG - + if [ $IMGFS == "EXT4" ]; then + losetup $LOOPDEVICE "$IMGFILE" + echolog "resize2fs -f $LOOPDEVICE" + resize2fs -f $LOOPDEVICE &> $REPOLOG + else + mount -o compress=lzo "$IMGFILE" "$DIRMOUNT" + echolog "btrfs filesystem resize max $DIRMOUNT" + btrfs filesystem resize max "$DIRMOUNT" 2>&1 > $REPOLOG + fi fi - + # Si no existe la imagen creamos el fichero. else echolog "Creamos la imagen $IMGFILE al tamaño necesario: $SIZEREQUIRED" echolog dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED #Formateamos imagen - LOOPDEVICE=$(losetup -f) echo losetup $LOOPDEVICE "$IMGFILE" losetup $LOOPDEVICE "$IMGFILE" - echo mkfs.btrfs -L ${PARM2##*\/} $LOOPDEVICE - mkfs.btrfs -L ${PARM2##*\/} $LOOPDEVICE #&> $OGLOGCOMMAND - + if [ $IMGFS == "EXT4" ] ; then + echolog " mkfs.ext4 -i 4096 -b 4096 -L ${PARM2##*\/} $LOOPDEVICE" + mkfs.ext4 -i 4096 -b 4096 -L ${PARM2##*\/} $LOOPDEVICE + else + echolog mkfs.btrfs -L ${PARM2##*\/} $LOOPDEVICE + mkfs.btrfs -L ${PARM2##*\/} $LOOPDEVICE #&> $OGLOGCOMMAND + fi fi # Montamos la imagen. - echolog "mount -o compress=lzo $IMGFILE $MOUNTDIR" - mount -o compress=lzo "$IMGFILE" "$MOUNTDIR" - [ "$?" == "0" -o "$?" == "32" ] || (echolog "Error al crear/redimensionar la imagen"; exit 1) - touch "$MOUNTDIR/ogimg.info" + mountImage "$IMGFILE" "$DIRMOUNT" + [ "$?" == "0" ] || (echo salida=$?; echolog "Error al crear/redimensionar la imagen"; exit 1) + + touch "$DIRMOUNT/ogimg.info" TIME2=$[SECONDS-TIME] echolog "Fin creación/redimension de la imagen: $[TIME2/60]m $[TIME2%60]s" # Si existe dispositivo loop lo borramos. - [ $LOOPDEVICE ] && losetup -d $LOOPDEVICE + [ $LOOPDEVICE ] && losetup -a| grep $LOOPDEVICE &> /dev/null && losetup -d $LOOPDEVICE # TODO: comprobar que no se quede el losetup bloqueado. ;; @@ -136,31 +176,30 @@ case "$PARM1" in #1 MOUNT_IMAGE #2 nombre imagen #3 tipo de imagen [ img | diff ] - MOUNTDIR="$REPODIR/mount/$PARM2" + DIRMOUNT="$REPODIR""mount/$PARM2" if [ "$PARM3" == "img" ] ; then IMGEXT="img" else IMGEXT="img.diff" - MOUNTDIR="$MOUNTDIR.diff" + DIRMOUNT="$DIRMOUNT.diff" fi IMGFILE="$REPODIR/$PARM2.$IMGEXT" echolog "Montamos la imagen $IMGFILE " - mkdir -p "$MOUNTDIR" - mount -o ro,compress=lzo "$IMGFILE" "$MOUNTDIR" - [ "$?" == "0" ] || (echolog "Error al montar la imagen"; exit 1) + mkdir -p "$DIRMOUNT" + mountImage "$IMGFILE" "$DIRMOUNT" ro || (echolog "Error al montar la imagen"; exit 1) ;; UMOUNT_IMAGE) # Desmontamos el fichero imagen. - # Si el directorio esta ocupado no se desmontará + # Si el directorio esta ocupado no se desmontará #1 UMOUNT_IMAGE #2 nombre imagen #3 tipo de imagen [ img | diff ] IMGTYPE="$PARM3" - MOUNTDIR="$REPODIR/mount/$PARM2" - [ "$IMGTYPE" == "diff" ] && MOUNTDIR="$MOUNTDIR.$IMGTYPE" + DIRMOUNT="$REPODIR/mount/$PARM2" + [ "$IMGTYPE" == "diff" ] && DIRMOUNT="$DIRMOUNT.$IMGTYPE" echolog "Desmontamos la imagen $PARM2 $PARM3 " - umount $MOUNTDIR - rmdir $MOUNTDIR + umount $DIRMOUNT + rmdir $DIRMOUNT ;; REDUCE_IMAGE) @@ -168,38 +207,58 @@ case "$PARM1" in #1 REDUCE_IMAGE #2 Nombre Imagen #3 Tipo de imagen [ img |diff ] - MOUNTDIR="$REPODIR""mount/${PARM2}" + DIRMOUNT="$REPODIR""mount/${PARM2}" if [ "$PARM3" == "img" ] ; then IMGEXT="img" else IMGEXT="img.diff" - MOUNTDIR="$MOUNTDIR.diff" + DIRMOUNT="$DIRMOUNT.diff" fi IMGFILE="$REPODIR$PARM2.$IMGEXT" [ ! -f $IMGFILE ] && echolog "Imagen $IMGFILE no existe" && exit 1 - [ -d $MOUNTDIR ] || mkdir $MOUNTDIR - mount -o compress=lzo "$IMGFILE" "$MOUNTDIR" - AVAILABLE=$(df -k|grep $MOUNTDIR|awk '{print $4}') + # Solo funciona si la imagen es ext4, si no nos salimos sin error + file $IMGFILE |grep -i -e " ext4 filesystem " 2>&1 > /dev/null || exit 0 + [ -d $DIRMOUNT ] || mkdir $DIRMOUNT + mountImage "$IMGFILE" "$DIRMOUNT" || (echolog "Error al montar la imagen"; exit 1) + # Si el espacio libre menor que 500Mb desmontamos la imagen y nos salimos - if [ $AVAILABLE -lt 500000 ]; then + AVAILABLE=$(df -k|grep $DIRMOUNT|awk '{print $4}') + if [ $AVAILABLE -lt 200000 ]; then echolog "reducir imagen REPO $PARM2 $IMGEXT. tamaño minimo, nada que hacer" - umount $MOUNTDIR - rmdir $MOUNTDIR + umount $DIRMOUNT + rmdir $DIRMOUNT exit 0 fi - USED=$(df -k|grep $MOUNTDIR|awk '{print $3}') - let ENDSIZE=USED+500000 + # Calculamos la diferencia entre el tamaño interno y externo + EXTSIZE=$(ls -l --block-size=1024 $IMGFILE | cut -f5 -d" ") + INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}') + let EDGESIZE=$EXTSIZE-$INTSIZE + echolog "reducir imagen REPO $PARM2 $IMGEXT, tamaño final: $ENDSIZE" - echolog btrfs filesystem resize "$ENDSIZE"k $MOUNTDIR - btrfs filesystem resize "$ENDSIZE"k $MOUNTDIR - umount $MOUNTDIR - echolog "truncate --size=\"$ENDSIZE\"k $IMGFILE" - truncate --size="$ENDSIZE"k $IMGFILE + umount $DIRMOUNT + LOOPDEVICE=$(losetup -f) + losetup $LOOPDEVICE "$IMGFILE" + + # Redimensiono sistema de ficheros + echolog "resize2fs -fpM $LOOPDEVICE " + resize2fs -fpM $LOOPDEVICE # 2>&1 > $REPOLOG + mountImage "$IMGFILE" "$DIRMOUNT" + # Calculamos el tamaño final del archivo + INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}') + let EXTSIZE=$INTSIZE+$EDGESIZE + umount $DIRMOUNT + # Si existe dispositivo loop lo borramos. + [ $LOOPDEVICE ] && losetup -a| grep $LOOPDEVICE &> /dev/null && losetup -d $LOOPDEVICE + # Corto el archivo al tamaño del sistema de ficheros + echo "truncate --size=\"$EXTSIZE\"k $IMGFILE" + echolog "truncate --size=\"$EXTSIZE\"k $IMGFILE" + truncate --size="$EXTSIZE"k $IMGFILE + + rmdir $DIRMOUNT - rmdir $MOUNTDIR ;; default) echolog "Solicitud con parametros \"$PARM\" no realizada, no registrada o con errores" -- cgit v1.2.3-18-g5258