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 | # 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 | |
---|
49 | source $BASEDIR/client/etc/lang.$LANG.conf |
---|
50 | source $BASEDIR/lib/ogfunctions.sh |
---|
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. |
---|
93 | echolog "[10] Obtenemos datos del partclone." |
---|
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 |
---|
104 | echolog "Error: partclone.info no detecta la imagen" |
---|
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. |
---|
110 | echolog "[20]$MSG_SCRIPTS_CREATE_SIZE " |
---|
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 |
---|
118 | echolog "No hay espacio suficiente para descomprimir y crear la imagen: $REQUIRESIZE." |
---|
119 | exit 16 |
---|
120 | fi |
---|
121 | echolog "$REQUIRESIZE $PARTSIZE" |
---|
122 | |
---|
123 | # Descomprimimos la imagen de partclone. |
---|
124 | echolog "[30] Descomprimimos la imagen de partclone." |
---|
125 | $COMPRESSOR -dc $PARTCLONEIMG | $PATHPARTCLONE/partclone.restore -C -s - -O $AUXIMG |
---|
126 | |
---|
127 | TIME2=$[SECONDS-TIME1] |
---|
128 | echolog " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME2/60]m $[TIME2%60]s" |
---|
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. |
---|
135 | echolog "[60] Sincronizamos desde la imagen de partclone a la de rsync." |
---|
136 | if [ "$TYPE" == "SYNC1" ]; then |
---|
137 | mkdir -p $RSYNCIMG |
---|
138 | echolog " * Log temporal en: $TMPLOG" |
---|
139 | echolog "rsync -aHAX $AUXDIR/ $RSYNCIMG --- log: $TMPLOG" |
---|
140 | rsync -aHAXv $AUXDIR/ $RSYNCIMG >> $TMPLOG |
---|
141 | TIME3=$[SECONDS-TIME2] |
---|
142 | echolog " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s" |
---|
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) |
---|
156 | echolog " * $MSG_HELP_ogCreateFileImage" |
---|
157 | $BINDIR/createfileimage $(basename $RSYNCIMG) img $SIZE || exit 5 |
---|
158 | touch $RSYNCIMG.img.lock |
---|
159 | TIME3=$[SECONDS-TIME2] |
---|
160 | echolog " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s" |
---|
161 | |
---|
162 | # Sincronizo las imagenes antigua y nueva. |
---|
163 | echolog " * Sincroniza las imagenes antigua y nueva. log temporal en: $TMPLOG" |
---|
164 | echolog "rsync -aHAX $AUXDIR/ $IMGDIR" |
---|
165 | rsync -aHAXv $AUXDIR/ $IMGDIR >> $TMPLOG |
---|
166 | TIME4=$[SECONDS-TIME3] |
---|
167 | echolog " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME4/60]m $[TIME4%60]s" |
---|
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 |
---|
172 | echolog " * $MSG_HELP_ogReduceImage." |
---|
173 | rm $RSYNCIMG.img.lock |
---|
174 | $BINDIR/reduceimage $(basename $RSYNCIMG) img |
---|
175 | |
---|
176 | fi |
---|
177 | |
---|
178 | TIME=$[SECONDS-TIME1] |
---|
179 | echolog " $MSG_SCRIPTS_END: $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s" |
---|