180 lines
6.4 KiB
Bash
180 lines
6.4 KiB
Bash
#!/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
|
|
source $BASEDIR/lib/ogfunctions.sh
|
|
|
|
# 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.
|
|
echolog "[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
|
|
echolog "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.
|
|
echolog "[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
|
|
echolog "No hay espacio suficiente para descomprimir y crear la imagen: $REQUIRESIZE."
|
|
exit 16
|
|
fi
|
|
echolog "$REQUIRESIZE $PARTSIZE"
|
|
|
|
# Descomprimimos la imagen de partclone.
|
|
echolog "[30] Descomprimimos la imagen de partclone."
|
|
$COMPRESSOR -dc $PARTCLONEIMG | $PATHPARTCLONE/partclone.restore -C -s - -O $AUXIMG
|
|
|
|
TIME2=$[SECONDS-TIME1]
|
|
echolog " $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.
|
|
echolog "[60] Sincronizamos desde la imagen de partclone a la de rsync."
|
|
if [ "$TYPE" == "SYNC1" ]; then
|
|
mkdir -p $RSYNCIMG
|
|
echolog " * Log temporal en: $TMPLOG"
|
|
echolog "rsync -aHAX $AUXDIR/ $RSYNCIMG --- log: $TMPLOG"
|
|
rsync -aHAXv $AUXDIR/ $RSYNCIMG >> $TMPLOG
|
|
TIME3=$[SECONDS-TIME2]
|
|
echolog " $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)
|
|
echolog " * $MSG_HELP_ogCreateFileImage"
|
|
$BINDIR/createfileimage $(basename $RSYNCIMG) img $SIZE || exit 5
|
|
touch $RSYNCIMG.img.lock
|
|
TIME3=$[SECONDS-TIME2]
|
|
echolog " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s"
|
|
|
|
# Sincronizo las imagenes antigua y nueva.
|
|
echolog " * Sincroniza las imagenes antigua y nueva. log temporal en: $TMPLOG"
|
|
echolog "rsync -aHAX $AUXDIR/ $IMGDIR"
|
|
rsync -aHAXv $AUXDIR/ $IMGDIR >> $TMPLOG
|
|
TIME4=$[SECONDS-TIME3]
|
|
echolog " $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
|
|
echolog " * $MSG_HELP_ogReduceImage."
|
|
rm $RSYNCIMG.img.lock
|
|
$BINDIR/reduceimage $(basename $RSYNCIMG) img
|
|
|
|
fi
|
|
|
|
TIME=$[SECONDS-TIME1]
|
|
echolog " $MSG_SCRIPTS_END: $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s"
|