blob: 4272cf06d46b9ad263ce63eb4552c52cc2a64b0d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
#!/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.
source $BASEDIR/client/etc/lang.$LANG.conf
# 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.
echo [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
echo "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.
echo -n "[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
echo "No hay espacio suficiente para descomprimir y crear la imagen: $REQUIRESIZE."
exit 16
fi
echo "$REQUIRESIZE $PARTSIZE"
# Descomprimimos la imagen de partclone.
echo [30] Descomprimimos la imagen de partclone.
$COMPRESSOR -dc $PARTCLONEIMG | $PATHPARTCLONE/partclone.restore -C -s - -O $AUXIMG
TIME2=$[SECONDS-TIME1]
echo " $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.
echo "[60] Sincronizamos desde la imagen de partclone a la de rsync."
if [ "$TYPE" == "SYNC1" ]; then
mkdir -p $RSYNCIMG
echo " * Log temporal en: $TMPLOG"
echo rsync -aHAX $AUXDIR/ $RSYNCIMG --- log: $TMPLOG
rsync -aHAXv $AUXDIR/ $RSYNCIMG >> $TMPLOG
TIME3=$[SECONDS-TIME2]
echo " $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)
echo " * $MSG_HELP_ogCreateFileImage"
$BINDIR/createfileimage $(basename $RSYNCIMG) img $SIZE || exit 5
touch $RSYNCIMG.img.lock
TIME3=$[SECONDS-TIME2]
echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s"
# Sincronizo las imagenes antigua y nueva.
echo " * Sincroniza las imagenes antigua y nueva. log temporal en: $TMPLOG"
echo rsync -aHAX $AUXDIR/ $IMGDIR
rsync -aHAXv $AUXDIR/ $IMGDIR >> $TMPLOG
TIME4=$[SECONDS-TIME3]
echo " $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
echo " * $MSG_HELP_ogReduceImage."
rm $RSYNCIMG.img.lock
$BINDIR/reduceimage $(basename $RSYNCIMG) img
fi
TIME=$[SECONDS-TIME1]
echo " $MSG_SCRIPTS_END: $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s"
|