summaryrefslogtreecommitdiffstats
path: root/client/shared/scripts/ImagenesSincronizadas.lib
blob: 717d052dd3475d55af995dcf79ad211e18ef8a6c (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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
#!/bin/bash
#___________________________________________________________________
#
#@file    ImagenesSincronizadas.lib
#@brief   Librería o clase ImagenesSincronizadas
#@class   ImagenesSincronizadas
#@brief   Funciones para la creación y restauración de imagenes por sincronización.
#@version 1.0.4
#@warning License: GNU GPLv3+
#___________________________________________________________________

		#Load engine configurator from engine.cfg file.
		#Carga el configurador del engine desde el fichero engine.cfg
		[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg
		
		# Clear temporary file used as log track by httpdlog
		# Limpia los ficheros temporales usados como log de seguimieincludento para httpdlog
		echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND; echo " " > ${OGLOGCOMMAND}.tmp
		
		# Registro de inicio de ejecución
		#echo "[START Interface ] Run this command: $0 $*" | tee -a $OGLOGSESSION $OGLOGFILE
		echo "$MSG_INTERFACE_START $0 $*" | tee -a $OGLOGSESSION $OGLOGFILE
		
		# Solo ejecutable por OpenGnsys Client.
		PATH=$PATH:$(dirname $0)
		PROG=$(basename $0)

		#___________________________________________________________________
		#	
		# Variables globales
		#___________________________________________________________________

		TIPOPARTICION="$(ogGetPartitionId $DISCO $NPART)"; # Tipo de particion	
		if [ -z $TIPOPARTICION ]; then
		echo "No existe la partición $NPART, debe crearla" | tee -a $OGLOGSESSION $OGLOGFILE
		exit $OG_ERR_PARTITION
		fi

		PARTICION=$(ogMount $DISCO $NPART); # Monta partición	
		if [ -z $PARTICION ]; then
		echo "No existe la unidad /dev/sda$NPART o no está formateada" | tee -a $OGLOGSESSION $OGLOGFILE
		exit $OG_ERR_PARTITION
		fi

		SISTEMAFICHERO="$(ogGetFsType $DISCO $NPART)" # Sistema de ficheros	
		if [ -z $SISTEMAFICHERO ]; then
		echo "No se ha definido un sistema de fichero en la unidad /dev/sda$NPART. Debe formatearla previamente." | tee -a $OGLOGSESSION $OGLOGFILE
		exit $OG_ERR_PARTITION
		fi

		REPOSITORIO="opengnsys@$IPREPOSITORIO::ogimages" # Ruta de las imagenes en el repositorio
		
		FILE_ACL="ogwinimage.acl"

			
		# Envío de archivo completo
		OP_WHOLE="--whole"
		if [ $WHLFILE -eq 0 ]; then
			OP_WHOLE=""
		fi	
		
		# Borrar archivos en destino
		OP_DELETE="--delete"
		if [ $NOBORRACHIVOS -eq 1 ]; then
			OP_DELETE=""
		fi	
		if [ $RMVFILE -eq 0 ]; then
			OP_DELETE=""
		fi			

		# Opción de compresión
		OP_COMPRESS="-z"
		if [ $CMPFILE -eq 0 ]; then
			OP_COMPRESS=""
		fi			

		#___________________________________________________________________
		#
		# Fichero con la clave remota del rsync para el parámetro
		# "--password-file" para que no se pida ésta en el proceso.
		#___________________________________________________________________
		#
		FILE_PASSWD="--password-file=/scripts/passrsync"
	
	
	#___________________________________________________________________
	#
	#	Función: montaCache
	#
	#	Descripción:
	#
	#		Monta la cache y devuelve la ruta hacía ella
	#
	#	Parámetros:
	#	
	#		Ninguno
	#___________________________________________________________________
	#
	function montaCache()
	{	
		# Error si no existe caché
		if ! $(ogFindCache >/dev/null); then
			echo ""
			return
		fi
		cache=$(ogMountCache)
		echo $cache
	}
	#___________________________________________________________________
	#
	#	Función: editarLista
	#
	#	Descripción:
	#
	#		Edita lista de archivos a transferir para depurar lineas
	#
	#	Parámetros:
	#	
	#		$1 Lista de entrada
	#		$2 Lista de salida
	#___________________________________________________________________
	#
	function editarLista()
	{	
		# Edición: 
		#	a) Quitarle lineas que contengan './' 
		#	b) La primera linea (reporter del rsync)
		#	c) Las dos últimas lineas del final (reporter del rsync)
		
		echo "Editando lista de archivos Entrada:$1 Salida:$2" | tee -a $OGLOGSESSION $OGLOGFILE
		cat $1 | sed '/\.\//d' | sed '1d' | sed -n -e :a -e '1,2!{P;N;D;};N;ba'>$2

		# Otra forma
		#sed -i -e s/"^sent.*.bytes\/sec"//g -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g $IMGINFO
		#sed -i  '/^\.\//d' $IMGINFO

	}	
	
	#___________________________________________________________________
	#
	#	Función: crearImagen
	#
	#	Descripción:
	#
	#		Sincroniza archivos entre origen y destino. Al final del
	#		proceso el contenido de destino será igual al de origen.
	#		La creación de imagen siempre tiene lugar entre una partición
	#		y un repositorio como origen y destino respectivamente.
	#
	#	Parámetros:
	#	
	#		$1: Origen
	#		$2: Destino
	#		$3: Sistema de ficheros de la partición
	#		$4: Indica si la sincronización es local o remota
	#				1: El origen o el destino es remoto
	#				2: Tanto el origen como el destino son locales
	#		$5: Vale 
	#				1=Para crear la lista de archivos a transferir
	#				2= Cuando se quiere sincronizar usando la lista
	#		$6: Path a la lista de archivos 
	#___________________________________________________________________
	#
	function crearImagen()
	{
		case "$3" in 
			NTFS)
				OP_ARCHIVO="-aH"
				rm "$1pagefile.sys"
				#OP_EXCLUDE="--exclude 'pagefile.sys'"
			;;
			 EXT2 | EXT3 | EXT4 )
				OP_ARCHIVO="-alH"
				OP_EXCLUDE="--exclude 'tmp' --exclude 'proc' --exclude 'sys'"
			;;
		esac


		case "$4" in 
			1)
				OP_PASSWD=$FILE_PASSWD
			;;
			2)
				OP_PASSWD=""
			;;
		esac
		
		FREG=$OGLOGCOMMAND # Por defecto se redirecciona al archivo de log de comandos	
		case "$5" in 
			1)
				OP_ARCHIVO=$OP_ARCHIVO"nv" # Simulación para crear lista
				FREG=$6
			;;
			2)
				OP_FILELIST="--files-from=$6"
				OP_ARCHIVO="$OP_ARCHIVO $OP_FILELIST"
			;;
		esac

		echo "rsync $OP_ARCHIVO $OP_COMPRESS $OP_DELETE $OP_EXCLUDE $OP_PASSWD $1 $2 " | tee -a $OGLOGSESSION $OGLOGFILE
		rsync $OP_ARCHIVO $OP_COMPRESS $OP_DELETE $OP_EXCLUDE $OP_PASSWD $1 $2>$FREG;
	}
	
	#___________________________________________________________________
	#
	#	Función: restaurarImagen
	#
	#	Descripción:
	#
	#		Sincroniza archivos entre origen y destino. Al final del
	#		proceso el contenido de destino será igual al de origen.
	#		La restauración de imagen siempre tiene lugar entre la caché
	#		o un repositorio y una partición o carpeta como origen y destino
	#		respectivamente.
	#
	#	Parámetros:
	#	
	#		$1: Origen
	#		$2: Destino
	#		$3: Sistema de ficheros de la partición
	#		$4: Indica si la sincronización es local o remota
	#			1: El origen o el destino es remoto
	#			2: Tanto el origen como el destino son locales
	#___________________________________________________________________
	#
	function restaurarImagen()
	{
		case "$3" in 
			NTFS)
				OP_ARCHIVO="-aH"
			;;
			EXT2 | EXT3 | EXT4)
				OP_ARCHIVO="-alH"
			;;
		esac
		
		case "$4" in 
			1)
				OP_PASSWD=$FILE_PASSWD
			;;
			2)
				OP_PASSWD=""
			;;
		esac
		
		echo "rsync $OP_ARCHIVO $OP_COMPRESS $OP_DELETE $OP_PASSWD $1 $2" | tee -a $OGLOGSESSION $OGLOGFILE
		rsync $OP_ARCHIVO $OP_COMPRESS $OP_DELETE $OP_PASSWD $1 $2>$OGLOGCOMMAND;
	}
	
	#___________________________________________________________________
	#
	#	Función: crearListaAcl
	#
	#	Descripción:
	#
	#		Crea la lista de control de archivos para el sistema operativo
	#		que ocupa la partición que se quiere clonar
	#
	#	Parámetros:
	#	
	#		$1: Origen
	#		$2: Destino
	#		$3: Sistema de ficheros de la partición
	#		$4: disco
	#		$5: partición
	#___________________________________________________________________
	#
	function crearListaAcl()
	{
		case "$3" in 
			NTFS)
				echo "Creando lista de control de acceso a ficheros para el sistema windows de la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE
				echo "Desmontando la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE
				ogUnmount $4 $5 | tee -a $OGLOGSESSION $OGLOGFILE
				echo "Ejecutando comando ntfs-3g.secaudit -b /dev/sda$5 /" | tee -a $OGLOGSESSION $OGLOGFILE
				ntfs-3g.secaudit -b /dev/sda$5 / > /tmp/$FILE_ACL
				echo "Montando de nuevo la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE				
				ogMount $4 $5
				echo "Copiando archivo de listas de control (ACL) desde /tmp/$FILE_ACL a $1." | tee -a $OGLOGSESSION $OGLOGFILE				
				cp /tmp/$FILE_ACL $1.
			;;
		esac
	}	
	#___________________________________________________________________
	#
	#	Función: restauraListaAcl
	#
	#	Descripción:
	#
	#		Restaura la lista de control de archivos para el sistema operativo
	#		que ocupa la partición que se quiere restaurar
	#
	#	Parámetros:
	#	
	#		$1: Origen
	#		$2: Destino
	#		$3: Sistema de ficheros de la partición
	#		$4: disco
	#		$5: partición
	#___________________________________________________________________
	#
	function restauraListaAcl()
	{
		case "$3" in 
			NTFS)
				echo "Restaurando lista de control de acceso a ficheros para el sistema windows de la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE	
				echo "Copiando archivo de listas de control (ACL) desde $2$FILE_ACL a /tmp/." | tee -a $OGLOGSESSION $OGLOGFILE				
				cp $2$FILE_ACL /tmp/.
				echo "Desmontando la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE
				ogUnmount $4 $5 | tee -a $OGLOGSESSION $OGLOGFILE
				echo "Ejecutando comando ntfs-3g.secaudit -se /dev/sda$5 /" | tee -a $OGLOGSESSION $OGLOGFILE
				ntfs-3g.secaudit -se /dev/sda$5 /tmp/$FILE_ACL
				echo "Montando de nuevo la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE				
				ogMount $4 $5
				echo "Borrando archivo de listas de control (ACL) de $2$FILE_ACL" | tee -a $OGLOGSESSION $OGLOGFILE				
				rm $2$FILE_ACL
			;;
		esac
	}	
	#___________________________________________________________________
	#
	#	Función: eliminaListaAcl
	#
	#	Descripción:
	#
	#		Elimina la lista de control de archivos creada temporalmente
	#		para el proceso de creación e imagen
	#
	#	Parámetros:
	#	
	#		$1: Origen
	#		$2: Sistema de ficheros de la partición
	#___________________________________________________________________
	#
	function eliminaListaAcl()
	{
		case "$2" in 
			NTFS)
				echo "Borrando archivo de listas de control (ACL) de $1$FILE_ACL" | tee -a $OGLOGSESSION $OGLOGFILE				
				rm $1$FILE_ACL
			;;
		esac
	}	
	#___________________________________________________________________
	#
	#	Función: comprimeImagen
	#
	#	Descripción:
	#
	#		Comprimer  la carpeta donde está se ha almacenado la imagen 
	#		recientemente creada
	#
	#	Parámetros:
	#	
	#		$1: Nombre de la imagen (Es el mismo que la carpeta que la alberga)
	#___________________________________________________________________
	#
	function comprimeImagen()
	{
		TIME1=$SECONDS
		RUTAIMG="/opt/opengnsys/images"
		CARPETAIMAGEN=$RUTAIMG/$1
		echo "Comprimiendo la imagen $1. Ruta de la imagen: $RUTAIMG" | tee -a $OGLOGSESSION $OGLOGFILE		
		echo "find $CARPETAIMAGEN | cpio -H newc -oa | gzip -9c  en $CARPETAIMAGEN.IMG"  | tee -a $OGLOGSESSION $OGLOGFILE		
		find $CARPETAIMAGEN | cpio -H newc -oa | gzip -9c > $CARPETAIMAGEN.IMG
		TIME=$[SECONDS-TIME1]
		echo "[100] $MSG_SCRIPTS_TIME_TOTAL $[TIME/60]m $[TIME%60]s" | tee -a $OGLOGSESSION $OGLOGFILE
	}