summaryrefslogtreecommitdiffstats
path: root/server/bin/partclone2sync
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"