#!/bin/bash #/** # partclone2sync #@brief Convierte imagen de partclone en imagen sincronizable. #@param 1 imagen partclone. #@param 2 imagen sincronizable. #@param 3 tipo de sincronización y formato de la imagen SYNC1 (directorio) y SYNC2 (fichero) #@exception OG_ERR_FORMAT # 1 formato incorrecto. #@exception OG_ERR_NOTFOUND # 2 Fichero o dispositivo no encontrado #@exception OG_ERR_LOCKED # 4 Imagen de partclone bloqueada. #@exception OG_ERR_IMAGE # 5 Error al crear la imagen. #@exception OG_CACHESIZE # 16 No hay espacio suficiente en el disco. #@note Necesita tener instalado partclone-utils y lzop #@version 1.0 - #@author Irina Gomez #@date 2014-01-22 #*/ ## trap "onexit \"$1\" \"$2\" $3" 0 5 16 9 15 function onexit() { local exit_status=$? # Desmontamos el cliente de opengnsys y la imagen temporal. umount $OGCLIENTDIR/ogclientmount $AUXDIR rm -rf $IMGINFO $FILEHEAD $TMPLOG # Borramos los ficheros de bloqueo de las imagenes nuevas. rm -rf $RSYNCIMG.img.lock $AUXIMG.lock # Borramos los ficheros de bloqueo dela imagen de partclone si no estaba bloqueada. [ $exit_status -eq 4 ] || rm -rf $PARTCLONEIMG.lock # Borramos las imagenes y directorios temporales. rm $AUXIMG rmdir $AUXDIR $OGCLIENTDIR/ogclientmount exit $exit_status } TIME1=$SECONDS BASEDIR=/opt/opengnsys REPODIR="$BASEDIR/images" BINDIR="$BASEDIR/bin" PROG="$(basename $0)" # Cargamos los mensajes en el idioma del sistema. # Comprobamos que el fichero de idioma existe. Si no "es_ES" por defecto. ls $BASEDIR/client/etc/lang.$LANG.conf &>/dev/null [ $? -eq 0 ] || LANG="es_ES" source $BASEDIR/client/etc/lang.$LANG.conf # Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision [ $(uname -r|cut -d. -f2) -lt 7 ] && IMGFS="EXT4" || IMGFS="BTRFS" # Mostrar ayuda: Si se solicita, si faltan parametros o $3 no es SYNC1 o SYNC2. if [ "$*" == "help" -o $# -lt 3 ] && ! [[ "$3" == SYNC[1,2] ]]; then echo -e "$PROG: $MSG_HELP_partclone2sync \n" \ "$MSG_FORMAT: $PROG image_partclone image_rsync [ SYNC1 | SYNC2 ] \n" \ " $PROG Windows7 Windows72013 SYNC1 " exit 0 fi if [ "$USER" != "root" ]; then echo "$PROG: Error: solo ejecutable por root" >&2 exit 1 fi PARTCLONEIMG="$REPODIR/$1.img" RSYNCIMG="$REPODIR/$2" AUXIMG="$REPODIR/$1.tmp.img" AUXDIR="/tmp/partclone2rsync$$" TYPE="$3" TMPLOG=/tmp/rsync$$.sal # Comprobamos que exista la imagen. ! [ -f $PARTCLONEIMG ] && echo "$MSG_ERR_NOTFOUND: $1" && exit 2 # Comprobamos que la imagen no este bloqueada. [ -f $PARTCLONEIMG.lock ] && echo "$MSG_ERR_LOCKED: $1" && exit 4 # Usamos el partclone del ogclient. OGCLIENTDIR=$BASEDIR/tftpboot/ogclient [ -d $OGCLIENTDIR/ogclientmount ] || mkdir $OGCLIENTDIR/ogclientmount mount $OGCLIENTDIR/ogclient.sqfs $OGCLIENTDIR/ogclientmount PATHPARTCLONE=$OGCLIENTDIR/ogclientmount/usr/sbin # Creamos fichero de bloqueo touch $PARTCLONEIMG.lock $AUXIMG.lock # Datos imagen. echo [10] Obtenemos datos del partclone. FILEHEAD=/tmp/$(basename $PARTCLONEIMG).infohead COMPRESSOR=`file $PARTCLONEIMG | awk '{print $2}'` $COMPRESSOR -dc $PARTCLONEIMG 2>/dev/null | head > $FILEHEAD PARTCLONEINFO=$(LC_ALL=C partclone.info $FILEHEAD 2>&1) if `echo $PARTCLONEINFO | grep size > /dev/null` then FS=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); print toupper($8);}') echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024 IMGSIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{gsub(/\: /,"\n"); printf "%d\n", $11*FACTOR;}') else echo "Error: partclone.info no detecta la imagen" exit 5 fi [ "$FS" == "NTFS" ] && echo "Error: Todavia no podemos convertir imagenes de Windows" && exit 6 # Calculamos el espacio disponible en la particion de opengnsys. echo -n "[20]$MSG_SCRIPTS_CREATE_SIZE " for DIR in "/" "/opt" "/opt/opengnsys" "/opt/opengnsys/images" do AUXSIZE=$(df|grep $DIR$|awk '{print $3}') [ "$AUXSIZE" != "" ] && PARTSIZE=$AUXSIZE done let REQUIRESIZE=2*$IMGSIZE if [ $PARTSIZE -lt $REQUIRESIZE ]; then echo "No hay espacio suficiente para descomprimir y crear la imagen: $REQUIRESIZE." exit 16 fi echo "$REQUIRESIZE $PARTSIZE" # Descomprimimos la imagen de partclone. echo [30] Descomprimimos la imagen de partclone. $COMPRESSOR -dc $PARTCLONEIMG | $PATHPARTCLONE/partclone.restore -C -s - -O $AUXIMG TIME2=$[SECONDS-TIME1] echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME2/60]m $[TIME2%60]s" # Montamos la imagen: mkdir -p $AUXDIR mount $AUXIMG $AUXDIR # Sincronizamos de la imagen del partclone a la del rsync. echo "[60] Sincronizamos desde la imagen de partclone a la de rsync." if [ "$TYPE" == "SYNC1" ]; then mkdir -p $RSYNCIMG echo " * Log temporal en: $TMPLOG" echo rsync -aHAX $AUXDIR/ $RSYNCIMG --- log: $TMPLOG rsync -aHAXv $AUXDIR/ $RSYNCIMG >> $TMPLOG TIME3=$[SECONDS-TIME2] echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s" else IMGINFO="/tmp/ogimg.info$$" IMGDIR="$REPODIR/mount/$(basename $RSYNCIMG)" # Calculamos el tamaño de la imagen SIZE=$(df -k|awk -v P="$AUXDIR" '{if ($6==P) print $3}') # Creo fichero de informacion de la imagen echo "#$FSIMG:LZO:$FS:$SIZE" > $IMGINFO # Factor de compresion de la imagen [ "$FS" == "NTFS" ] && ZFACTOR=120 || ZFACTOR=110 [ "$FSIMG" == "BTRFS" ] && let ZFACTOR=$ZFACTOR-30 let SIZE=$SIZE*$ZFACTOR/100 # Creamos el fichero de la imagen vacio (queda montado) echo " * $MSG_HELP_ogCreateFileImage" $BINDIR/createfileimage $(basename $RSYNCIMG) img $SIZE || exit 5 touch $RSYNCIMG.img.lock TIME3=$[SECONDS-TIME2] echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s" # Sincronizo las imagenes antigua y nueva. echo " * Sincroniza las imagenes antigua y nueva. log temporal en: $TMPLOG" echo rsync -aHAX $AUXDIR/ $IMGDIR rsync -aHAXv $AUXDIR/ $IMGDIR >> $TMPLOG TIME4=$[SECONDS-TIME3] echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME4/60]m $[TIME4%60]s" # copiamos el fichero de informacion dentro de la imagen. mv $IMGINFO $IMGDIR/ogimg.info # Desmontamos la imagen y la reducimos al minimo. $BINDIR/unmountimage $(basename $RSYNCIMG) img echo " * $MSG_HELP_ogReduceImage." rm $RSYNCIMG.img.lock $BINDIR/reduceimage $(basename $RSYNCIMG) img fi TIME=$[SECONDS-TIME1] echo " $MSG_SCRIPTS_END: $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s"