[0109c07] | 1 | #!/bin/bash |
---|
| 2 | #/** |
---|
| 3 | # partclone2sync |
---|
| 4 | #@brief Convierte imagen de partclone en imagen sincronizable. |
---|
| 5 | #@param 1 imagen partclone. |
---|
| 6 | #@param 2 imagen sincronizable. |
---|
| 7 | #@param 3 tipo de sincronización y formato de la imagen SYNC1 (directorio) y SYNC2 (fichero) |
---|
| 8 | #@exception OG_ERR_FORMAT # 1 formato incorrecto. |
---|
| 9 | #@exception OG_ERR_NOTFOUND # 2 Fichero o dispositivo no encontrado |
---|
| 10 | #@exception OG_ERR_LOCKED # 4 Imagen de partclone bloqueada. |
---|
| 11 | #@exception OG_ERR_IMAGE # 5 Error al crear la imagen. |
---|
| 12 | #@exception OG_CACHESIZE # 16 No hay espacio suficiente en el disco. |
---|
| 13 | #@note Necesita tener instalado partclone-utils y lzop |
---|
| 14 | #@version 1.0 - |
---|
| 15 | #@author Irina Gomez |
---|
| 16 | #@date 2014-01-22 |
---|
| 17 | #*/ ## |
---|
| 18 | trap "onexit \"$1\" \"$2\" $3" 0 5 16 9 15 |
---|
| 19 | |
---|
| 20 | function onexit() { |
---|
| 21 | local exit_status=$? |
---|
| 22 | # Desmontamos el cliente de opengnsys y la imagen temporal. |
---|
| 23 | umount $OGCLIENTDIR/ogclientmount $AUXDIR |
---|
| 24 | rm -rf $IMGINFO $FILEHEAD $TMPLOG |
---|
| 25 | |
---|
| 26 | # Borramos los ficheros de bloqueo de las imagenes nuevas. |
---|
| 27 | rm -rf $RSYNCIMG.img.lock $AUXIMG.lock |
---|
| 28 | # Borramos los ficheros de bloqueo dela imagen de partclone si no estaba bloqueada. |
---|
| 29 | [ $exit_status -eq 4 ] || rm -rf $PARTCLONEIMG.lock |
---|
| 30 | |
---|
| 31 | # Borramos las imagenes y directorios temporales. |
---|
| 32 | rm $AUXIMG |
---|
| 33 | rmdir $AUXDIR $OGCLIENTDIR/ogclientmount |
---|
| 34 | |
---|
| 35 | exit $exit_status |
---|
| 36 | } |
---|
| 37 | |
---|
| 38 | TIME1=$SECONDS |
---|
| 39 | |
---|
| 40 | BASEDIR=/opt/opengnsys |
---|
| 41 | REPODIR="$BASEDIR/images" |
---|
| 42 | BINDIR="$BASEDIR/bin" |
---|
| 43 | PROG="$(basename $0)" |
---|
| 44 | # Cargamos los mensajes en el idioma del sistema. |
---|
[744ecd6] | 45 | # Comprobamos que el fichero de idioma existe. Si no "es_ES" por defecto. |
---|
| 46 | ls $BASEDIR/client/etc/lang.$LANG.conf &>/dev/null |
---|
| 47 | [ $? -eq 0 ] || LANG="es_ES" |
---|
| 48 | |
---|
[0109c07] | 49 | source $BASEDIR/client/etc/lang.$LANG.conf |
---|
| 50 | |
---|
| 51 | # Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision |
---|
| 52 | [ $(uname -r|cut -d. -f2) -lt 7 ] && IMGFS="EXT4" || IMGFS="BTRFS" |
---|
| 53 | |
---|
| 54 | # Mostrar ayuda: Si se solicita, si faltan parametros o $3 no es SYNC1 o SYNC2. |
---|
| 55 | if [ "$*" == "help" -o $# -lt 3 ] && ! [[ "$3" == SYNC[1,2] ]]; then |
---|
| 56 | echo -e "$PROG: $MSG_HELP_partclone2sync \n" \ |
---|
| 57 | "$MSG_FORMAT: $PROG image_partclone image_rsync [ SYNC1 | SYNC2 ] \n" \ |
---|
| 58 | " $PROG Windows7 Windows72013 SYNC1 " |
---|
| 59 | exit 0 |
---|
| 60 | fi |
---|
| 61 | |
---|
| 62 | if [ "$USER" != "root" ]; then |
---|
| 63 | echo "$PROG: Error: solo ejecutable por root" >&2 |
---|
| 64 | exit 1 |
---|
| 65 | fi |
---|
| 66 | |
---|
| 67 | |
---|
| 68 | PARTCLONEIMG="$REPODIR/$1.img" |
---|
| 69 | RSYNCIMG="$REPODIR/$2" |
---|
| 70 | AUXIMG="$REPODIR/$1.tmp.img" |
---|
| 71 | AUXDIR="/tmp/partclone2rsync$$" |
---|
| 72 | TYPE="$3" |
---|
| 73 | TMPLOG=/tmp/rsync$$.sal |
---|
| 74 | |
---|
| 75 | # Comprobamos que exista la imagen. |
---|
| 76 | ! [ -f $PARTCLONEIMG ] && echo "$MSG_ERR_NOTFOUND: $1" && exit 2 |
---|
| 77 | |
---|
| 78 | # Comprobamos que la imagen no este bloqueada. |
---|
| 79 | [ -f $PARTCLONEIMG.lock ] && echo "$MSG_ERR_LOCKED: $1" && exit 4 |
---|
| 80 | |
---|
| 81 | # Usamos el partclone del ogclient. |
---|
| 82 | OGCLIENTDIR=$BASEDIR/tftpboot/ogclient |
---|
| 83 | [ -d $OGCLIENTDIR/ogclientmount ] || mkdir $OGCLIENTDIR/ogclientmount |
---|
| 84 | mount $OGCLIENTDIR/ogclient.sqfs $OGCLIENTDIR/ogclientmount |
---|
| 85 | PATHPARTCLONE=$OGCLIENTDIR/ogclientmount/usr/sbin |
---|
| 86 | |
---|
| 87 | # Creamos fichero de bloqueo |
---|
| 88 | touch $PARTCLONEIMG.lock $AUXIMG.lock |
---|
| 89 | |
---|
| 90 | |
---|
| 91 | # Datos imagen. |
---|
| 92 | echo [10] Obtenemos datos del partclone. |
---|
| 93 | FILEHEAD=/tmp/$(basename $PARTCLONEIMG).infohead |
---|
| 94 | COMPRESSOR=`file $PARTCLONEIMG | awk '{print $2}'` |
---|
| 95 | $COMPRESSOR -dc $PARTCLONEIMG 2>/dev/null | head > $FILEHEAD |
---|
| 96 | PARTCLONEINFO=$(LC_ALL=C partclone.info $FILEHEAD 2>&1) |
---|
| 97 | if `echo $PARTCLONEINFO | grep size > /dev/null` |
---|
| 98 | then |
---|
| 99 | FS=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); print toupper($8);}') |
---|
| 100 | echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024 |
---|
| 101 | IMGSIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{gsub(/\: /,"\n"); printf "%d\n", $11*FACTOR;}') |
---|
| 102 | else |
---|
| 103 | echo "Error: partclone.info no detecta la imagen" |
---|
| 104 | exit 5 |
---|
| 105 | fi |
---|
| 106 | [ "$FS" == "NTFS" ] && echo "Error: Todavia no podemos convertir imagenes de Windows" && exit 6 |
---|
| 107 | |
---|
| 108 | # Calculamos el espacio disponible en la particion de opengnsys. |
---|
| 109 | echo -n "[20]$MSG_SCRIPTS_CREATE_SIZE " |
---|
| 110 | for DIR in "/" "/opt" "/opt/opengnsys" "/opt/opengnsys/images" |
---|
| 111 | do |
---|
| 112 | AUXSIZE=$(df|grep $DIR$|awk '{print $3}') |
---|
| 113 | [ "$AUXSIZE" != "" ] && PARTSIZE=$AUXSIZE |
---|
| 114 | done |
---|
| 115 | let REQUIRESIZE=2*$IMGSIZE |
---|
| 116 | if [ $PARTSIZE -lt $REQUIRESIZE ]; then |
---|
| 117 | echo "No hay espacio suficiente para descomprimir y crear la imagen: $REQUIRESIZE." |
---|
| 118 | exit 16 |
---|
| 119 | fi |
---|
| 120 | echo "$REQUIRESIZE $PARTSIZE" |
---|
| 121 | |
---|
| 122 | # Descomprimimos la imagen de partclone. |
---|
| 123 | echo [30] Descomprimimos la imagen de partclone. |
---|
| 124 | $COMPRESSOR -dc $PARTCLONEIMG | $PATHPARTCLONE/partclone.restore -C -s - -O $AUXIMG |
---|
| 125 | |
---|
| 126 | TIME2=$[SECONDS-TIME1] |
---|
| 127 | echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME2/60]m $[TIME2%60]s" |
---|
| 128 | |
---|
| 129 | # Montamos la imagen: |
---|
| 130 | mkdir -p $AUXDIR |
---|
| 131 | mount $AUXIMG $AUXDIR |
---|
| 132 | |
---|
| 133 | # Sincronizamos de la imagen del partclone a la del rsync. |
---|
| 134 | echo "[60] Sincronizamos desde la imagen de partclone a la de rsync." |
---|
| 135 | if [ "$TYPE" == "SYNC1" ]; then |
---|
| 136 | mkdir -p $RSYNCIMG |
---|
| 137 | echo " * Log temporal en: $TMPLOG" |
---|
| 138 | echo rsync -aHAX $AUXDIR/ $RSYNCIMG --- log: $TMPLOG |
---|
| 139 | rsync -aHAXv $AUXDIR/ $RSYNCIMG >> $TMPLOG |
---|
| 140 | TIME3=$[SECONDS-TIME2] |
---|
| 141 | echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s" |
---|
| 142 | else |
---|
| 143 | IMGINFO="/tmp/ogimg.info$$" |
---|
| 144 | IMGDIR="$REPODIR/mount/$(basename $RSYNCIMG)" |
---|
| 145 | # Calculamos el tamaño de la imagen |
---|
| 146 | SIZE=$(df -k|awk -v P="$AUXDIR" '{if ($6==P) print $3}') |
---|
| 147 | # Creo fichero de informacion de la imagen |
---|
| 148 | echo "#$FSIMG:LZO:$FS:$SIZE" > $IMGINFO |
---|
| 149 | # Factor de compresion de la imagen |
---|
| 150 | [ "$FS" == "NTFS" ] && ZFACTOR=120 || ZFACTOR=110 |
---|
| 151 | [ "$FSIMG" == "BTRFS" ] && let ZFACTOR=$ZFACTOR-30 |
---|
| 152 | let SIZE=$SIZE*$ZFACTOR/100 |
---|
| 153 | |
---|
| 154 | # Creamos el fichero de la imagen vacio (queda montado) |
---|
| 155 | echo " * $MSG_HELP_ogCreateFileImage" |
---|
| 156 | $BINDIR/createfileimage $(basename $RSYNCIMG) img $SIZE || exit 5 |
---|
| 157 | touch $RSYNCIMG.img.lock |
---|
| 158 | TIME3=$[SECONDS-TIME2] |
---|
| 159 | echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s" |
---|
| 160 | |
---|
| 161 | # Sincronizo las imagenes antigua y nueva. |
---|
| 162 | echo " * Sincroniza las imagenes antigua y nueva. log temporal en: $TMPLOG" |
---|
| 163 | echo rsync -aHAX $AUXDIR/ $IMGDIR |
---|
| 164 | rsync -aHAXv $AUXDIR/ $IMGDIR >> $TMPLOG |
---|
| 165 | TIME4=$[SECONDS-TIME3] |
---|
| 166 | echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME4/60]m $[TIME4%60]s" |
---|
| 167 | # copiamos el fichero de informacion dentro de la imagen. |
---|
| 168 | mv $IMGINFO $IMGDIR/ogimg.info |
---|
| 169 | # Desmontamos la imagen y la reducimos al minimo. |
---|
| 170 | $BINDIR/unmountimage $(basename $RSYNCIMG) img |
---|
| 171 | echo " * $MSG_HELP_ogReduceImage." |
---|
| 172 | rm $RSYNCIMG.img.lock |
---|
| 173 | $BINDIR/reduceimage $(basename $RSYNCIMG) img |
---|
| 174 | |
---|
| 175 | fi |
---|
| 176 | |
---|
| 177 | TIME=$[SECONDS-TIME1] |
---|
| 178 | echo " $MSG_SCRIPTS_END: $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s" |
---|