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