[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 |
---|
[c28eefa] | 50 | source $BASEDIR/lib/ogfunctions.sh |
---|
[0109c07] | 51 | |
---|
| 52 | # Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision |
---|
| 53 | [ $(uname -r|cut -d. -f2) -lt 7 ] && IMGFS="EXT4" || IMGFS="BTRFS" |
---|
| 54 | |
---|
| 55 | # Mostrar ayuda: Si se solicita, si faltan parametros o $3 no es SYNC1 o SYNC2. |
---|
| 56 | if [ "$*" == "help" -o $# -lt 3 ] && ! [[ "$3" == SYNC[1,2] ]]; then |
---|
| 57 | echo -e "$PROG: $MSG_HELP_partclone2sync \n" \ |
---|
| 58 | "$MSG_FORMAT: $PROG image_partclone image_rsync [ SYNC1 | SYNC2 ] \n" \ |
---|
| 59 | " $PROG Windows7 Windows72013 SYNC1 " |
---|
| 60 | exit 0 |
---|
| 61 | fi |
---|
| 62 | |
---|
| 63 | if [ "$USER" != "root" ]; then |
---|
| 64 | echo "$PROG: Error: solo ejecutable por root" >&2 |
---|
| 65 | exit 1 |
---|
| 66 | fi |
---|
| 67 | |
---|
| 68 | |
---|
| 69 | PARTCLONEIMG="$REPODIR/$1.img" |
---|
| 70 | RSYNCIMG="$REPODIR/$2" |
---|
| 71 | AUXIMG="$REPODIR/$1.tmp.img" |
---|
| 72 | AUXDIR="/tmp/partclone2rsync$$" |
---|
| 73 | TYPE="$3" |
---|
| 74 | TMPLOG=/tmp/rsync$$.sal |
---|
| 75 | |
---|
| 76 | # Comprobamos que exista la imagen. |
---|
| 77 | ! [ -f $PARTCLONEIMG ] && echo "$MSG_ERR_NOTFOUND: $1" && exit 2 |
---|
| 78 | |
---|
| 79 | # Comprobamos que la imagen no este bloqueada. |
---|
| 80 | [ -f $PARTCLONEIMG.lock ] && echo "$MSG_ERR_LOCKED: $1" && exit 4 |
---|
| 81 | |
---|
| 82 | # Usamos el partclone del ogclient. |
---|
| 83 | OGCLIENTDIR=$BASEDIR/tftpboot/ogclient |
---|
| 84 | [ -d $OGCLIENTDIR/ogclientmount ] || mkdir $OGCLIENTDIR/ogclientmount |
---|
| 85 | mount $OGCLIENTDIR/ogclient.sqfs $OGCLIENTDIR/ogclientmount |
---|
| 86 | PATHPARTCLONE=$OGCLIENTDIR/ogclientmount/usr/sbin |
---|
| 87 | |
---|
| 88 | # Creamos fichero de bloqueo |
---|
| 89 | touch $PARTCLONEIMG.lock $AUXIMG.lock |
---|
| 90 | |
---|
| 91 | |
---|
| 92 | # Datos imagen. |
---|
[c28eefa] | 93 | echolog "[10] Obtenemos datos del partclone." |
---|
[0109c07] | 94 | FILEHEAD=/tmp/$(basename $PARTCLONEIMG).infohead |
---|
| 95 | COMPRESSOR=`file $PARTCLONEIMG | awk '{print $2}'` |
---|
| 96 | $COMPRESSOR -dc $PARTCLONEIMG 2>/dev/null | head > $FILEHEAD |
---|
| 97 | PARTCLONEINFO=$(LC_ALL=C partclone.info $FILEHEAD 2>&1) |
---|
| 98 | if `echo $PARTCLONEINFO | grep size > /dev/null` |
---|
| 99 | then |
---|
| 100 | FS=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); print toupper($8);}') |
---|
| 101 | echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024 |
---|
| 102 | IMGSIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{gsub(/\: /,"\n"); printf "%d\n", $11*FACTOR;}') |
---|
| 103 | else |
---|
[c28eefa] | 104 | echolog "Error: partclone.info no detecta la imagen" |
---|
[0109c07] | 105 | exit 5 |
---|
| 106 | fi |
---|
| 107 | [ "$FS" == "NTFS" ] && echo "Error: Todavia no podemos convertir imagenes de Windows" && exit 6 |
---|
| 108 | |
---|
| 109 | # Calculamos el espacio disponible en la particion de opengnsys. |
---|
[c28eefa] | 110 | echolog "[20]$MSG_SCRIPTS_CREATE_SIZE " |
---|
[0109c07] | 111 | for DIR in "/" "/opt" "/opt/opengnsys" "/opt/opengnsys/images" |
---|
| 112 | do |
---|
| 113 | AUXSIZE=$(df|grep $DIR$|awk '{print $3}') |
---|
| 114 | [ "$AUXSIZE" != "" ] && PARTSIZE=$AUXSIZE |
---|
| 115 | done |
---|
| 116 | let REQUIRESIZE=2*$IMGSIZE |
---|
| 117 | if [ $PARTSIZE -lt $REQUIRESIZE ]; then |
---|
[c28eefa] | 118 | echolog "No hay espacio suficiente para descomprimir y crear la imagen: $REQUIRESIZE." |
---|
[0109c07] | 119 | exit 16 |
---|
| 120 | fi |
---|
[c28eefa] | 121 | echolog "$REQUIRESIZE $PARTSIZE" |
---|
[0109c07] | 122 | |
---|
| 123 | # Descomprimimos la imagen de partclone. |
---|
[c28eefa] | 124 | echolog "[30] Descomprimimos la imagen de partclone." |
---|
[0109c07] | 125 | $COMPRESSOR -dc $PARTCLONEIMG | $PATHPARTCLONE/partclone.restore -C -s - -O $AUXIMG |
---|
| 126 | |
---|
| 127 | TIME2=$[SECONDS-TIME1] |
---|
[c28eefa] | 128 | echolog " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME2/60]m $[TIME2%60]s" |
---|
[0109c07] | 129 | |
---|
| 130 | # Montamos la imagen: |
---|
| 131 | mkdir -p $AUXDIR |
---|
| 132 | mount $AUXIMG $AUXDIR |
---|
| 133 | |
---|
| 134 | # Sincronizamos de la imagen del partclone a la del rsync. |
---|
[c28eefa] | 135 | echolog "[60] Sincronizamos desde la imagen de partclone a la de rsync." |
---|
[0109c07] | 136 | if [ "$TYPE" == "SYNC1" ]; then |
---|
| 137 | mkdir -p $RSYNCIMG |
---|
[c28eefa] | 138 | echolog " * Log temporal en: $TMPLOG" |
---|
| 139 | echolog "rsync -aHAX $AUXDIR/ $RSYNCIMG --- log: $TMPLOG" |
---|
[0109c07] | 140 | rsync -aHAXv $AUXDIR/ $RSYNCIMG >> $TMPLOG |
---|
| 141 | TIME3=$[SECONDS-TIME2] |
---|
[c28eefa] | 142 | echolog " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s" |
---|
[0109c07] | 143 | else |
---|
| 144 | IMGINFO="/tmp/ogimg.info$$" |
---|
| 145 | IMGDIR="$REPODIR/mount/$(basename $RSYNCIMG)" |
---|
| 146 | # Calculamos el tamaño de la imagen |
---|
| 147 | SIZE=$(df -k|awk -v P="$AUXDIR" '{if ($6==P) print $3}') |
---|
| 148 | # Creo fichero de informacion de la imagen |
---|
| 149 | echo "#$FSIMG:LZO:$FS:$SIZE" > $IMGINFO |
---|
| 150 | # Factor de compresion de la imagen |
---|
| 151 | [ "$FS" == "NTFS" ] && ZFACTOR=120 || ZFACTOR=110 |
---|
| 152 | [ "$FSIMG" == "BTRFS" ] && let ZFACTOR=$ZFACTOR-30 |
---|
| 153 | let SIZE=$SIZE*$ZFACTOR/100 |
---|
| 154 | |
---|
| 155 | # Creamos el fichero de la imagen vacio (queda montado) |
---|
[c28eefa] | 156 | echolog " * $MSG_HELP_ogCreateFileImage" |
---|
[0109c07] | 157 | $BINDIR/createfileimage $(basename $RSYNCIMG) img $SIZE || exit 5 |
---|
| 158 | touch $RSYNCIMG.img.lock |
---|
| 159 | TIME3=$[SECONDS-TIME2] |
---|
[c28eefa] | 160 | echolog " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s" |
---|
[0109c07] | 161 | |
---|
| 162 | # Sincronizo las imagenes antigua y nueva. |
---|
[c28eefa] | 163 | echolog " * Sincroniza las imagenes antigua y nueva. log temporal en: $TMPLOG" |
---|
| 164 | echolog "rsync -aHAX $AUXDIR/ $IMGDIR" |
---|
[0109c07] | 165 | rsync -aHAXv $AUXDIR/ $IMGDIR >> $TMPLOG |
---|
| 166 | TIME4=$[SECONDS-TIME3] |
---|
[c28eefa] | 167 | echolog " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME4/60]m $[TIME4%60]s" |
---|
[0109c07] | 168 | # copiamos el fichero de informacion dentro de la imagen. |
---|
| 169 | mv $IMGINFO $IMGDIR/ogimg.info |
---|
| 170 | # Desmontamos la imagen y la reducimos al minimo. |
---|
| 171 | $BINDIR/unmountimage $(basename $RSYNCIMG) img |
---|
[c28eefa] | 172 | echolog " * $MSG_HELP_ogReduceImage." |
---|
[0109c07] | 173 | rm $RSYNCIMG.img.lock |
---|
| 174 | $BINDIR/reduceimage $(basename $RSYNCIMG) img |
---|
| 175 | |
---|
| 176 | fi |
---|
| 177 | |
---|
| 178 | TIME=$[SECONDS-TIME1] |
---|
[c28eefa] | 179 | echolog " $MSG_SCRIPTS_END: $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s" |
---|